Skip to content

PATCH AGENT · PHP2Shell RESPONSE

Software breaks.The patchshouldn't wait.

PHP2Shell broke the runtime under a large share of the web. This agent watches the advisories, finds opted-in repositories still pinning a vulnerable PHP, and opens a tested pull request. Every step is public.

SYSTEM
…
CVE INGESTION
…
WORKER
…
DATABASE
…
TRACKED CVES
2
REAL PRS OPENED
…
  1. 01 · Request

    A request enters the stack.

    The browser hits the web server, which hands the request to PHP-FPM over FastCGI. One worker takes it, so every request runs in an isolated worker process.

  2. 02 · Execute

    PHP allocates memory for that request.

    The Zend Engine compiles the script to opcodes (cached by OPcache) and runs them, allocating from the per-request heap. When the request ends, that memory should be reset.

  3. 03 · PHP2Shell

    A fatal error leaves memory unsafe.

    Certain out-of-memory and fatal-error paths could leave request memory in an uninitialised state. The next request served by the same worker could then read or act on it. That is a memory-safety bug in the runtime, so every app on top inherits it.

  4. 04 · Patch

    The fix lives in the bottom layer.

    Application code doesn't change. The container image does: php:8.4.26-fpm becomes php:8.4.27-fpm. That one deterministic line is exactly what the agent opens a pull request for.

conceptual model · no exploit details

01 · The incident

One bug class. A foundation of the web.

W3Techs reports PHP as the most common server-side language among websites whose server-side language it can detect[w3techs-php]. That measures detectable websites, not the whole Internet.

PHP2Shell is a set of vulnerabilities in the PHP runtime itself, not in one plugin or framework. A well-written application still inherits exposure from the runtime underneath it.

Disclosed
21 OCT 2026
VERIFIED

PHP release branches

LIVElatest releases from php.net · 2026-10-22T10:24Z
  1. 8.5VULNERABLE < 8.5.12PATCH RELEASED 8.5.12latest on php.net: 8.5.12
  2. 8.4VULNERABLE < 8.4.27PATCH RELEASED 8.4.27latest on php.net: 8.4.27
  3. 8.3VULNERABLE < 8.3.36PATCH RELEASED 8.3.36latest on php.net: 8.3.36
  4. 8.2VULNERABLE < 8.2.35PATCH RELEASED 8.2.35latest on php.net: 8.2.35
  5. 8.1UNSUPPORTED: no upstream fix; migrate or use vendor-maintained packages
  6. 8.0UNSUPPORTED: no upstream fix; migrate or use vendor-maintained packages
  7. 7.xUNSUPPORTED: no upstream fix; migrate or use vendor-maintained packages
  8. 5.xUNSUPPORTED: no upstream fix; migrate or use vendor-maintained packages

Fixed versions per the PHP2Shell security releases [php-changelog-8] · support status [php-supported]

What version are you on?

PHP branch
8.4.

Runs entirely in your browser against the published fixed-version table. Nothing is sent anywhere.

02 · The AI inflection

Discovery got faster.Patching has to follow.

01 · FIND

AI-assisted research shortens the path from source code to a credible bug report, even in runtimes that survived years of scrutiny.

02 · DISCLOSE

Coordinated releases ship fixes, but disclosure also tells everyone where to look.

03 · REPAIR

Thousands of repositories each have to notice, bump, test and merge. That last mile is mechanical, and this agent automates it.

03 · Watch it work

What it's fixing. Why. Live.

FULL EVENT STREAM →
STREAM CONNECTINGWORKER …LAST RUN n/aWRITES OFFschedule */15 · single-flight

Current job

Every transition

  1. Connecting…
Authorized repositories
n/a
Patch attempts
n/a
Verified patches
n/a
PRs opened
n/a
PRs merged
n/a
Median time to patch
n/a
Success rate
n/a
Compute / merge
n/a

Try the patcher · the production code, running in your browser

Edit freely. This is the same planFile() and validateChange() code the agent runs, executing in your browser.

PATCH · VALIDATEDDockerfile
- FROM php:8.4.26-fpm-alpine+ FROM php:8.4.27-fpm-alpine  RUN docker-php-ext-install pdo_mysql opcache  COPY . /var/www/html  
  • php:8.4.26-fpm-alpine → php:8.4.27-fpm-alpine (line 1)
  • ✓ allowlisted file · in-place edit · ≤ 20 lines · no secrets · no shell

04 · Architecture

Every box is real code. Hover to inspect.

PUBLIC SOURCESuntrusted inputTRIGGERSwhen work startsAGENT · THIS SERVERtrusted code · no repo code runs hereGITHUB · OPTED-IN REPOSrepo content is data, never instructionPUBLIC EVIDENCEanyone can verifyNVDCVE API 2.0GitHub Advisories/advisories?cve_idCISA KEVknown exploited feedphp.net releasesreleases JSONnode-cron*/15 * * * *Backup cronPOST /api/internal/runInstall webhookinstallation_repositories.addedIngest + normalizeproviders.ts · lookupCve()Fixed-version tablephp-releases.tsSingle-flight runnerrunAgent()Orchestratoragent.ts · processRepo()Matcher / plannerpatcher.ts · planFile()Safety validatorsafety.ts · validateChange()Policy gatepolicy.ts · mayWrite()PR writergithub.ts · openPullRequest()CI + merge trackerwebhooks/github · checkSummary()Postgres (Neon)Prisma · 15 tablesEvent bus → SSE/api/v1/streamHealth probeshealth.tsApp installations/app/installationsRepo tree + blobsgit/trees · git/blobspatch-agent/* PRbranch · commit · pullRepository CIcheck runsSigned webhooksX-Hub-Signature-256/proofREAL-only ledger/status.jsoncomputed health/liveSSE streamllms.txtfor AI evaluators

One run, end to end

SchedulerAgentNVD / GHSAPostgresGitHub APIRepo CIPublic01 tick · */15 or backup cron02 GET cve record03 record + raw hash04 SourceRecord if hash is new → advisory.ingested05 installations → token → repositories06 git tree + blobs (≤ 40 files)07 planFile → validateChange → mayWrite08 branch patch-agent/* · commit · PR09 Patch(pr_opened) + pr.opened10 SSE + /proof (after persist)11 run checks on PR branch12 check_suite webhook (HMAC)13 Patch.ci = passed/total14 pull_request closed · merged15 pr.merged + merge sha → /proof

Full architecture, trust boundaries and data model →

05 · From disclosure to pull request

Eleven stages. Each one recorded.

  1. Advisories are pulled from NVD, GitHub Security Advisories and CISA KEV. Each record keeps its provider, record ID, source URL, retrieval time and a hash of the raw response.

06 · Verify · fund · read · opt in

Don't trust the agent. Verify it.

REAL-only ledger. Every row links to GitHub or NVD. Simulated records can never enter it.

[
  "kind"   => "pr.merged",
  "repo"   => "owner/repo",
  "url"    => "https://github.com/…/pull/…",
  "commit" => "<merge sha>",
  "mode"   => "REAL",
]

Compute has a cost. Show the receipts.

A public, read-only treasury pays for inference, database and RPC. No yield, no returns, no price claims.

  1. FEES→
  2. TREASURY→
  3. COMPUTE→
  4. PATCH
Treasury →

Autonomous patching: the whitepaper.

Twenty sections on the authorization model, threat model, prompt-injection defense, failure modes and limitations.

Opt in. Least privilege.

# .patchbot
version: 1
enabled: true
severity: [critical, high]
patches: { containers: true, dependencies: true }
verification: { require_ci: true }
Protect your repo →