← All AI resources

October 2026 developer security · Developer Security Week: PHP2Shell, Railway and LiteLLM

Developer Security Week: PHP2Shell, Railway and LiteLLM

Five urgent incidents hit the software stack within days. AI helped researchers find old flaws and made provider keys lucrative targets, but it did not cause every breach or vulnerability.

Published by Learnetto team · Published October 23, 2026

Developer security week

Five incidents across the stack

October 16–23, 2026
  1. PHP2ShellCritical remote code execution
  2. LiteLLMCredential-stealing package release
  3. RailwayEvery customer told to rotate secrets
  4. OpenCodeHosted provider keys may have been exposed
  5. Node.jsTen vulnerabilities patched
PatchRebuildRotate
Separate incidents converged on the same operational risk: vulnerable runtimes, release pipelines and concentrated developer credentials.

PHP shipped emergency fixes for two critical remote-code-execution flaws. A poisoned LiteLLM release stole developer, cloud, and AI credentials. Railway warned every customer to rotate stored secrets, OpenCode disclosed provider-key exposure, and Node.js fixed ten vulnerabilities. The events overlap around concentrated credentials and faster AI-assisted security work, but no public evidence proves one campaign or an all-AI cause.

PHP2Shell
Two critical CVEs, fixed in PHP 8.2.35, 8.3.36, 8.4.27 and 8.5.12
LiteLLM
Malicious 1.107.0 wheels and images were live for roughly two hours
Railway
All users were told to rotate stored variables and private registry credentials
Node.js
Ten CVEs fixed across supported 22.x, 24.x and 26.x releases

What happened in the October 2026 developer security week?

Between October 16 and October 23, developers had to respond to separate failures at almost every layer of the stack: language runtimes, package registries, deployment platforms, hosted coding tools, certificate trust stores and release assets. The practical overlap was secrets. API keys, cloud identities, database credentials and release tokens can cross several tools, so one compromise can become a route into the next system.

The five incidents drawing the most urgent developer questions are PHP2Shell, the Railway environment-variable incident, the OpenCode Console breach, the LiteLLM 1.107.0 supply-chain compromise and the Node.js October security release. Each needs a different response.

  • PHP2Shell: two PHP-core bugs can lead to unauthenticated remote code execution. Update PHP and restart the workers that load it.
  • LiteLLM: malicious official wheels and container images could execute a credential stealer whenever Python started. Isolate, rebuild and rotate reachable secrets.
  • Railway: some decrypted environment-variable contents may have been obtained. Revoke secrets at their issuing services, replace them in Railway and redeploy.
  • OpenCode: 1.4% of Console users with external providers linked were in the disclosed affected group. The local app and CLI were outside the stated Console incident.
  • Node.js: supported 22.x, 24.x and 26.x lines received fixes for ten CVEs, including a high-severity Brotli decoder flaw that permits remote code execution.

Were all these security incidents caused by AI?

No. The evidence supports four distinct roles for AI, and collapsing them into one story hides the useful lessons.

In PHP2Shell, human researchers used frontier models as research agents to find trigger paths, develop and adapt exploits, group related reports and validate patches. The underlying memory-management and request-lifecycle bugs were years old. The PHP Foundation's account says signs of the out-of-memory problem were found during 2024 audit follow-up, long before this week's disclosure.

Railway and OpenCode described attacks seeking access to AI-provider capacity or keys. That makes AI inference the target and economic motive, not the proven method of intrusion. Railway has not disclosed its root cause. OpenCode called its breach related to a large-scale distillation attack, but it has not published the exploit path or evidence establishing how stolen keys were used.

LiteLLM was AI infrastructure that got compromised through a software release chain. Its malware explicitly searched for AI-provider credentials, but the documented attack relied on stolen GitHub credentials, a lookalike repository and temporarily widened release permissions. Node's Brotli flaw was credited to OpenAI Codex Security researchers; the other nine Node CVEs have no stated AI role.

  • AI-assisted vulnerability research: PHP2Shell and Node's Brotli RCE.
  • Theft aimed at AI inference access: Railway's stated assessment and OpenCode's stated distillation context.
  • Compromise of AI software and its release chain: LiteLLM 1.107.0.
  • Concurrent incidents with no substantiated AI cause: the eMudhra Java trust emergency, HTTP/3 amplification flaws, GitLab's critical RCE and the OVHcloud CLI compromise.

