The worst PHP bug in a decade was found by an AI on August 19. The patches, the exploits and the AI-written checker all landed yesterday. Plus the quiet ones nobody talks about.
← All issues
The Diff  No. 019
Thursday, 22 October 2026  ·  AI dev news, only what is verified
PHP2Shell illustration from Wiz Research
The worst PHP bug in a decade was found by an AI on August 19. The patches, the exploits and the AI-written checker all landed yesterday.

Wiz Research used frontier models to turn memory bugs that sat in PHP for over a decade into a working pre-authentication exploit against WordPress, Drupal and Joomla. Every PHP release back to 5.4 is affected by at least one of the two CVEs. Hours earlier, someone slipped a credential stealer into LiteLLM 1.107.0 on PyPI, the 61,000-star gateway a good share of the AI world proxies through. And Anthropic opened a waitlist for Claude Duet, an agent that reads your morning for you.

Today: the AI-found PHP bugs, the poisoned LLM gateway, Anthropic’s new butler, the PaaS that paused every deploy, a compromised CA key shipping inside mitmproxy on purpose, and a sidebar for herding coding agents.

The machines are now on both sides of the vulnerability.

IN THIS ISSUE
01
🐘 AI found the worst PHP bug in a decade
Two CVEs in the PHP engine itself, every version back to 5.4, pre-auth RCE on WordPress, Drupal and Joomla. Patches are out.
02
☠️ LiteLLM 1.107.0 on PyPI was a credential stealer
All seven wheels installed a stealer and a backdoor that run at every Python startup. PyPI has pulled the release.
03
🎩 Anthropic’s Claude Duet reads your morning for you
A proactive agent that briefs you, drafts next steps, works while you’re away and waits for your ok. Research preview, US only, waitlist.
04
🚨 Railway pauses every deploy after an env-var breach
Attackers may have decrypted customer environment variables, apparently hunting AI inference keys. Railway tells everyone to roll secrets.
05
🔑 A compromised CA key is now a mitmproxy feature
Maximilian Hils committed the leaked eMudhra private key to mitmproxy so you can test whether your clients still trust it.
06
🎛️ harp: a mission-control sidebar for coding agents
Run many Claude Code and Codex agents side by side, with one sidebar that tells you which one needs you. Two days old, 540 stars.
🔥 VIRAL
The loud ones on Hacker News. Numbers are a morning snapshot.
PHP2Shell illustration from Wiz Research
01  HN: 950+ points across threads · Wiz Research + php.net, Oct 21 · image: Wiz

🐘 AI found the worst PHP bug in a decade

Two CVEs in the PHP engine itself, every version back to 5.4, pre-auth RCE on WordPress, Drupal and Joomla. Patches are out.
SCENE

On August 19, four Wiz researchers, Sagi Tzadik, Shir Tamari, Nir Ohfeld and Tomer Schwartz, found the first of these bugs using Wiz Atlas with Gemini 4 Argon and GPT-5.6 Sol. The next day they had unauthenticated remote code execution against Drupal. The day after, WordPress. On August 24 they reported to PHP, and yesterday the fixes shipped: 8.5.12, 8.4.27, 8.3.36 and 8.2.35. Wiz calls the findings among the most severe in PHP history, and arguably in software history. Their reasoning: the flaws sat in the codebase for over a decade, but chaining them into an exploit was at the edge of what human researchers could do, and frontier models removed that barrier.

THE THING

The bugs are memory-safety issues in how PHP handles fatal errors, especially out-of-memory errors, mid-request: a request dies, the engine keeps a corrupted internal state, and a later request inherits it. CVE-2026-109618 is a use-after-free in the session upload-progress unserializer; demonstrated impact is remote process-memory disclosure and pre-authentication RCE on WordPress, Drupal and Joomla, independent of the application on top. CVE-2026-109619 is a second fatal-error memory bug. PHP runs what Wiz puts at 70% of all websites. Within hours of disclosure, exploit POC repos passed 900 stars, and OpenAI published php2shell-checker: Codex skills plus a node script that check a URL or a local binary against the patch cutoffs.

✂️ STEAL IT

Steal the response speed. Disclosure to public exploits to an official agent-checkable verifier, all inside a day. When the next one hits your stack, "are we affected" is a question you should be able to answer before lunch, so build that muscle now: an inventory of what runs where, and one command that checks it.

