On this page
- What did Heroku actually say?
- Why is a redeploy needed?
- Which Heroku PHP version is the fixed one?
- The 8.1.34 trap
- How do I confirm my Heroku app runs a fixed PHP?
- Am I affected? A three-state self-test
- Who is in scope on Heroku?
- Was my Heroku app exploited before I redeployed?
- Is there a newer PHP issue on Heroku?
Heroku published fixed PHP runtimes for PHP2Shell (CVE-2026-109618 and CVE-2026-109619) on 21 October 2026 and tells customers to redeploy their apps to pick them up. An app that has not been deployed since still runs the old runtime. Check the build output of your latest deploy for a fixed version.
| Fact | Detail | Source |
|---|---|---|
| CVE ids | CVE-2026-109618 and CVE-2026-109619, remote code execution in PHP core, CVSS v4 9.2 for the first | GHSA-w8hw-w9fx-j79w, GHSA-6wmf-4rv5-p3rp |
| Disclosed | 21 October 2026, 14:00 UTC | PHP notice |
| Fixed upstream releases | 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 | PHP notice |
| Heroku's statement | Fixed runtimes available 21 October 2026; "Redeploy your apps to pick up the fixed versions" | Heroku changelog |
| PHP 8.1 | 8.1.34 on Heroku-22 rebuilt with the PHP project's backport; Heroku calls it a minimal mitigation, not a supported release | Heroku changelog |
| Heroku's evidence for your app | None published. No per-app status, no restart time | Heroku changelog |
| Exploitation | Attempts in AWS honeypots from 17 October (vendor-claimed) | AWS |
| Checked | 26 October 2026 | this page |
What did Heroku actually say?
Heroku's changelog entry, dated 21 October 2026, is the only PHP2Shell statement from Heroku we found at our check on 26 October 2026. It lists four new runtimes: PHP 8.2.35, 8.3.36, 8.4.27 and 8.5.12. It says the new versions fix the two critical remote code execution flaws, and that customers should redeploy to pick them up (Heroku changelog).
The entry gives a date but no time of day, no per-app status and no list of apps still on an old build. Heroku's later stack update on 22 October lists no PHP packages (Heroku changelog, 22 October). Nothing Heroku has published tells you which runtime your own app runs. Other platform hosts have the same gap, for example Render and Fly.io, and there are more host-by-host checks.
Why is a redeploy needed?
A Heroku PHP app gets its runtime when it is built. Heroku reads composer.lock, or composer.json if there is no lock file, and installs the newest PHP version that matches your constraint (Heroku, Specifying a PHP runtime). If you declare nothing, you get the newest version available on your stack (Heroku, PHP behavior). A build made before 21 October picked the older runtime, and the running release still carries it.
Heroku also warns against exact pins: "Never specify an exact version like 8.4.27" (Heroku, Specifying a PHP runtime). The reason applies here. A constraint such as ^8.4.0 lets a rebuild move to the fixed release, while an exact pin to an older number keeps the old runtime on every rebuild.
Which Heroku PHP version is the fixed one?
Heroku's PHP support page lists these runtimes per stack at our check on 26 October 2026 (Heroku, PHP support).
| Branch | Fixed runtime on Heroku | Stacks that list it | Branch status |
|---|---|---|---|
| PHP 8.5 | 8.5.12 | heroku-22, heroku-24, heroku-26 | Active support to 31 Dec 2027 (php.net) |
| PHP 8.4 | 8.4.27 | heroku-22, heroku-24, heroku-26 | Active support to 31 Dec 2026 (php.net) |
| PHP 8.3 | 8.3.36 | heroku-22, heroku-24 | Security fixes only, to 31 Dec 2027 (php.net) |
| PHP 8.2 | 8.2.35 | heroku-22, heroku-24 | Security fixes only, to 31 Dec 2026 (php.net) |
| PHP 8.1 | 8.1.34 (rebuilt with backport) | heroku-22 only | End of life; Heroku says it will receive no further updates |
Branch dates are from php.net's supported versions page, read 24 October 2026. Heroku-22 is deprecated and reaches end of life on 30 April 2027 (Heroku, Stacks; Heroku changelog). An app on PHP 8.1 therefore has two clocks running. The longer read is on PHP 8.1 and older.
The 8.1.34 trap
PHP 8.1.34 is the one number where the version tells you nothing. Heroku rebuilt 8.1.34 on Heroku-22 with the backport and kept the number (Heroku changelog). An app built before the rebuild and an app built after it print the same php (8.1.34) line.
For PHP 8.1 on Heroku the evidence is the date of your latest deploy, not the version. A deploy on 22 October 2026 or later is the cautious reading, because Heroku's entry gives no time of day for the rebuild. If your last deploy was on 21 October, ask Heroku when the rebuilt runtime was available. Heroku calls the result a minimal mitigation rather than a supported release (Heroku changelog).
How do I confirm my Heroku app runs a fixed PHP?
Do this for every app, including staging, review and worker apps. Each Heroku app has its own releases.
- Run
heroku stack -a <app>and note the stack. The fixed runtimes depend on it - Open
composer.jsonandcomposer.lock. Note thephpconstraint and make sure it is not an exact pin to an older number - Redeploy from your normal pipeline so Heroku builds a new release
- Read the build output for the line under "Installing platform packages", such as
php (8.4.27), and compare it with the table above - Run
heroku releases -a <app>and confirm the newest Deploy release is the one you just made - Save the build output, the release number and the time. This is your evidence
If you deploy a Docker image on the container stack, Heroku's stack update says you must rebuild your image to pick up base image updates (Heroku changelog, 22 October). Then the PHP is whatever your Dockerfile installs, and the changelog above does not apply. See the Docker image page. Custom buildpacks are also outside what Heroku's notice covers.
What do I ask Heroku support?
Use this when a deploy cannot be done this week, or when you need a time for a PHP 8.1.34 build.
For app [app name] on stack [stack], is the PHP runtime that serves web requests patched for CVE-2026-109618 and CVE-2026-109619? Please give the runtime build or backport identifier, the date and time the fixed runtime became available on this stack, and confirm whether I need to redeploy or change a setting for this app.
Keep the reply with its date. Heroku's documentation does not say what support can see for a given app, so treat the reply as one piece of evidence next to your own build output.
Am I affected? A three-state self-test
Am I affected? Where you stand right now
A passive check from outside can only give you the first two states. Only your build output and release history, or Heroku, give you the third.
- Detected Your app serves PHP and the version visible from outside is below the fixed release for its branch. Redeploy today and read the new build output. A visible version can also be a backport, so the version alone does not settle it.
- Unknown Your app serves PHP and the version is hidden, or the last deploy date is not known to you. This is the common case. Heroku's changelog covers its platform, not your app. Get the build output and release time yourself.
- Confirmed by owner evidence You have a build output with a fixed runtime and a release made after it, for every app that serves PHP. The runtime is patched. For PHP 8.1.34 the evidence is a deploy after the rebuild. The open question is whether anything got in from 17 October until then.
No scan, ours included, moves you from "unknown" to "confirmed"; [what a checker can and cannot confirm](/learn/php2shell-checker-what-we-can-confirm) explains why.
Who is in scope on Heroku?
Any app that serves web requests through PHP. The PHP project says every PHP installation serving web requests is in scope, including PHP-FPM, mod_php, CGI, FrankenPHP and LiteSpeed (PHP notice). Heroku's PHP buildpack runs Apache or Nginx with PHP, so a PHP app is in scope until it runs a fixed build (Heroku, PHP support).
Apps on Node.js, Ruby, Python or Java are not affected by these two CVEs. A WordPress or Laravel app on Heroku is, because the flaw sits under the framework. Updating WordPress, plugins or Composer packages does not change the PHP runtime. The wider explanation of the flaw is in our PHP2Shell explainer, and patching the PHP runtime is covered for other platforms.
Was my Heroku app exploited before I redeployed?
Nothing on Heroku's side tells you, and we cannot see it from outside. The indicators of compromise to look for are on their own page. AWS reported PHP2Shell attempts against its honeypots from 17 October 2026, four days before disclosure, and says "it remains unclear" whether any would have succeeded on real systems. It also reports broad attempts after disclosure (AWS Security Blog). The running tally is in what is known about exploitation. At our check on 24 October 2026, neither CVE appeared in the part of the CISA catalog that we could read. Search it directly before relying on that.
Heroku dynos discard local file changes whenever they restart (Heroku, Dyno restarts), so files planted on a dyno rarely survive a restart. That does not cover everything an attacker could reach with code running in your app. Look at the places that persist: your database, admin users, scheduled jobs, add-on settings, and config vars. Rotate secrets the app could read if anything looks wrong. The steps are in the rotation guide.
Is there a newer PHP issue on Heroku?
The PHP project posted an informational notice on 23 October 2026 for CVE-2026-115560, a separate issue that needs an unusual session configuration, with a full advisory promised for the next release (php.net). It is a different problem from the two PHP2Shell CVEs. We found no Heroku statement about it at our check. We will update this page when one appears.
Questions people ask
Is Heroku patched for PHP2Shell?
Heroku published fixed PHP runtimes on 21 October 2026 (8.2.35, 8.3.36, 8.4.27 and 8.5.12) and a rebuilt 8.1.34 on Heroku-22. Its changelog tells customers to redeploy their apps to pick them up. Your app is only fixed after a deploy that happened after those builds.
Do I have to redeploy my Heroku app, or is a restart enough?
Heroku's own notice says to redeploy. A restart or a config change creates a new release and restarts dynos, but Heroku's documentation does not say that either one installs a newer PHP runtime. Follow the changelog and push a new build.
My Heroku app says PHP 8.1.34. Am I patched?
You cannot tell from the number. Heroku rebuilt 8.1.34 on Heroku-22 with the PHP project's backport and kept the version number. Only a deploy made after the rebuild contains it, and PHP 8.1 is end of life, so plan a move to a supported branch.
Where do I see which PHP version my Heroku app runs?
Heroku prints the resolved runtime in the build output of every push, as a line such as php (8.4.27) under Installing platform packages. Compare it with the fixed numbers, then check heroku releases to confirm the running release is that build.
Does updating WordPress or my Composer packages fix PHP2Shell on Heroku?
No. The flaws are in PHP itself, so application and package updates do not close them. The fix is a build with a patched PHP runtime, which on Heroku means redeploying so the buildpack installs one.
Was my Heroku app hacked before I redeployed?
Nobody can tell from outside. AWS saw attempts against its own honeypots from 17 October, and says it is unclear whether they would have worked on real systems. Look for files, admin users and scheduled tasks you did not create, and rotate secrets if anything looks wrong.
Sources
- Heroku changelog: PHP updates - October 2026 (CVE-2026-109618 and CVE-2026-109619), 21 October 2026Heroku's only PHP2Shell statement we found. Fixed runtimes, the PHP 8.1.34 backport on Heroku-22, and the instruction to redeploy.
- Heroku Dev Center: PHP support (versions by stack)Fixed runtime numbers per stack and the end-of-life status of PHP 8.1, 8.2 and 8.3. Read 26 October 2026.
- Heroku Dev Center: Specifying a PHP runtimeHow composer.json and composer.lock choose the version, and the build line that prints it.
- Heroku Dev Center: PHP behavior on HerokuDefault runtime selection when no version is declared.
- Heroku Dev Center: Dyno restartsWhen dynos restart, including on deploy and the daily cycle.
- Heroku Dev Center: ReleasesWhat creates a release; the heroku releases command.
- Heroku Dev Center: StacksHeroku-22 is deprecated; heroku-24 is the default; how to read your app's stack.
- Heroku changelog: Heroku-22, Heroku-24 and Heroku-26 stacks updated, 22 October 2026Stack package update that lists no PHP packages. Apps on the container stack must rebuild their image.
- PHP security notice, 21 October 2026 (php.net)Both CVEs, fixed releases, scope, backports for 8.1 and older. Also carries the 23 October notice for CVE-2026-115560.
- GHSA-w8hw-w9fx-j79w: CVE-2026-109618 (php/php-src advisory)
- GHSA-6wmf-4rv5-p3rp: CVE-2026-109619 (php/php-src advisory)
- PHP supported versions (php.net)Which branches still get security fixes. Read 24 October 2026.
- Amazon Threat Intelligence: PHP2Shell exploitation attempts seen in MadPot honeypots before disclosure (AWS Security Blog)Vendor telemetry. AWS says it is unclear whether the attempts would have succeeded on real systems.
- CISA Known Exploited Vulnerabilities catalogNeither CVE appeared in the part of the catalog we could read on 24 October 2026. Search it directly before relying on that.
Facts on this page are dated and point at the primary source next to them. If a vendor status changes after the date shown, the vendor's page wins; tell us at support@run.cloud and we will update it.