PHP2Shell: two old PHP bugs became practical remote code execution

PHP2Shell is the industry name for CVE-2026-109618 and CVE-2026-109619. Both are rated 9.2 Critical under CVSS v4.0 and can produce unauthenticated remote code execution under demonstrated conditions. They live in PHP core rather than WordPress, Drupal, Joomla or a plugin, so updating a content-management system does not repair the runtime beneath it.

The first flaw turns out-of-memory handling into memory corruption. PHP can be interrupted while request data is only partly initialized, then treat invalid cleanup data as valid. Researchers demonstrated full remote code execution over HTTP against default Apache mod_php and confirmed PHP-FPM application paths. The second flaw lets request-owned global state outlive the memory behind it. A later operation or request can consume the stale pointer, producing a use-after-free and, with a controlled heap layout, code execution.

The official advisory treats every PHP installation serving web requests as at risk, including PHP-FPM, mod_php, php-cgi, FrankenPHP and LiteSpeed. Research from Calif, Wiz and Cloudflare found at least one vulnerable path dating to PHP 5.4. The exact path and exploitability are not identical across every version and server interface.

Which PHP versions fix PHP2Shell?

The first fixed upstream releases are PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35. PHP 8.1 and older are outside normal upstream support. Some operating-system and long-term-support vendors provide backports, and PHP published minimal source backports for 7.4, 8.0 and 8.1, but those do not turn the branches back into supported upstream releases.

PHP's guidance is blunt: updating is the only complete solution. Its temporary measures, such as changing memory limits and constraining request sizes, reduce selected attack paths but cannot make the installation safe. After installing a fixed package, restart PHP-FPM, Apache or the relevant service so old workers do not continue running vulnerable code. CERT-EU also advised immediate patching and isolation of exposed systems where a fix cannot be applied.

  • PHP 8.5.0 through 8.5.11: update to 8.5.12 or later.
  • PHP 8.4.0 through 8.4.26: update to 8.4.27 or later.
  • PHP 8.3.0 through 8.3.35: update to 8.3.36 or later.
  • PHP 8.2.0 through 8.2.34: update to 8.2.35 or later.
  • PHP 8.1 and older: obtain a verified vendor backport or migrate to a supported branch.

AI found leverage in PHP's oldest corners

The discovery story is more interesting than the slogan that AI found PHP2Shell. Calif researcher Ryan Austin entered OpenAI's Patch the Planet program with prior PHP knowledge and a theory about error handling. His technical account says an LLM companion helped generate out-of-memory strategies, trace the interruption pattern and generalize it into more trigger paths. He also warns that no model can uncover all bugs from a simple prompt.

Wiz independently used Wiz Atlas, Gemini 4 Argon and GPT-5.6 Sol during vulnerability finding, exploit development, attack detection and patch validation. OpenAI's disclosure credits GPT-5.6 Sol in the Calif work while also crediting Wiz's independent report and the PHP maintainers who produced the fixes. The PHP Foundation says AI helped validate and group reports, while people made the severity, disclosure and patch decisions.

The sober conclusion is still consequential: models reduced the cost of turning an obscure, old memory-safety concern into working exploit paths. That same acceleration is available to defenders and attackers. It increases the value of faster patch production, coordinated disclosure and funding for maintainers who can understand a generated exploit well enough to fix the root cause.

The PHP disclosure nearly outran its own patch

The coordinated release frayed on October 20. CVE identifiers circulated with the wrong release time and an incorrect 10.0 score. PHP moved its release forward. Calif then accidentally published a demonstration video showing a working proof of concept against several targets. Copies spread after deletion. The PHP Foundation's timeline also says mitigation guidance shared with critical infrastructure may have leaked.

Chainguard published patched images more than six hours before the coordinated time. PHP called that an embargo break because attackers could compare the binaries. Chainguard's chief executive said he chose early publication after attacks appeared in the wild. Amazon's MadPot honeypots recorded an attempt dated October 17 and several more before the official release, but Amazon said it was unclear whether those attempts would have succeeded on real systems.

Cloudflare reported rapidly mutating payloads, and its chief executive reported millions of attempts after disclosure. Research RCE and broad attack traffic are verified. As of October 23, no public source had confirmed a successful real-world victim compromise. Attempts, working laboratory exploits and confirmed intrusions are different claims.

