Skip to content
Aman SinghWriting

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

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.

How to read this
  • 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.

ItemWhat it isDisclosedAI-found?Exploited?
PHP2ShellPre-auth RCE and memory disclosure in PHP core, CVE-2026-109618 and 10961921 OctYes, per three teamsAttempts from 17 Oct, no confirmed compromise published
Node.jsBrotli decoder write, CVE-2026-111497, plus nine more21 OctCredited to an AI security product, method unstatedPublic PoC, unreliable; none in the wild reported
GitLabRegex integer overflow, CVE-2026-110264, CVSS 10.021 OctNo source says soNone reported for this one; two earlier GitLab CVEs were
QUICQPACK exhaustion in 7 of 10 HTTP/3 stacks; two MsQuic RCE-class CVEs20 Oct and earlierNo source says soNone reported
LiteLLMPoisoned release 1.107.0, no CVE21 OctNot applicableStolen cloud credentials tested within hours
RailwayEnvironment-variable stores accessed21 OctNo evidence of attacker AIYes, that is the incident
OpenCodeConsole key store breached, separate agent bugs16 to 18 OctNo evidence of attacker AIYes, charges up to about $1,700 reported

Seven incidents, six axes

A grid of my 0 to 5 scores, one row per incident and one column per axis, brighter meaning higher. PHP2Shell is the only incident high on both exposure and AI-found evidence. LiteLLM, Railway and OpenCode score high on exploited and secrets, and at or near zero on AI-found.
ExposureRemote reachExploitedAI-foundSecretsFix ready
Software bugs
PHP2Shell553534
Node.js431314
GitLab241035
QUIC421003
Credential breaches
LiteLLM345054
Railway235052
OpenCode135142
Each cell is my 0 to 5 score, and a brighter cell is a higher one. Exploited: 0 none, 1 public PoC, 3 widespread attempts, 5 confirmed abuse. AI-found: 0 nothing stated, 3 an AI tool credited, 5 documented by several parties. Each incident keeps one colour in every chart on this page, and grey is never an incident. These are judgments, not measurements.

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
Government response, not a count of victims. Highest level per country, from agency advisories and a Reuters factbox. Singapore is too small for the map data, so it is a marked box. A country with no colour has no statement in my sources, which is not the same as unaffected.
Data table: Where governments reacted
World map shaded by government response. Exploitation attempts reported: New Zealand and Singapore. Sites taken offline: the Netherlands, Denmark, Finland, France and Australia. Advisory only: the United States, the United Kingdom, Canada, Germany and Japan.
CountryResponseDetail
New ZealandExploitation attempts reportedNCSC NZ: aware of reports of active exploitation
SingaporeExploitation attempts reportedCSA: widespread exploitation attempts
NetherlandsSites taken offlineGovernment sites taken offline preventively, including DigiD
DenmarkSites taken offlineGovernment sites taken offline (Reuters factbox)
FinlandSites taken offlineGovernment sites taken offline (Reuters factbox)
FranceSites taken offlineGovernment sites taken offline (Reuters factbox)
AustraliaSites taken offlinecyber.gov.au, ABS and Jobs and Skills Australia taken offline
United StatesAdvisory issuedCISA: patch now, no exploitation observed. Not in the catalog on 21 Oct
United KingdomAdvisory issuedNCSC UK: consider taking systems offline
CanadaAdvisory issuedCyber Centre AL26-026: PoC available, no active exploitation identified
GermanyAdvisory issuedBSI: patch immediately
JapanAdvisory issuedJPCERT/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
UTC, hours since 12 Oct 00:00. Points with only a date are plotted at midday and say so on hover.
Data table: Twelve to 22 October on one clock
Timeline of events in seven lanes, one per incident. Most events fall on 21 October. The PHP2Shell lane starts on 17 October with the first exploit attempt, four days before the fix.
IncidentWhenEvent
OpenCode17 Oct 00:30 UTCEarliest possible key exposure in the Console breach
OpenCode18 Oct, date onlyBreach disclosed to users (date only)
Railway21 Oct 08:28 UTCInvestigating anomalous activity
Railway21 Oct 20:30 UTCOAuth sessions invalidated
Railway21 Oct 22:10 UTCPublic security notice
Railway22 Oct 04:39 UTCAll API tokens invalidated
LiteLLM21 Oct 10:08 UTCBranch protection overridden by a stolen credential
LiteLLM21 Oct 11:39 UTC1.107.0 uploaded to PyPI
LiteLLM21 Oct 13:23 UTCPyPI package pulled
QUIC13 Oct, date onlyMsQuic CVE-2026-105016 heap overflow (date only)
QUIC14 Oct, date onlynginx 1.31.7 and 1.30.6 fix HTTP/3 body injection (date only)
QUIC20 Oct, date onlyFoxIO publishes Header Accordions with a PoC (date only)
GitLab12 Oct, date only19.4.2 fixes CVE-2026-97229 (date only)
GitLab16 Oct, date onlyRapid7 publishes a PoC for 97229 (date only)
GitLab21 Oct, date only19.5.1 fixes CVE-2026-110264, CVSS 10.0 (date only)
Node.js21 Oct, date onlyTen CVEs fixed, Brotli RCE worst (date only)
Node.js22 Oct, date onlyImperva publishes an unreliable PoC (date only)
PHP2Shell17 Oct, date onlyFirst exploit attempt, Amazon honeypot (date only)
PHP2Shell20 Oct 15:00 UTCCVE IDs leak with the wrong score
PHP2Shell20 Oct 19:30 UTCPHP posts its advance notice
PHP2Shell21 Oct 02:00 UTCSeveral actors start sending attempts
PHP2Shell21 Oct 07:41 UTCChainguard ships patched images six hours early
PHP2Shell21 Oct 13:30 UTCPatched releases go live
PHP2Shell21 Oct 14:19 UTCwatchTowr reports exploitation attempts
PHP2Shell22 Oct 03:46 UTCELLIO 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
Symmetric log scale, so one hour and one hundred hours both stay readable. The Firefox figure is Anthropic's own test with a model attackers cannot use. GitLab 19478 is a single honeypot operator. The rows do not all measure the same thing.
Data table: Patch to exploit, in hours
Horizontal bars of hours from patch to exploit. PHP2Shell's first attempt came 96 hours before disclosure. The fastest after-patch figure is 1 hour, in a lab. Cases seen in the wild run from 4.5 to 48 hours, and public proofs of concept took 24 to 96 hours.
EventHoursKindNote
PHP2Shell, attempt pre-disclosure-96Attempt before disclosureAmazon honeypot, 17 Oct, four days before 21 Oct. Amazon does not say any attempt worked.
Firefox patch to exploit (lab)1Lab measurementAnthropic's lab test, 18 patches, standalone JS shell. A model most attackers cannot use.
LiteLLM stolen creds tested4.5Seen in the wildWiz, after exfiltration from the 1.107.0 payload.
GitLab 85706 to CISA list24Seen in the wildPatched 10 Sep, listed 11 Sep as exploited.
Node.js Brotli to public PoC24Public PoCImperva PoC, unreliable, one platform tested.
LiteLLM SQLi to exploitation36Seen in the wildSysdig honeypot data.
GitLab 19478 to honeypot hits48Seen in the wildwatchTowr, single source.
GitLab 97229 to Rapid7 PoC96Public PoC12 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
The estimators measure different things and I have not averaged them. CAISI uses four benchmarks, AISI uses narrow tasks and a 32-step range, Epoch fits a capability index. DeepSeek's range is its own claim.
Data table: How far behind are open models on cyber?
Range bars of estimates for how many months open-weight models trail closed ones on cyber tasks. The estimates run from 3 to 7 months.
SourceMonths 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 report3 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
The first four pairs are NIST CAISI's percent of tasks solved. The last pair is Anthropic's own run, working exploits as a share of 410 attempts, and Anthropic makes the closed model in it. The US figure is the best result on each measure and may come from a model attackers cannot access.
Data table: GLM-5.3 against the best US model
Grouped bars of GLM-5.3 and the best US model on five measures, in percent. On NIST CAISI's four benchmarks GLM-5.3 scores 40.4, 61.1, 9.4 and 7.7 against 90.2, 100, 44.4 and 23.2. On Anthropic's own exploit run the two are close, 12.2 against 13.7.
MeasureGLM-5.3 (percent)Best US model (percent)Source
SEC-Bench Pro40.490.2CAISI
ExploitBench, CAISI61.1100CAISI
ExploitGym9.444.4CAISI
OSS-Fuzz (private)7.723.2CAISI
ExploitBench, Anthropic12.213.7Anthropic

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