Try today  VERDICT

If you run PHP anywhere, you want 8.5.12, 8.4.27, 8.3.36 or 8.2.35, and Wiz says patch immediately. OpenAI’s checker answers "is this URL or binary vulnerable" in one command. It fails you if your PHP comes from a Linux distro that backports fixes: the version string will lie to you, so check your distro’s tracker instead.

The Wiz write-up  ·  php.net releases  ·  OpenAI’s checker  ·  HN discussion

LiteLLM compromise banner from SafeDep
02  HN: 436 points · SafeDep analysis, Oct 21 · image: SafeDep

☠️ LiteLLM 1.107.0 on PyPI was a credential stealer

All seven wheels installed a stealer and a backdoor that run at every Python startup. PyPI has pulled the release.
SCENE

Somewhere between the LiteLLM GitHub repo and PyPI, release 1.107.0 picked up a passenger. The upstream source is clean. The wheels on PyPI were built from an attacker-modified source with one extra line in pyproject.toml’s maturin section: data = "cook". SafeDep’s Kunal Singh took the release apart yesterday and found what that line smuggled in.

THE THING

Three files land in site-packages with every wheel, Linux, macOS and Windows alike. The first is cook.pth, and the trick is unpleasant: any line in a .pth file that starts with import runs at every Python process startup on the host, whether or not anything ever imports litellm. That runs the credential stealer. The second payload is a backdoor in sitecustomize.py, and a daemon re-runs the stealer hourly, reading its next server address from a file on GitHub and executing whatever it downloads. PyPI has since removed the release; 1.106.2 and the two 1.107.0 release candidates are clean, and so are the pinned companion packages. How the build pipeline was compromised is open: a stolen maintainer or bot credential, or a poisoned build reference, fits the evidence, and SafeDep says only BerriAI’s pipeline logs can settle it.

✂️ STEAL IT

Steal the audit habit: diff the wheel against the repo, not the repo against itself. A .pth file containing an import line is an execution primitive, so grep your site-packages for them the way you already watch postinstall scripts in npm.

Try today  VERDICT

If anything in your fleet installed litellm 1.107.0 while it was live, treat the host as compromised: its credentials are gone and the daemon survives uninstall, so rotate and rebuild rather than pip remove. The clean pin is 1.106.2 and SafeDep’s post has the indicators of compromise. It fails you if you only read requirements.txt; the wheels went everywhere pip goes.

The SafeDep analysis  ·  The LiteLLM repo  ·  HN discussion

Claude Duet artwork from Anthropic
03  HN: 316 points · Anthropic product page, research preview · image: Anthropic

🎩 Anthropic’s Claude Duet reads your morning for you

A proactive agent that briefs you, drafts next steps, works while you’re away and waits for your ok. Research preview, US only, waitlist.
SCENE

Anthropic’s newest product page does not ask what you want to prompt. It asks what needs your attention. Claude Duet is a proactive agent: it briefs you every morning, drafts next steps, takes on tasks of all sizes, keeps working while you’re away, and waits for your ok when it matters. Powered by Opus 5.5, it plugs into what Anthropic says are more than 6,000 connectors and plugins.

THE THING

That is a different shape from Claude Code or Cowork. Those wait for instructions; this one is sold on judgment, deciding what is worth surfacing before you ask. The product page calls it a research preview and gates it behind a waitlist, available on Pro and Max plans in the US only. Beyond the positioning, Anthropic is saying little publicly: the announcement article promises how it works, how it is built for safety and how early testers use it, but the specifics of what it does unattended are thin.

✂️ STEAL IT

Steal the interaction contract: brief, propose, act, and hold at the irreversible step for a human ok. Whatever agent you build or buy, "waits for your ok when it matters" is the sentence your users will judge it by, and the hardest one to implement honestly.

Watch  VERDICT

Waitlist only, US only, Pro and Max plans. There is nothing to run today unless you get in. It fails you if you need unattended autonomy with audit guarantees now; the preview makes promises about judgment that only usage can check.

The product page  ·  HN discussion

🔭 UNDER THE RADAR
Quiet tools and field reports worth your time.
Railway security disclosure header
04  HN: 305 points · Railway disclosure, Oct 21 · image: Railway

🚨 Railway pauses every deploy after an env-var breach

Attackers may have decrypted customer environment variables, apparently hunting AI inference keys. Railway tells everyone to roll secrets.
SCENE

