Day zero: seven incidents, ten days, and what AI changes
PHP2Shell, GitLab, Node.js, QUIC, LiteLLM, Railway and OpenCode, read from the primary sources, with the evidence on AI, open models and pausing the frontier.
CybersecurityAman SinghOctober 202617 min read
Contents
- The short version
- PHP2Shell: the one AI found
- Node.js and GitLab: old bug classes, fast diffs
- Node.js
- GitLab
- QUIC: a steady drip, not a storm
- LiteLLM, Railway and OpenCode: the keys
- LiteLLM
- Railway
- OpenCode
- The clock
- What AI changes, and what it does not
- Open models, chips and the pause question
- How close are open models?
- The chip claim
- Would pacing the frontier help?
- How the attacks line up
- What to do
- The first hour for any critical disclosure
- If a vendor says your secrets may be exposed
- If a package or image you use was compromised
- Standing controls
- Sources
Contents
- The short version
- PHP2Shell: the one AI found
- Node.js and GitLab: old bug classes, fast diffs
- Node.js
- GitLab
- QUIC: a steady drip, not a storm
- LiteLLM, Railway and OpenCode: the keys
- LiteLLM
- Railway
- OpenCode
- The clock
- What AI changes, and what it does not
- Open models, chips and the pause question
- How close are open models?
- The chip claim
- Would pacing the frontier help?
- How the attacks line up
- What to do
- The first hour for any critical disclosure
- If a vendor says your secrets may be exposed
- If a package or image you use was compromised
- Standing controls
- Sources
Between 12 and 22 October 2026, seven security stories hit software and platforms that a lot of people run. PHP had two critical flaws with a leaked fix. GitLab shipped a second maximum-severity patch in ten days. Node.js fixed ten bugs in one release, and an LLM gateway called LiteLLM published a poisoned version of itself. Railway and OpenCode lost customers' stored keys. QUIC, the protocol under HTTP/3, kept collecting bugs.
The easy story is that AI is behind all of it. I read the primary sources for every item to see how much of that holds up. For PHP2Shell it holds up. For most of the rest, I found no source that shows it.
- Reported. A named primary source states it, with the source cited. A vendor describing its own product or its own breach is still that vendor's account.
- Claimed. One party says it and nobody confirmed it.
- Our analysis. My reading. The ATT&CK mapping, the 0 to 5 scores in the first chart and the section on pausing frontier AI are mine.
The research behind this is dated 23 October 2026. Several of these stories are two days old, so treat anything marked Claimed as open.
The short version
I do not read this as one wave. At least four different kinds of event landed in the same ten days: a memory-corruption bug in a language runtime, bugs in a regex engine and a decoder, a hijacked release pipeline, and two stolen-secret breaches. No source I read ties them to one actor. Railway says its breach is separate from PHP2Shell1.
Two things do hold across the set. Attackers now turn a patch into a working exploit faster than most teams roll the patch out. And the three credential breaches all took keys: AI-provider keys, cloud roles and CI tokens that someone stored in a place that got breached.
| Item | What it is | Disclosed | AI-found? | Exploited? |
|---|---|---|---|---|
| PHP2Shell | Pre-auth RCE and memory disclosure in PHP core, CVE-2026-109618 and 109619 | 21 Oct | Yes, per three teams | Attempts from 17 Oct, no confirmed compromise published |
| Node.js | Brotli decoder write, CVE-2026-111497, plus nine more | 21 Oct | Credited to an AI security product, method unstated | Public PoC, unreliable; none in the wild reported |
| GitLab | Regex integer overflow, CVE-2026-110264, CVSS 10.0 | 21 Oct | No source says so | None reported for this one; two earlier GitLab CVEs were |
| QUIC | QPACK exhaustion in 7 of 10 HTTP/3 stacks; two MsQuic RCE-class CVEs | 20 Oct and earlier | No source says so | None reported |
| LiteLLM | Poisoned release 1.107.0, no CVE | 21 Oct | Not applicable | Stolen cloud credentials tested within hours |
| Railway | Environment-variable stores accessed | 21 Oct | No evidence of attacker AI | Yes, that is the incident |
| OpenCode | Console key store breached, separate agent bugs | 16 to 18 Oct | No evidence of attacker AI | Yes, charges up to about $1,700 reported |
Seven incidents, six axes
| Exposure | Remote reach | Exploited | AI-found | Secrets | Fix ready | |
|---|---|---|---|---|---|---|
| Software bugs | ||||||
| PHP2Shell | 5 | 5 | 3 | 5 | 3 | 4 |
| Node.js | 4 | 3 | 1 | 3 | 1 | 4 |
| GitLab | 2 | 4 | 1 | 0 | 3 | 5 |
| QUIC | 4 | 2 | 1 | 0 | 0 | 3 |
| Credential breaches | ||||||
| LiteLLM | 3 | 4 | 5 | 0 | 5 | 4 |
| Railway | 2 | 3 | 5 | 0 | 5 | 2 |
| OpenCode | 1 | 3 | 5 | 1 | 4 | 2 |
The grid scores the same seven rows. The three credential breaches sit high on "exploited" and "secrets" and at or near zero on "AI-found". PHP2Shell is the only row that is high on both exposure and AI-found.
PHP2Shell: the one AI found
PHP's two CVEs came out on 21 October. CVE-2026-109618 is memory corruption triggered by running out of memory during a crafted multipart/form-data request2. CVE-2026-109619 is stale state left over between requests, which the next request on the same worker then reuses3. On Apache mod_php, PHP says an unauthenticated request can trigger the attack before any application code runs4. PHP scores it CVSS v4.0 9.2, and it runs on roughly 69% of sites whose server language is known5.
This is the one case where AI discovery is documented. Calif6 started auditing PHP on 30 July and reported an RCE on 11 August. OpenAI reported the same root cause the same day, independently7. Wiz found its first bug on 19 August with its Atlas research agent plus Gemini 4 Argon and GPT-5.6 Sol8. Two AI-assisted teams landing on the same bug in the same fortnight suggests it was findable by anyone with the same tools.
The disclosure then fell apart. The CVE IDs leaked on 20 October with the wrong score. A proof-of-concept video went out that evening, and Chainguard published patched images about six hours before the coordinated release, so anyone could diff them7. Amazon's honeypot had already seen an exploit attempt on 17 October, four days early. Amazon says it is unclear whether any attempt worked, and does not tie the attempts to AI9.
The bug had also been seen before. A core developer noticed the first signs of the memory problem in 2024, during a security audit. Competing fixes stalled over compatibility and resourcing, and the PHP Foundation now calls the delay "a structural failure"7. After release, open issues on the fix itself include hard-exit crashes on large allocations and a claim that state resets too late on the upload-progress path. Maintainers had not responded when I checked2.
The half defenders underrate is the memory disclosure. Wiz describes a bug that leaks heap memory, including other users' passwords and tokens, back through an oversized session cookie8. JPCERT/CC warns that attacks may leave no trace in logs10. If a host was exposed, I would treat every secret that passed through it as read, not only the ones stored on disk.
Governments agreed on the instruction and split on the facts. CISA said it had not observed exploitation11, NCSC New Zealand said it was aware of reports of active exploitation12, and several European governments took sites offline as a precaution13. The UK's NCSC advised considering taking affected systems offline14, and Australia's ACSC said it was not aware of successful active exploitation at home15. The statements can all be true. "Not observed" means a confirmed compromise. "Aware of reports" counts honeypot attempts.
Where governments reacted
- Advisory issued
- Sites taken offline
- Exploitation attempts reported
Data table: Where governments reacted
| Country | Response | Detail |
|---|---|---|
| New Zealand | Exploitation attempts reported | NCSC NZ: aware of reports of active exploitation |
| Singapore | Exploitation attempts reported | CSA: widespread exploitation attempts |
| Netherlands | Sites taken offline | Government sites taken offline preventively, including DigiD |
| Denmark | Sites taken offline | Government sites taken offline (Reuters factbox) |
| Finland | Sites taken offline | Government sites taken offline (Reuters factbox) |
| France | Sites taken offline | Government sites taken offline (Reuters factbox) |
| Australia | Sites taken offline | cyber.gov.au, ABS and Jobs and Skills Australia taken offline |
| United States | Advisory issued | CISA: patch now, no exploitation observed. Not in the catalog on 21 Oct |
| United Kingdom | Advisory issued | NCSC UK: consider taking systems offline |
| Canada | Advisory issued | Cyber Centre AL26-026: PoC available, no active exploitation identified |
| Germany | Advisory issued | BSI: patch immediately |
| Japan | Advisory issued | JPCERT/CC: attacks may leave no trace in logs |
Node.js and GitLab: old bug classes, fast diffs
Node.js
The 21 October release fixed ten CVEs across 26.12.1, 24.22.1 and 22.23.4, four of them rated High. There are no CVSS scores and no workaround16. The worst is CVE-2026-111497, an out-of-bounds write in the Brotli decoder bundled inside Node that nodejs.org says permits remote code execution. Because the decoder ships inside Node, updating your operating system's Brotli package does nothing. It is reachable through fetch(), through Express 5 request-body decoding and through node:zlib. Node 20 and 25 are end of life and get no fix.
nodejs.org credits "OpenAI Codex Security" as the reporter. Imperva and two other outlets name a different person, who nodejs.org lists as the fixer, and I trust the advisory16. No source says how Codex Security found the bug. "Reported by an AI security product" is documented. "Found by an LLM" is a reasonable inference.
Imperva published a PoC the next day that ran code on stock Node 24.22.0 on Linux arm64, though not on every attempt17. Aikido says the first public PoC needed a deliberately weakened build18. I read that as a lab result on one platform, not a reliable remote exploit.
Node's ecosystem had a separate problem all quarter. Since August, npm worm campaigns that began with the compromise of a single popular maintainer have reached more than 400 packages. They steal AI-tool credentials and plant Claude Code and editor hooks so the malware survives a cleanup19.
GitLab
GitLab's 21 October patch fixed CVE-2026-110264, an integer overflow in the Onigmo regular-expression compiler. It is unauthenticated, CVSS 10.0, affects Community and Enterprise editions from 7.0, and has no workaround20. GitLab.com is already patched.
The trap is the version number. Servers patched on the 12 October build fixed a sibling bug, CVE-2026-97229, and are still vulnerable to this one. "We patched last week" is not an answer21. One HackerOne researcher reported all four regex-engine RCEs in about a month. No source says whether that researcher used AI.
GitLab is also the cleanest example of speed without any documented AI. CVE-2026-85706 went into CISA's Known Exploited Vulnerabilities catalog one day after its 10 September patch22. Rapid7 published a working PoC for 97229 four days after the 12 October release23. That speed came from public advisories and patch diffs.
QUIC: a steady drip, not a storm
QUIC has a real stream of bugs and no link I could find to PHP2Shell or to AI.
FoxIO's "Header Accordions" research, published on 20 October, found QPACK memory exhaustion in 7 of 10 HTTP/3 stacks. It is denial of service only, a public PoC exists, and nobody reported exploitation24. quic-go, quiche and lsquic are fixed. Bun, h3 and aioquic were unpatched at disclosure. ngtcp2, Google's quiche and IIS are not affected.
The more serious bugs are in Microsoft's MsQuic: CVE-2026-62815 (use-after-free, 11 August) and CVE-2026-105016 (heap overflow, 13 October), both unauthenticated, both CVSS 9.82526. nginx has fixed four HTTP/3 CVEs this year27. curl's QUIC denial of service, CVE-2026-11352, came from a handle belonging to an AI security lab, though curl does not say AI was used28. For nginx and for HAProxy's HTTP/3 request smuggling bug, the stopgap is to turn HTTP/3 off, after you check that TCP fallback carries your real traffic. This is the least verified section here. I did not read NVD or any CISA advisory for these items.
LiteLLM, Railway and OpenCode: the keys
LiteLLM
On 21 October, litellm==1.107.0 appeared on PyPI and in the latest and main-stable Docker tags. It was built from a lookalike repository, Berri-AI/litellm, one hyphen from the real one, using stolen GitHub CLI tokens from three engineers29. The release pipeline then published it with valid provenance, so signature checks passed.
The payload runs on any Python start, even if you never import litellm. It steals cloud, SSH, browser and AI-tool credentials, and the provider keys stored in a proxy database. Wiz watched stolen AWS role credentials get tested about 4.5 hours later, with Bedrock model listing30. The PyPI package was live for about an hour and forty minutes. The safe version is 1.106.2.
LiteLLM says the tokens may have leaked into logs of an internet-exposed internal deployment, and that Claude Code can embed a user's GitHub CLI token in response bodies that end up in logs29. That is LiteLLM's own theory and the entry point is unconfirmed. This is also the second poisoning this year. In March, 1.82.7 and 1.82.8 went out through a compromised Trivy scanner in CI31. Datadog says no link between the two has been established32.
Separately, a pre-auth SQL injection, CVE-2026-42208, was exploited about 36 hours after it was listed, and the attacker went straight for the tables holding virtual keys and provider credentials33. A gateway that stores every provider key is an obvious target.
Railway
On 21 October, Railway detected anomalous activity on the systems that store customer environment variables. It says a third party may have accessed encrypted variables and, for some customers, obtained decrypted values34. It paused builds, invalidated OAuth sessions and every API token, rotated bucket credentials and paused signups. It tells every customer to rotate all secrets without waiting to learn whether they were affected.
Railway believes this is part of a series of attacks on platform companies aimed at AI inference providers. That is its own belief and nobody has verified it. A researcher claims about $371,000 in wallet funds was drained from keys stored there. I could not confirm that. The attacker, the entry point and the count of affected accounts are unknown, and a postmortem is promised1.
OpenCode
OpenCode says a legacy system it was decommissioning was breached between 16 and 18 October, and that provider keys saved in workspaces for 1.4% of Console users may have leaked. Users reported charges from hundreds of dollars up to about $1,70035. "Distillation attack" is OpenCode's own label, with no evidence published. No attacker is named.
The co-founder says defenders "need agents going 24/7" and that frontier models used in the investigation started refusing until a defender tier became available35. Both are vendor statements. No forensic evidence shows the attackers used AI. Separately, the OpenCode agent had a CVSS 9.8 remote-code bug on Windows through a malicious MCP server, patched on 28 September with no CVE and no advisory, which a scanner that keys on CVEs would miss36.
Railway and OpenCode have not said how the attackers got in. OpenCode's own account, a system being decommissioned that still held customers' keys, reads to me as decommissioning debt.
The clock
Most of the activity bunched into 21 October. PHP2Shell is the long lane, because exploitation attempts started four days before the fix.
Twelve to 22 October on one clock
- PHP2Shell
- Node.js
- GitLab
- QUIC
- LiteLLM
- Railway
- OpenCode
Data table: Twelve to 22 October on one clock
| Incident | When | Event |
|---|---|---|
| OpenCode | 17 Oct 00:30 UTC | Earliest possible key exposure in the Console breach |
| OpenCode | 18 Oct, date only | Breach disclosed to users (date only) |
| Railway | 21 Oct 08:28 UTC | Investigating anomalous activity |
| Railway | 21 Oct 20:30 UTC | OAuth sessions invalidated |
| Railway | 21 Oct 22:10 UTC | Public security notice |
| Railway | 22 Oct 04:39 UTC | All API tokens invalidated |
| LiteLLM | 21 Oct 10:08 UTC | Branch protection overridden by a stolen credential |
| LiteLLM | 21 Oct 11:39 UTC | 1.107.0 uploaded to PyPI |
| LiteLLM | 21 Oct 13:23 UTC | PyPI package pulled |
| QUIC | 13 Oct, date only | MsQuic CVE-2026-105016 heap overflow (date only) |
| QUIC | 14 Oct, date only | nginx 1.31.7 and 1.30.6 fix HTTP/3 body injection (date only) |
| QUIC | 20 Oct, date only | FoxIO publishes Header Accordions with a PoC (date only) |
| GitLab | 12 Oct, date only | 19.4.2 fixes CVE-2026-97229 (date only) |
| GitLab | 16 Oct, date only | Rapid7 publishes a PoC for 97229 (date only) |
| GitLab | 21 Oct, date only | 19.5.1 fixes CVE-2026-110264, CVSS 10.0 (date only) |
| Node.js | 21 Oct, date only | Ten CVEs fixed, Brotli RCE worst (date only) |
| Node.js | 22 Oct, date only | Imperva publishes an unreliable PoC (date only) |
| PHP2Shell | 17 Oct, date only | First exploit attempt, Amazon honeypot (date only) |
| PHP2Shell | 20 Oct 15:00 UTC | CVE IDs leak with the wrong score |
| PHP2Shell | 20 Oct 19:30 UTC | PHP posts its advance notice |
| PHP2Shell | 21 Oct 02:00 UTC | Several actors start sending attempts |
| PHP2Shell | 21 Oct 07:41 UTC | Chainguard ships patched images six hours early |
| PHP2Shell | 21 Oct 13:30 UTC | Patched releases go live |
| PHP2Shell | 21 Oct 14:19 UTC | watchTowr reports exploitation attempts |
| PHP2Shell | 22 Oct 03:46 UTC | ELLIO sees delivery attempts: booter, ASPX shell, Go RAT |
The sharper question is how long the gap is between a patch and a working exploit. The numbers below do not all measure the same thing, so read the colours. The fastest is a lab measurement with a model most attackers cannot use. The in-the-wild numbers run from hours to days.
Patch to exploit, in hours
- PHP2Shell
- Node.js
- GitLab
- LiteLLM
- Seen in the wild or before disclosure
- Outline: lab test or public PoC
Data table: Patch to exploit, in hours
| Event | Hours | Kind | Note |
|---|---|---|---|
| PHP2Shell, attempt pre-disclosure | -96 | Attempt before disclosure | Amazon honeypot, 17 Oct, four days before 21 Oct. Amazon does not say any attempt worked. |
| Firefox patch to exploit (lab) | 1 | Lab measurement | Anthropic's lab test, 18 patches, standalone JS shell. A model most attackers cannot use. |
| LiteLLM stolen creds tested | 4.5 | Seen in the wild | Wiz, after exfiltration from the 1.107.0 payload. |
| GitLab 85706 to CISA list | 24 | Seen in the wild | Patched 10 Sep, listed 11 Sep as exploited. |
| Node.js Brotli to public PoC | 24 | Public PoC | Imperva PoC, unreliable, one platform tested. |
| LiteLLM SQLi to exploitation | 36 | Seen in the wild | Sysdig honeypot data. |
| GitLab 19478 to honeypot hits | 48 | Seen in the wild | watchTowr, single source. |
| GitLab 97229 to Rapid7 PoC | 96 | Public PoC | 12 Oct patch, 16 Oct write-up. |
What AI changes, and what it does not
The best-evidenced change is on n-days, the bugs that already have a public patch. Anthropic reports that its Mythos Preview model turned Firefox patches into a first working exploit in under an hour, 18 days before the fix shipped to users. On Windows it built eight full privilege-escalation chains for about $2,000 each, before most devices had patched37. That is vendor-run, on small samples, with a model attackers cannot use. It is the best measurement I found.
Evidence that AI-found bugs get exploited more is weak. VulnCheck counted 14 confirmed exploited out of 1,061 AI-attributed bugs, 1.3%38. The same analysis found only 126 published CVEs against the 23,019 issues Anthropic's Glasswing program reported39. Most AI-found bugs are not patched or published yet.
Attackers do use models. Google's threat group reports one probable AI-built criminal zero-day, a two-factor bypass, attributed from code artefacts and not from logs40. Anthropic documents agentic intrusions, including credential theft across about 200 downstream organisations in 34 hours41. Both vendors say nothing in those cases was technically new, and each sees only its own platform.
The cost lands on maintainers. The PHP Foundation has published 15 CVEs since 1 July and worked through more than 100 reports that were invalid, duplicates or not reproducible7. It does not say how many were written by AI. Anthropic itself calls maintainers "a major bottleneck"39.
My reading: attackers can win by diffing patches faster than you roll them out, with or without a model. GitLab shows it with no model in the story. The odd detail in PHP2Shell is that AI-assisted defenders found the bug about two months before disclosure. The embargo failed anyway, and probing started before release. Finding the bug early did not buy time. The embargo leaked three ways.
Open models, chips and the pause question
How close are open models?
Three independent estimates put the best open-weight model on cyber tasks between 3 and 7 months behind the closed frontier. NIST's CAISI says about 4 months42. The UK's AI Security Institute says 4 to 5 months on narrow tasks and about 7 on a long multi-step range43. Epoch AI says 6 to 744. They measure different things, so I did not average them.
How far behind are open models on cyber?
- Independent estimate
- Outline: the lab's own claim
Data table: How far behind are open models on cyber?
| Source | Months behind the closed frontier |
|---|---|
| NIST CAISI, cyber (Sep) | 4 |
| UK AISI, narrow tasks (Jul) | 4 to 5 |
| UK AISI, 32-step range (Jul) | 7 |
| Epoch, cyber (16 Oct) | 6 to 7 |
| Epoch, general (May) | 4 |
| DeepSeek's own V4 report | 3 to 6 |
The strongest open cyber model any of them tested is Zhipu's GLM-5.3. On short exploit tasks it gets close. On long ones it falls far behind.
On one Anthropic benchmark, GLM-5.3 built 50 working exploits in 410 attempts, against 56 for Anthropic's Mythos Preview and none for the previous open model45. Anthropic makes the closed model in that comparison, so read it next to CAISI's wider gaps.
GLM-5.3 against the best US model
- GLM-5.3, open weights
- Best US model
Data table: GLM-5.3 against the best US model
| Measure | GLM-5.3 (percent) | Best US model (percent) | Source |
|---|---|---|---|
| SEC-Bench Pro | 40.4 | 90.2 | CAISI |
| ExploitBench, CAISI | 61.1 | 100 | CAISI |
| ExploitGym | 9.4 | 44.4 | CAISI |
| OSS-Fuzz (private) | 7.7 | 23.2 | CAISI |
| ExploitBench, Anthropic | 12.2 | 13.7 | Anthropic |
Safeguards are thin on open weights. Anthropic stripped GLM-5.3's refusals for about $4,400 of GPU time and estimates an experienced team could do it for about $1,20045. That is a self-published test, and CAISI did not reproduce the bypass numbers.
The chip claim
You will see "trained on their own chips" said about Chinese labs. I could not verify it. For GLM-5, training on Huawei Ascend traces back to the company, relayed by secondary outlets, while the technical report documents adapting inference to domestic chips45. DeepSeek's V4 report is silent on training hardware, and a US official's smuggling allegation is unproven46. Bloomberg, through anonymous sources, reports Kimi K3 trained on a 20,000-chip Nvidia cluster rented through Alibaba47.
Chips: who has the compute
Data table: Chips: who has the compute
| Source | Millions of H100-equivalents |
|---|---|
| Nvidia, 2026 | 23 |
| Huawei Ascend, 2026 | 0.9 |
| Smuggled Nvidia, to 2025 | 0.66 |
Epoch puts Huawei's 2026 compute under 4% of Nvidia's48, and estimates a median of 660,000 H100-equivalents were smuggled into China through 2025. My summary is that Chinese labs run a mix. Nvidia hardware, legal or grey-market or rented, does the biggest training runs, and domestic chips take on more inference and some training. A pure-domestic frontier run is possible but unproven.
Would pacing the frontier help?
I do not think it would help much. Weak incentives are only one of the reasons.
- Coordination does not exist. China called slowdown calls fearmongering, and the US administration said it would oppose any scheme to control AI49. Verification is unsolved, and Lawfare notes that the harder the US pushes to suppress Chinese AI, the less reason China has to accept pacing50.
- Open weights cannot be recalled. GLM-5.3 has been out since late August. A pause on future training does not undo it.
- The bottleneck is not discovery. Patch deployment, maintainer triage and the unpatched long tail decide outcomes, and a training pause touches none of them.
- Defenders benefit too. AI-assisted researchers found PHP2Shell before attackers shipped anything.
Two points cut the other way. A slowdown plausibly delays the next capability jump by about the 4 to 7 month lag, if Chinese labs are partly compute-bound, and the chip data says they are. And the pause is not one thing: stopping training, restricting access and stopping open-weight releases are different policies, and only the last matters much for cyber. The "Pacing the Frontier" letter asked for tools to pace development internationally, not a unilateral stop51. Nobody has measured the effect of any slowdown or export control on cyber outcomes, so all of this is capability data plus argument.
How the attacks line up
MITRE publishes no ATT&CK mapping for these events, so the grouping below is mine. Exploiting a public application is the common way in for the software bugs, and stored credentials are where nearly everything else ends up.
Which incident used which technique
PHP2Shell
- Exploit public app, main route
- Shell execution, secondary route
- Web shell, hooks, secondary route
- Credentials in files, secondary route
- Denial of service, secondary route
Node.js
- Exploit public app, main route
- Shell execution, secondary route
GitLab
- Exploit public app, main route
- Credentials in files, secondary route
QUIC
- Denial of service, main route
- Exploit public app, secondary route
LiteLLM
- Supply chain, main route
- Credentials in files, main route
- Resource hijacking, main route
- Exploit public app, secondary route
- Valid accounts, secondary route
Railway
- Valid accounts, main route
- Credentials in files, main route
- Resource hijacking, secondary route
OpenCode
- Valid accounts, main route
- Credentials in files, main route
- Resource hijacking, main route
Data table: Which incident used which technique
| Incident | Technique | Weight (2 main route, 1 secondary) |
|---|---|---|
| PHP2Shell | Exploit public app | 2 |
| PHP2Shell | Shell execution | 1 |
| PHP2Shell | Web shell, hooks | 1 |
| PHP2Shell | Credentials in files | 1 |
| PHP2Shell | Denial of service | 1 |
| Node.js | Exploit public app | 2 |
| Node.js | Shell execution | 1 |
| GitLab | Exploit public app | 2 |
| GitLab | Credentials in files | 1 |
| QUIC | Exploit public app | 1 |
| QUIC | Denial of service | 2 |
| LiteLLM | Supply chain | 2 |
| LiteLLM | Exploit public app | 1 |
| LiteLLM | Credentials in files | 2 |
| LiteLLM | Resource hijacking | 2 |
| LiteLLM | Valid accounts | 1 |
| Railway | Valid accounts | 2 |
| Railway | Credentials in files | 2 |
| Railway | Resource hijacking | 1 |
| OpenCode | Valid accounts | 2 |
| OpenCode | Credentials in files | 2 |
| OpenCode | Resource hijacking | 2 |
Provider keys feed one outcome all the credential breaches share, which is inference billing abuse. Cloud roles feed cloud enumeration. CI and Git tokens feed more poisoned packages, which is how a worm spreads.
From stolen secret to abuse
AI provider keys
Taken from
- Railway env vars, 3 sources
- OpenCode Console, 4 sources
- LiteLLM 1.107.0, 2 sources
- LiteLLM proxy DB (SQLi), 2 sources
- npm worms, 1 source
Led to
- Inference billing abuse
Cloud roles
Taken from
- Railway env vars, 1 source
- LiteLLM 1.107.0, 3 sources
Led to
- Cloud enumeration
CI and Git tokens
Taken from
- LiteLLM 1.107.0, 1 source
- npm worms, 3 sources
Led to
- More poisoned packages
Wallet keys
Taken from
- Railway env vars, 1 source
Led to
- Wallet drain (claimed)
Data table: From stolen secret to abuse
| From | To | Sources backing the flow |
|---|---|---|
| Railway env vars | AI provider keys | 3 |
| Railway env vars | Cloud roles | 1 |
| Railway env vars | Wallet keys | 1 |
| OpenCode Console | AI provider keys | 4 |
| LiteLLM 1.107.0 | Cloud roles | 3 |
| LiteLLM 1.107.0 | AI provider keys | 2 |
| LiteLLM 1.107.0 | CI and Git tokens | 1 |
| LiteLLM proxy DB (SQLi) | AI provider keys | 2 |
| npm worms | CI and Git tokens | 3 |
| npm worms | AI provider keys | 1 |
| AI provider keys | Inference billing abuse | 10 |
| Cloud roles | Cloud enumeration | 4 |
| Wallet keys | Wallet drain (claimed) | 1 |
| CI and Git tokens | More poisoned packages | 4 |
What to do
Here is what I would do.
The first hour for any critical disclosure
- Name one incident lead and one person keeping the timeline.
- Check whether you run it. If your inventory cannot answer, that is your first finding.
- Check the runtime inside the running container or host, not the package list. Distros backport fixes under old version numbers.
- Check the fixed-version table for your branch. A recent patch is not enough, as GitLab showed.
- Decide to patch, isolate or take it offline. If you cannot patch today, take it offline or put it behind a blocking WAF and write down who accepted the risk.
- Start the hunt at the earliest exploitation date any source reports, not at disclosure. For PHP2Shell that was 17 October.
- Snapshot disk and memory on any suspect host before you restart it.
If a vendor says your secrets may be exposed
- Rotate at the upstream provider first, then update the platform, then redeploy. Confirm the old key now fails.
- Go to the provider's dashboard directly. Phishing follows every breach.
- Review usage from the earliest possible exposure date for unfamiliar models, regions and spend.
- Set spend caps and alerts, and use one key per tool so one leak does not cost you everything.
- Move wallet keys and anything irreplaceable out of environment variables.
- Do not read "no email" as "not affected".
If a package or image you use was compromised
- Do not run Python or pip on a host that may have run the bad version.
- Treat the host as burned and rebuild from a clean image.
- Rotate everything the host could read, including cloud roles, SSH keys, registry tokens and the keys in any proxy database.
- Check cloud audit logs for calls from outside your network.
- Remove persistence hooks before you rotate. Some npm worms plant editor and agent hooks that steal the new tokens.
Standing controls
- Pin containers and CI images by digest, not by
latest, and pin lockfiles with integrity hashes. - Wait a few days before adopting a brand-new package version.
- Fail a release build when its source repository owner is not the expected one.
- Keep one provider key per tool, each with a spend cap.
- Keep LLM gateways and local agent servers off the open internet.
- Run a WAF in block mode in front of every internet-facing PHP, Node and GitLab instance.
- Keep 30 days or more of web, runtime and process logs, and alert on a web server spawning a shell.
- Retire end-of-life runtimes at the edge. Cisco Talos expects about half of vulnerable PHP systems never to be patched52.
Sources
- TechCrunch. Developer platform Railway urges all users to revoke secret keys after cyberattack. 22 October 2026. techcrunch.com
- php/php-src. GHSA-w8hw-w9fx-j79w, RCE via OOM corruption (CVE-2026-109618). github.com
- php/php-src. GHSA-6wmf-4rv5-p3rp, RCE via stale global state (CVE-2026-109619). github.com
- PHP Group. Security advisory and interim mitigations, 20 to 21 October 2026. php.net
- W3Techs. Usage statistics of PHP, 22 October 2026. w3techs.com
- Calif. PHP2Shell. 21 October 2026. calif.io
- PHP Foundation. Today's PHP security release and how we're strengthening PHP security. 21 October 2026. thephp.foundation
- Wiz. PHP2Shell: AI uncovers critical RCE vulnerabilities affecting 70% of the Internet. 21 October 2026. wiz.io
- Amazon. Amazon threat intelligence identifies PHP2Shell exploitation prior to public disclosure in MadPot. 21 October 2026. aws.amazon.com
- JPCERT/CC. JPCERT-AT-2026-0033. 22 October 2026. jpcert.or.jp
- CISA. Critical vulnerabilities in PHP require immediate patching. 21 October 2026. cisa.gov
- NCSC (NZ). CVE-2026-109618 and CVE-2026-109619 affecting PHP. 22 October 2026. ncsc.govt.nz
- Reuters. Factbox: websites taken offline over PHP risks. 21 October 2026. investing.com
- NCSC (UK). Critical security issue affecting PHP. 21 October 2026. ncsc.gov.uk
- ASD's ACSC. Critical vulnerabilities in PHP. 21 October 2026, reviewed 22 October. cyber.gov.au
- Node.js. Wednesday, October 21, 2026 security releases. nodejs.org
- Imperva. Node2Shell: from Brotli data to remote code execution. imperva.com
- Aikido. Node2Shell write-up, CVE-2026-111497. aikido.dev
- Elastic Security Labs. CHAINDROP, Shai-Hulud npm supply chain. elastic.co
- GitLab. Patch release 19.5.1, 19.4.3, 19.3.6. 21 October 2026. docs.gitlab.com
- BleepingComputer. GitLab warns of new max-severity code execution vulnerability. bleepingcomputer.com
- CISA. Adds one known exploited vulnerability to catalog. 11 September 2026. cisa.gov
- Rapid7. GitLab CI/CD regex integer overflow technical analysis, CVE-2026-97229. 16 October 2026. rapid7.com
- FoxIO. Header accordions: QPACK amplification attacks against HTTP/3 servers. 20 October 2026. foxio.io
- Microsoft MSRC. CVE-2026-62815 advisory. msrc.microsoft.com
- .NET announcements. CVE-2026-105016. github.com
- nginx. Security advisories. nginx.org
- curl. CVE-2026-11352. curl.se
- LiteLLM. Security incident, October 21, 2026. docs.litellm.ai
- Wiz. LiteLLM compromised, steals credentials. wiz.io
- Snyk. Poisoned security scanner backdooring LiteLLM. snyk.io
- Datadog Security Labs. LiteLLM compromised on PyPI and Docker. securitylabs.datadoghq.com
- Sysdig. CVE-2026-42208, targeted SQL injection against LiteLLM's authentication path, discovered 36 hours after disclosure. sysdig.com
- Railway. Security disclosure, Wednesday October 21st. blog.railway.com
- BleepingComputer. OpenCode hack exposes API keys amid AI distillation attacks. bleepingcomputer.com
- Infosecurity Magazine. OpenCode quietly patched critical flaw. infosecurity-magazine.com
- Anthropic. Measuring LLMs' impact on n-day exploits. anthropic.com
- VulnCheck. State of exploitation, 1H-2026. vulncheck.com
- Anthropic. Claude Mythos Preview's cybersecurity capabilities. anthropic.com
- Google Threat Intelligence Group. AI vulnerability exploitation and initial access. 11 May 2026. cloud.google.com
- Anthropic. Threat intelligence report, September 2026. anthropic.com
- NIST CAISI. Assessment of Z.ai's GLM-5.3 cyber capabilities. 17 September 2026. nist.gov
- The Decoder. Open-weight models now match frontier cyber performance from four months ago, summarising UK AISI's July assessment. Secondary source. the-decoder.com
- Epoch AI. Open-weight models trail closed models in cyber capabilities by 6 to 7 months. 16 October 2026. epoch.ai
- Anthropic. GLM-5.3 and the spread of advanced cyber capabilities. 29 September 2026. anthropic.com
- Council on Foreign Relations. DeepSeek V4 signals a new phase in the U.S.-China AI rivalry. cfr.org
- The Next Web. Moonshot's Kimi K3 trained on a 20,000-chip Nvidia cluster, per Bloomberg. 31 July 2026. thenextweb.com
- Epoch AI. Will Huawei catch up to Nvidia by 2030? epoch.ai
- Al Jazeera. As AI leaders warn of catastrophe, US and China shun slowdown calls. 23 September 2026. aljazeera.com
- Lawfare. How to make an AI deal with China: trade throttling for pacing. lawfaremedia.org
- explainx. Pacing the Frontier: the AI employees' letter, July 2026. Secondary summary. explainx.ai
- Cisco Talos. Two critical RCEs in PHP core. 21 October 2026. blog.talosintelligence.com
Topics: PHP2Shell, CVE-2026-109618, CVE-2026-109619, GitLab CVE-2026-110264, Node.js Brotli CVE-2026-111497, LiteLLM supply chain attack, Railway security incident, OpenCode breach, QUIC HTTP/3 vulnerabilities, AI vulnerability discovery, open-weight models cyber capability, patch-to-exploit time, incident response playbook, purple team, MITRE ATT&CK, secrets rotation