Epoch estimates, millions of H100-equivalents. The first two bars are 2026 projections, the third is a median through 2025 with a wide range (0.29 to 1.6 million). Whether Chinese frontier models trained on domestic chips is unverified.
Data table: Chips: who has the compute
Bars in millions of H100-equivalents: Nvidia 2026 supply 23, Huawei Ascend 2026 0.9, and Nvidia chips smuggled into China to 2025 0.66.
SourceMillions of H100-equivalents
Nvidia, 202623
Huawei Ascend, 20260.9
Smuggled Nvidia, to 20250.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
A filled chip is an incident's main route and an outlined one is a secondary route. The grouping into techniques is my ATT&CK-style mapping, since MITRE publishes none for these events.
Data table: Which incident used which technique
Seven incidents, each with the attack techniques it used, a main route or a secondary one. Exploiting a public application appears under every software incident. Stored credentials appear under PHP2Shell, GitLab, LiteLLM, Railway and OpenCode. QUIC appears mainly under denial of service.
IncidentTechniqueWeight (2 main route, 1 secondary)
PHP2ShellExploit public app2
PHP2ShellShell execution1
PHP2ShellWeb shell, hooks1
PHP2ShellCredentials in files1
PHP2ShellDenial of service1
Node.jsExploit public app2
Node.jsShell execution1
GitLabExploit public app2
GitLabCredentials in files1
QUICExploit public app1
QUICDenial of service2
LiteLLMSupply chain2
LiteLLMExploit public app1
LiteLLMCredentials in files2
LiteLLMResource hijacking2
LiteLLMValid accounts1
RailwayValid accounts2
RailwayCredentials in files2
RailwayResource hijacking1
OpenCodeValid accounts2
OpenCodeCredentials in files2
OpenCodeResource hijacking2

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)
The number beside each source counts how many sources back that flow. It is not money, keys or victims. The wallet drain is a single researcher's claim, and the AI-key abuse in the Railway and OpenCode rows is reported by users and vendors.
Data table: From stolen secret to abuse
Four kinds of secret, each with where it was taken and what it led to. AI provider keys led to inference billing abuse, cloud roles to cloud enumeration, CI and Git tokens to more poisoned packages, and wallet keys to a claimed wallet drain.
FromToSources backing the flow
Railway env varsAI provider keys3
Railway env varsCloud roles1
Railway env varsWallet keys1
OpenCode ConsoleAI provider keys4
LiteLLM 1.107.0Cloud roles3
LiteLLM 1.107.0AI provider keys2
LiteLLM 1.107.0CI and Git tokens1
LiteLLM proxy DB (SQLi)AI provider keys2
npm wormsCI and Git tokens3
npm wormsAI provider keys1
AI provider keysInference billing abuse10
Cloud rolesCloud enumeration4
Wallet keysWallet drain (claimed)1
CI and Git tokensMore poisoned packages4