Railway breach: rotate secrets at the source, then redeploy

On October 21, Railway said an unauthorized third party may have accessed encrypted customer environment variables and obtained the decrypted contents of some. Those variables can hold API keys, database credentials and private-registry credentials. Railway's first analysis suggested a subset of users, but its security disclosure told every user to rotate all Railway-stored environment variables and review service logs.

Railway paused builds and deployments, invalidated pre-incident Railway API and Project tokens, reset storage-bucket credentials, invalidated OAuth sessions and reset GitHub credentials it held. Its status timeline shows builds returning plan by plan. Customers considered highly likely to be affected were contacted while forensic analysis continued.

The breach is still missing its most important public facts: the initial access method, the number of affected accounts, the exposure window and the full downstream blast radius. Railway's statement that the incident was part of attacks aimed at AI inference providers describes its current assessment of motive. It does not prove that an AI agent performed the intrusion, that encryption was broken or that every exposed variable contained an AI key.

Changing a Railway variable is only half the job. Revoke the old credential at OpenAI, Anthropic, Google, AWS, a database provider, GitHub or whichever service issued it. Then create a replacement, update Railway, redeploy so running containers receive the new value, and review provider-side usage and billing. Railway published separate bucket and GitHub recovery guidance for credentials it reset on customers' behalf.

OpenCode Console breach: 1.4% of hosted Console users were in scope

OpenCode disclosed a breach during the night of October 16 to 17 that affected 1.4% of OpenCode Console users, specifically a subset with external providers linked. Its affected-user notice said an unauthorized party reached a legacy system being decommissioned and that provider keys stored in Console workspaces may have been exposed. The local OpenCode app and CLI were outside the stated Console incident.

Users reported unauthorized charges, and TechCrunch reported that Anthropic and Google blocked keys believed to be exposed while OpenAI worked with OpenCode on restoration and refunds. Those reports show real abuse, but OpenCode has not published an audited loss total, the number of keys, their storage state or the exploit used against the legacy system.

OpenCode called the event related to a large-scale distillation attack. That attribution should remain attached to OpenCode because the company has not released traffic analysis or other evidence showing which model was targeted or how the stolen capacity was used. Affected users must revoke the keys in each provider's dashboard. Deleting a key from Console cannot invalidate a copy already held by an attacker.

LiteLLM 1.107.0 turned Python startup into a credential trap

LiteLLM's October 21 compromise is the week's most technically documented attack. Seven malicious PyPI wheels for version 1.107.0 were available from 11:39:51 to 13:23 UTC. Docker Hub and GHCR tags v1.107.0, latest, main-latest and main-stable pointed at compromised images during overlapping windows. The official incident report says previous versions and its private enterprise release were not affected.

The malicious wheels added cook.pth, cook.py and sitecustomize.py to site-packages. Python processes executable .pth lines and imports sitecustomize during startup, so the malware could run even when an application never imported LiteLLM. Running Python or pip inside the affected environment could trigger it again. JFrog's artifact analysis found a credential stealer plus an hourly remote-code loader.

The stealer searched browser data, shell history, SSH and GPG keys, source-control and package tokens, cloud and Kubernetes credentials, environment variables, AI coding-tool files and cloud instance metadata. If DATABASE_URL was available, it queried LiteLLM's own credentials and proxy-model tables. The loader checked a GitHub-hosted dead drop every hour for a domain and could fetch arbitrary Python from it.

The source tag looked clean because the poisoned artifacts came from a lookalike repository, Berri-AI/litellm instead of BerriAI/litellm. LiteLLM says three stolen GitHub CLI OAuth credentials were used to override branch protection, approve the production release and delete workflow records. The result passed through legitimate release automation. A clean tag therefore did not guarantee clean wheels. Datadog's analysis records the same release-chain failure and payload behavior.

Did an AI coding tool leak the tokens used against LiteLLM?

LiteLLM says it observed situations in which Claude Code embedded a user's GitHub CLI OAuth token in a response body, allowing the token to appear in logs when response bodies were recorded. The company believes an attacker entered an internet-exposed internal LiteLLM deployment, found tokens in those logs and used them against the release workflow. The report also says the initial entry into that deployment remains unconfirmed.