Yesterday morning Railway detected anomalous activity in the systems that store customer environment variables. Its investigation so far: an unauthorized third party may have accessed encrypted environment variables and, for some, walked away with the decrypted contents. The company paused all deployments while it investigates, which means no Railway customer can ship until builds resume.

THE THING

The motive line in the disclosure is the part to read twice: Railway believes this is part of a series of attacks targeting platform companies with the aim of compromising AI inference providers, and it has notified those upstream providers to revoke keys proactively. Environment variables are where API keys, database passwords and registry credentials live, so the advice is blunt: roll all of them, and review logs on the downstream services. Railway says the impact may be limited to a subset of users, that affected customers will get direct email, and that updates land on the announcement and status.railway.com.

✂️ STEAL IT

Steal the blast-radius map. Your PaaS environment variables are a key store your upstream providers never agreed to trust. Write down which keys sit where, and what rolling each one breaks, before someone else schedules the fire drill.

Try today  VERDICT

If you deploy on Railway: roll every env var and private registry credential now, then watch status.railway.com for the builds-restored notice. It fails you if you rotate keys you have not inventoried; the outage you cause will be self-inflicted, so map first, then rotate fast.

The disclosure  ·  HN discussion

mitmproxy repository card
05  HN: 174 points · mitmproxy commit, 23:36 UTC Oct 21 · card: GitHub

🔑 A compromised CA key is now a mitmproxy feature

Maximilian Hils committed the leaked eMudhra private key to mitmproxy so you can test whether your clients still trust it.
SCENE

At 23:36 UTC last night, mitmproxy maintainer Maximilian Hils landed a commit with an unusual payload: the actual private key of a compromised eMudhra intermediate CA, embedded in mitmproxy/certs.py, with a link to the public proof of compromise. The new --emudhra option makes the proxy sign TLS certificates with that compromised key.

THE THING

The point is testing, not mischief. If your browser, your curl, your embedded client still accepts a certificate signed by the revoked eMudhra intermediates, mitmproxy can now show you in one run, no external test server needed. A companion change, #8499, updates the certifi dependency to remove eMudhra CAs from the precompiled binaries, so the tool itself stops trusting the corpse it ships. The option is in main, tagged unreleased; you run it from source today.

✂️ STEAL IT

Steal the regression-test pattern. When a trust anchor dies publicly, its corpse becomes the perfect fixture: commit it, and make "we no longer trust this" a test that runs in CI instead of a hope.

Try today  VERDICT

If you test TLS clients for a living, this is the fastest way to check revocation hygiene across your fleet, straight from mitmproxy’s main branch. It fails you if you wait for a tagged release; nothing is versioned yet, and the option name says exactly what it does.

The commit  ·  HN discussion

harp repository card
06  GitHub: 540 stars in two days · created Oct 20, AGPL-3.0 · card: GitHub

🎛️ harp: a mission-control sidebar for coding agents

Run many Claude Code and Codex agents side by side, with one sidebar that tells you which one needs you. Two days old, 540 stars.
SCENE

The repo appeared Tuesday and passed 540 stars by this morning: harp, an unofficial fork of Warp rebuilt around a single observation. Running one coding agent is a conversation; running five is a management problem.

THE THING

The pitch is a sidebar that runs many Claude Code and Codex agents side by side and, crucially, tells you which one needs you. Agents park in different states, waiting for input, running, done, blocked, and harp’s entire design bet is that your attention is the scarce resource, not tokens. It is an unofficial fork, two days old, AGPL-3.0, so treat stability and governance accordingly.

✂️ STEAL IT

Steal the attention model. The useful primitive in any agent fleet is not parallelism, it is the "which one is waiting on me" queue. Whatever you orchestrate with, build that view first; the rest is terminal multiplexing.

Try today  VERDICT

If you already run Claude Code or Codex in parallel terminals, harp is a weekend install. It fails you if you need a maintained vendor relationship: this is a personal fork with a copyleft license, and the README is the whole support department.

The repository

📊 THE ATTENTION GAP
HN points at 06:30 IDT. Attention, not quality.
PHP 8.2.35 release thread
971 HN
eMudhra keys cracked follow-up (Helme)
816 HN
PHP Foundation: strengthening security
679 HN
LiteLLM PyPI compromise
436 HN
Claude Duet
316 HN
ALSO ON THE RADAR