What to do

Here is what I would do.

The first hour for any critical disclosure

  1. Name one incident lead and one person keeping the timeline.
  2. Check whether you run it. If your inventory cannot answer, that is your first finding.
  3. Check the runtime inside the running container or host, not the package list. Distros backport fixes under old version numbers.
  4. Check the fixed-version table for your branch. A recent patch is not enough, as GitLab showed.
  5. 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.
  6. Start the hunt at the earliest exploitation date any source reports, not at disclosure. For PHP2Shell that was 17 October.
  7. Snapshot disk and memory on any suspect host before you restart it.

If a vendor says your secrets may be exposed

  1. Rotate at the upstream provider first, then update the platform, then redeploy. Confirm the old key now fails.
  2. Go to the provider's dashboard directly. Phishing follows every breach.
  3. Review usage from the earliest possible exposure date for unfamiliar models, regions and spend.
  4. Set spend caps and alerts, and use one key per tool so one leak does not cost you everything.
  5. Move wallet keys and anything irreplaceable out of environment variables.
  6. Do not read "no email" as "not affected".

If a package or image you use was compromised

  1. Do not run Python or pip on a host that may have run the bad version.
  2. Treat the host as burned and rebuild from a clean image.
  3. Rotate everything the host could read, including cloud roles, SSH keys, registry tokens and the keys in any proxy database.
  4. Check cloud audit logs for calls from outside your network.
  5. 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

  1. TechCrunch. Developer platform Railway urges all users to revoke secret keys after cyberattack. 22 October 2026. techcrunch.com
  2. php/php-src. GHSA-w8hw-w9fx-j79w, RCE via OOM corruption (CVE-2026-109618). github.com
  3. php/php-src. GHSA-6wmf-4rv5-p3rp, RCE via stale global state (CVE-2026-109619). github.com
  4. PHP Group. Security advisory and interim mitigations, 20 to 21 October 2026. php.net
  5. W3Techs. Usage statistics of PHP, 22 October 2026. w3techs.com
  6. Calif. PHP2Shell. 21 October 2026. calif.io
  7. PHP Foundation. Today's PHP security release and how we're strengthening PHP security. 21 October 2026. thephp.foundation
  8. Wiz. PHP2Shell: AI uncovers critical RCE vulnerabilities affecting 70% of the Internet. 21 October 2026. wiz.io
  9. Amazon. Amazon threat intelligence identifies PHP2Shell exploitation prior to public disclosure in MadPot. 21 October 2026. aws.amazon.com
  10. JPCERT/CC. JPCERT-AT-2026-0033. 22 October 2026. jpcert.or.jp
  11. CISA. Critical vulnerabilities in PHP require immediate patching. 21 October 2026. cisa.gov
  12. NCSC (NZ). CVE-2026-109618 and CVE-2026-109619 affecting PHP. 22 October 2026. ncsc.govt.nz
  13. Reuters. Factbox: websites taken offline over PHP risks. 21 October 2026. investing.com
  14. NCSC (UK). Critical security issue affecting PHP. 21 October 2026. ncsc.gov.uk
  15. ASD's ACSC. Critical vulnerabilities in PHP. 21 October 2026, reviewed 22 October. cyber.gov.au
  16. Node.js. Wednesday, October 21, 2026 security releases. nodejs.org
  17. Imperva. Node2Shell: from Brotli data to remote code execution. imperva.com
  18. Aikido. Node2Shell write-up, CVE-2026-111497. aikido.dev
  19. Elastic Security Labs. CHAINDROP, Shai-Hulud npm supply chain. elastic.co
  20. GitLab. Patch release 19.5.1, 19.4.3, 19.3.6. 21 October 2026. docs.gitlab.com
  21. BleepingComputer. GitLab warns of new max-severity code execution vulnerability. bleepingcomputer.com
  22. CISA. Adds one known exploited vulnerability to catalog. 11 September 2026. cisa.gov
  23. Rapid7. GitLab CI/CD regex integer overflow technical analysis, CVE-2026-97229. 16 October 2026. rapid7.com
  24. FoxIO. Header accordions: QPACK amplification attacks against HTTP/3 servers. 20 October 2026. foxio.io
  25. Microsoft MSRC. CVE-2026-62815 advisory. msrc.microsoft.com
  26. .NET announcements. CVE-2026-105016. github.com
  27. nginx. Security advisories. nginx.org
  28. curl. CVE-2026-11352. curl.se
  29. LiteLLM. Security incident, October 21, 2026. docs.litellm.ai
  30. Wiz. LiteLLM compromised, steals credentials. wiz.io
  31. Snyk. Poisoned security scanner backdooring LiteLLM. snyk.io
  32. Datadog Security Labs. LiteLLM compromised on PyPI and Docker. securitylabs.datadoghq.com
  33. Sysdig. CVE-2026-42208, targeted SQL injection against LiteLLM's authentication path, discovered 36 hours after disclosure. sysdig.com
  34. Railway. Security disclosure, Wednesday October 21st. blog.railway.com
  35. BleepingComputer. OpenCode hack exposes API keys amid AI distillation attacks. bleepingcomputer.com
  36. Infosecurity Magazine. OpenCode quietly patched critical flaw. infosecurity-magazine.com
  37. Anthropic. Measuring LLMs' impact on n-day exploits. anthropic.com
  38. VulnCheck. State of exploitation, 1H-2026. vulncheck.com
  39. Anthropic. Claude Mythos Preview's cybersecurity capabilities. anthropic.com
  40. Google Threat Intelligence Group. AI vulnerability exploitation and initial access. 11 May 2026. cloud.google.com
  41. Anthropic. Threat intelligence report, September 2026. anthropic.com
  42. NIST CAISI. Assessment of Z.ai's GLM-5.3 cyber capabilities. 17 September 2026. nist.gov
  43. 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
  44. Epoch AI. Open-weight models trail closed models in cyber capabilities by 6 to 7 months. 16 October 2026. epoch.ai
  45. Anthropic. GLM-5.3 and the spread of advanced cyber capabilities. 29 September 2026. anthropic.com
  46. Council on Foreign Relations. DeepSeek V4 signals a new phase in the U.S.-China AI rivalry. cfr.org
  47. The Next Web. Moonshot's Kimi K3 trained on a 20,000-chip Nvidia cluster, per Bloomberg. 31 July 2026. thenextweb.com
  48. Epoch AI. Will Huawei catch up to Nvidia by 2030? epoch.ai
  49. Al Jazeera. As AI leaders warn of catastrophe, US and China shun slowdown calls. 23 September 2026. aljazeera.com
  50. Lawfare. How to make an AI deal with China: trade throttling for pacing. lawfaremedia.org
  51. explainx. Pacing the Frontier: the AI employees' letter, July 2026. Secondary summary. explainx.ai
  52. 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

Next: The Railway breach explained: what leaked and what to rotate The timeline, what was exposed, the AI-key campaign behind it, and the order to rotate your secrets, with seven interactive charts and 25 references.Cybersecurity · 10 min read