That distinction matters. The token-in-response behavior is an official LiteLLM observation. The full attacker path is LiteLLM's current belief, and Anthropic had not publicly corroborated the claim. The known evidence does not establish that Claude Code caused the breach. The chain also depended on response logging, access to the internal gateway, powerful long-lived credentials, widened release permissions and approval controls that three stolen identities could satisfy.

How to recover from LiteLLM 1.107.0

If an affected wheel or image ran on a networked system, treat every credential reachable from that system as exposed. An indicator file can confirm successful exfiltration, but its absence cannot prove the host is clean. Recovery should begin outside the affected Python environment.

  • Isolate the host or container. Do not start by running pip or the affected Python interpreter.
  • Remove the malicious startup files using tools outside that interpreter, terminate the detached loader and preserve logs needed for investigation.
  • Prefer rebuilding the environment, container or host from verified artifacts. LiteLLM identifies 1.106.2 as the clean release immediately before 1.107.0.
  • From a clean machine, rotate workload IAM credentials, cloud and Kubernetes identities, source and package tokens, SSH/GPG/TLS keys, database credentials, browser credentials, LiteLLM master and virtual keys, and every stored provider key the host could read.
  • Inspect provider and cloud audit logs for unfamiliar usage. Wiz reported stolen AWS credentials being tested with GetCallerIdentity and then used to enumerate foundation models, activity consistent with stealing inference capacity.

Node.js fixed ten CVEs, including a Brotli decoder RCE

Node released 22.23.4, 24.22.1 and 26.12.1 on October 21. The project advisory lists four high, three medium and three low-severity CVEs. The supported 26.x line is affected by all ten, 24.x by eight and 22.x by seven. End-of-life lines did not receive this coordinated release.

The headline flaw, CVE-2026-111497, is an out-of-bounds write in the Brotli decoder that Node says permits remote code execution. OpenAI Codex Security researchers Khai Tran and Sylvie Mayer received discovery credit. The remaining high-severity issues cover a NUL-character DNS truncation and two TLS hostname-validation bypasses.

One medium-severity bug needs more than replacing the runtime. CVE-2026-106074 can save randomUUID and randomInt entropy caches inside startup snapshots and single-executable applications, causing separate processes built from the same artifact to repeat values. Teams using those features should update Node and rebuild the snapshots or executables.

  • Node.js 22.x: update to 22.23.4 or later.
  • Node.js 24.x: update to 24.22.1 or later.
  • Node.js 26.x: update to 26.12.1 or later.
  • Node.js 20, 25 and older end-of-life lines: move to a maintained release rather than waiting for a patch that was not issued here.

The wider blast radius: Java, GitLab, HTTP/3 and OVHcloud

The same week contained several serious developer-security events with no substantiated AI cause. Their proximity explains the sense of a single emergency, but the mechanisms and remediation are unrelated.

Java's CVE-2026-91403 emergency concerned eight compromised eMudhra intermediate certificate-authority certificates. It was a trust-store crisis rather than a Java memory-safety flaw. Teams need their vendor's post-October 21 update or the prescribed blocked-certificate mitigation across every installed or embedded JDK and JRE.

GitLab fixed CVE-2026-110264, a CVSS 10.0 integer-overflow flaw that could let an unauthenticated user execute code on a self-managed server through a crafted regular expression. GitLab.com was already patched; self-managed customers were told to upgrade immediately.

FoxIO's Header Accordions research found seven of ten tested HTTP/3 implementations vulnerable to QPACK decoded-header amplification. A small compressed request could force tens to thousands of times more memory allocation. This was a cross-implementation disclosure of denial-of-service risks, not seven new RCEs and not evidence of broad exploitation.

The OVHcloud CLI compromise was a separate release-asset attack. A compromised developer account replaced binaries for versions 0.11.0 through 0.15.0 during a 94-minute window on October 19. OVHcloud says source and build systems were unaffected. Anyone who downloaded or updated and ran the CLI during that window should treat machine-readable secrets as compromised and move to 0.16.0 or later.

What connects the incidents, and what remains unproven

The confirmed connection is structural. Modern developer platforms concentrate bearer credentials that can unlock model inference, source repositories, package publishing, cloud accounts and databases. Attackers do not need to defeat every downstream service when one control plane, log store or release identity can expose the keys to several of them.

The same concentration amplifies defensive mistakes. Long-lived tokens in response logs, mutable release assets, moving container tags, broad release permissions and environment variables shared across services turn one foothold into a larger blast radius. AI raises the value of some stolen keys because inference is expensive and can support model extraction. It also speeds vulnerability research. Those effects do not establish one actor, one exploit or one AI-driven campaign.