Mistral Large 4 trends two weeks late. The 1-trillion-parameter, 52B-active open-weights preview, "le Chonk", was announced October 6 and surged on HN yesterday. Weights were promised by end of month; none on Hugging Face as of this morning. Mistral →

OpenAI publishes "Patch the Planet". A coordination post for global response as agents uncover critical vulnerabilities. It pairs with the php2shell-checker repo from report 01: OpenAI’s site is script-walled to anonymous readers, so we verified the title, the URL and the HN thread, not the body. OpenAI →

Qwen3-Coder writes worse code for a US persona. Hirundo measured more security vulnerabilities when the prompt implied an American user. Their benchmark design, their numbers; read the methodology before citing it. Hirundo →

Cloudflare’s audit skill tops GitHub trending. security-audit-skill packages multi-phase security audits as a coding-agent skill with machine-readable findings: 36,800 stars, MIT, trending near 2,000 stars a day. GitHub →

📺 VIDEO OF THE DAY
Video thumbnail
Qwen 3.8 at 200 tok/s on M5 Max!
Code Bear · published Oct 21 · 624 views at 06:26 IDT · description read, not watched

A vendor says its new engine, lithos-metal, runs Qwen 3.8 27B above 200 tokens a second on an M5 Max. Code Bear reads the fine print: the promo shows peak 201 and average 175 on one prompt, the README’s 168 is a projection, and the vendor’s own measured run came out near 80. His Mac cannot install it, it needs macOS 26, so he rebuilds the underlying trick, speculative decoding, on an M4 Pro with mlx-lm: Qwen3-8B as the big model, Qwen3-0.6B guessing ahead, and code generation jumps from 47.5 to 84.3 tokens a second, above his machine’s own memory-bandwidth limit. Channel, date, view count and the full description verified this morning; we did not watch, so treat this as a pointer, not a review.

Watch on YouTube →

🗂️ THE BORING STUFF

Oct 21 · Node.js security releases. The October security drop patches CVEs across the active release lines, starting with CVE-2026-105482. Versions and upgrade notes on the project blog. Node.js blog →

Oct 21 · GitLab critical patch release. 19.5.1 plus six backports, 19.4.3 through 18.11.13, fixing what the changelog rates a CVSS 10.0 integer overflow. Self-managed instances should update today. GitLab Docs →

Oct 21 · musl libc regex overflow. CVE-2026-107891: multiple integer overflows in regcomp that can mis-size allocations and write out of bounds on the heap. Alpine and embedded people, this one is yours. oss-security →

Oct 21 · DuckDB 2.0.0 LTS "Cinnamon Teal". The analytical database’s second major version lands as a long-term-support release. Migration notes and the support window are in the announcement. duckdb.org →

Official pages read this morning. Nothing installed or run; their numbers are theirs.
🧪 ONE THING TO TRY TONIGHT
Find out if LiteLLM 1.107.0 touched your fleet.
Run pip show litellm on one production host and one dev laptop. If the answer is 1.107.0, that host’s credentials are spent: the SafeDep post lists the indicators, and the honest fix is rotate, rebuild, and check for cook.pth in site-packages. Five minutes for the check; longer if it finds something.
What this issue could not see. HN, Lobsters, dev.to, Product Hunt’s feed, GitHub, Reddit’s RSS (LocalLLaMA and MachineLearning; rank only, no scores) and the linked primary sources were read, including the Wiz PHP2Shell post, SafeDep’s LiteLLM analysis, the Claude Duet product page, Railway’s disclosure, the mitmproxy commit, the php2shell-checker README and harp’s repo. X mirrors returned no usable data, Bluesky refused anonymous API reads, LinkedIn is a login wall and r/programming blocks RSS, so those four are not covered. OpenAI’s blog is script-walled to anonymous readers, so the Patch the Planet strip item is its verified title plus the HN thread. YouTube was read via page metadata and description, not watched. Nothing was installed or run. Benchmark, market-share and performance numbers are vendor or author claims as labeled. Deduped against every published issue: PHP2Shell is the landed release of the No. 018 pre-announcement, the mitmproxy commit follows the No. 018 eMudhra story, and Mistral Large 4 is not the No. 017 Timestral or the No. 018 Voxtral 3.
Images: credited in each report; source screenshots and announcement artwork, not our tests.