No public evidence connects Railway, OpenCode and LiteLLM to a common attacker. Railway has not named LiteLLM or OpenCode as part of its stated series. LiteLLM has not described its compromise as model distillation. OpenCode has not published enough forensic detail to verify its distillation attribution independently.

What developers should do today

Prioritize by exposure and the possibility that a copied credential is still usable. Preserve evidence before cleanup where an incident-response investigation may be required.

  • Patch every internet-facing PHP runtime to a fixed upstream or verified vendor build, then restart its workers. Inventory the actual runtime beneath WordPress, Drupal, Joomla and custom applications.
  • Search build, image and dependency records for LiteLLM 1.107.0 and the affected moving tags during the published windows. Isolate and rebuild any environment that ran them before rotating reachable credentials from a clean system.
  • Inventory every secret stored in Railway. Revoke it at the issuer, create a replacement, update Railway, redeploy and review upstream logs and billing. Follow Railway's resets for buckets and GitHub connections.
  • If OpenCode notified your Console workspace, revoke linked provider keys at OpenAI, Anthropic, Google or the relevant provider. Local-only OpenCode keys were outside the disclosed Console scope.
  • Move supported Node.js lines to 22.23.4, 24.22.1 or 26.12.1 and rebuild startup snapshots or single-executable applications.
  • Check whether your organization used affected OVHcloud CLI binaries, vulnerable self-managed GitLab versions, stale Java trust stores or exposed HTTP/3 implementations.
  • Replace shared, long-lived keys with scoped credentials, separate keys by tool and environment, set provider-side spending alerts, minimize response-body logging, pin exact package versions and container digests, and make release artifacts immutable.

Frequently asked questions

  • What is PHP2Shell? It is the name used for two PHP-core vulnerabilities, CVE-2026-109618 and CVE-2026-109619, that can allow unauthenticated remote code execution.
  • Does PHP2Shell affect WordPress? The flaw is in PHP rather than WordPress. A WordPress site can be exposed when it runs on a vulnerable PHP runtime, so update PHP itself.
  • Was PHP2Shell discovered by AI? Human researchers used frontier models extensively to find trigger paths, develop exploits and validate fixes. The underlying bugs predated that research by years.
  • Was PHP2Shell exploited before disclosure? AWS observed a pre-disclosure attempt dated October 17. Broad attempts are verified, but no public source had confirmed a successful real-world victim compromise by October 23.
  • Do all Railway users need to rotate secrets? Railway recommended that all users rotate every stored environment variable and private-registry credential while it continued to identify affected cohorts.
  • Did the OpenCode breach affect the local CLI? OpenCode's disclosed scope was its optional hosted Console. Provider keys stored only by the local app or CLI were outside the stated incident.
  • Which LiteLLM version contained malware? PyPI version 1.107.0 and time-bounded Docker and GHCR tags pointing to its compromised images were affected.
  • Were all these incidents caused by AI? No. AI assisted some vulnerability research and AI-provider credentials were valuable targets, while several concurrent incidents had no demonstrated AI role.

Keep learning on Learnetto

Sources

PHP project: critical remote code execution advisory

PHP Foundation: security release and process account

PHP advisory: CVE-2026-109618

PHP advisory: CVE-2026-109619

Calif: PHP2Shell research account

Wiz: PHP2Shell technical research

OpenAI: coordinated disclosure of critical vulnerabilities

AWS: pre-disclosure PHP2Shell attempts

Cloudflare: PHP2Shell WAF protections and attack traffic

Cloudflare CEO: PHP2Shell attempt volume after disclosure

CERT-EU: critical PHP vulnerabilities

Railway: October 21 security disclosure

Railway: incident status timeline

Railway: bucket and GitHub credential recovery

OpenCode: breach disclosure

The Hacker News: OpenCode Console scope and recovery

LiteLLM: version 1.107.0 incident report

JFrog: LiteLLM malicious wheel analysis

Datadog: LiteLLM supply-chain compromise

Wiz: LiteLLM credential theft and LLMjacking evidence

Node.js: October 21 security releases

OpenJDK: eMudhra certificate advisory

GitLab: October critical patch release

FoxIO: Header Accordions QPACK research

OVHcloud: CLI release-asset compromise