On this page
- Who patches PHP on Fly.io?
- Why does a restart not fix it?
- How do I patch a Fly.io app?
- How do I confirm what is running?
- What do I ask Fly.io?
- Am I affected? A three-state self-test
- What if my app is on PHP 8.1 or older?
- Was anything exploited on Fly.io?
- Is there a newer PHP issue to watch?
- What is the bug, without the exploit?
We found no PHP2Shell notice from Fly.io at our check on 26 October 2026, and none is needed to know who acts: Fly runs the container image you give it, so the PHP inside is yours. Rebuild the image on PHP 8.5.12, 8.4.27, 8.3.36 or 8.2.35, run fly deploy, then confirm the new release and a fixed PHP in a running Machine.
| Fact | Detail | Source |
|---|---|---|
| CVE ids | CVE-2026-109618 and CVE-2026-109619, CVSS v4 9.2 each | GHSA-w8hw-w9fx-j79w, GHSA-6wmf-4rv5-p3rp |
| Fixed upstream releases | 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 (8.5.12 and 8.4.27 dated 22 October 2026 in the changelog) | PHP notice, changelog |
| Fly.io status page | All systems operational, no PHP or CVE entry (26 October 2026) | status.flyio.net |
| Fly.io security page | No PHP2Shell notice found (26 October 2026) | fly.io/security |
| Who owns the PHP | You: Machines are built from the image you provide | Fly Machines docs |
| Exploitation | Honeypot attempts from 17 October (vendor-claimed); neither CVE in the CISA entries we could read | AWS, CISA |
| Checked | 26 October 2026 (Fly.io pages); 24 October 2026 (PHP, image and CISA sources) | this page |
Silence from a host is not a status, so we list Fly.io's own PHP2Shell status as unknown. Other incidents from the same weeks are on the October 2026 tracker, and the rest of the PHP2Shell pages are collected under all the PHP2Shell guides.
Who patches PHP on Fly.io?
You do. Fly's registry guide describes the split: you build, tag and push the image, and Fly runs it as a Firecracker VM. The Machines page says a Machine is created by fetching your container from the registry and building a root file system from it. Nothing in either page describes Fly updating packages inside your image.
The PHP project says every PHP installation serving web requests is in scope: PHP-FPM, mod_php, php-cgi, FrankenPHP and LiteSpeed (php.net, 21 October 2026). A Fly app is in scope the same way any container is. Which tool built it does not matter. If you also run PHP outside containers, patching the PHP runtime and restarting workers is covered separately.
| How the app was built | Where the PHP comes from | Your action |
|---|---|---|
fly launch for Laravel | A Dockerfile generated into your repository | Open it, update the PHP lines, redeploy |
Your own Dockerfile on an official php image | The base image tag at build time | Rebuild without reused layers, redeploy |
| Dockerfile on Ubuntu or Debian plus a package | The distribution package | Rebuild so the package step runs again, read the changelog |
image set in fly.toml | A prebuilt image deployed as is | Point at a rebuilt image tag you control |
| Buildpacks | A builder you chose | Ask who maintains that builder, then rebuild |
Fly's configuration reference says an image build is deployed with no build process, as is. That path never rebuilds anything for you. Image-based platforms such as Render and Heroku have their own answers.
Why does a restart not fix it?
A container keeps the PHP it was built with. Fly's fly machine restart page describes restarting one or more Machines, and says nothing about fetching a new image. We would not rely on a restart to change the PHP in your image.
fly deploy is the command that builds a new image and replaces running instances. Its default strategy is rolling, and --no-cache tells the builder not to use its build cache. The cache is the second trap. An apt-get install layer can be reused from before 21 October and still contain the old package.
The Fly Laravel guide says fly launch generates a Dockerfile and fly deploy redeploys after changes. It does not name the PHP version the file installs, so read your own file instead of trusting a default.
How do I patch a Fly.io app?
Run these from a machine or CI job that can build your image. Try them on a staging app first if you have one.
- Find the build path in
fly.toml: adockerfile, animage, or abuildersetting - Open the Dockerfile and read the first
FROMline and every PHP install line - Move the base to a fixed release, or to a distribution package that names both CVEs in its changelog
- Deploy with a fresh build:
fly deploy --no-cache -a <app> - Repeat for every app and process group that runs PHP, including workers, queues and staging
- Redeploy any app that shares the Dockerfile, so none keeps the old image
For the official php image, the library file lists 8.5.12, 8.4.27, 8.3.36 and 8.2.35 and no 8.1 or older tags at our check (docker-library). Ubuntu and Debian ship fixes under their own version numbers. Debian's tracker, for example, records 8.4.27-1~deb13u1 for trixie (Debian), and Canonical tells you to restart applications after the upgrade (Canonical). That is why a fixed package can still look old. Container steps in more depth are in the Docker image guide.
How do I confirm what is running?
Check what Fly is running, not what your repository says. Each of these reads state.
| Evidence | How to get it | What it shows | What it cannot show |
|---|---|---|---|
| Release image reference | fly releases -a <app> --image | The image of each release, in order (docs) | That every Machine runs the newest release |
| Image details | fly image show -a <app> | The current image of the app | Which PHP is inside it |
| PHP in a running Machine | fly ssh console -a <app> -C "<php binary> -v" | The build the process reports (docs) | A backport if the number is low; the command line binary can differ from FPM |
| Package changelog | Your distribution's tool inside the Machine | Both CVE ids named in the package | That the serving process uses it |
| Release time | The release list or your CI log | Deploy later than 21 October 2026 | The PHP version |
With several Machines, select each in turn with -s; the ssh console page says it lets you choose from the accessible Machines. A partial rollout can leave one on an old image.
What do I ask Fly.io?
Fly can see which image you deployed and when. It cannot see inside your PHP. Ask only about what Fly controls, and keep the reply.
For [app name]: which image reference and digest does the current release run, when was that release created, and are all Machines for this app on it? Is any PHP component in my deployment maintained by Fly rather than built from my own Dockerfile or
imagesetting?
If you use someone else's image, ask its publisher instead. This page on who is responsible helps decide who answers.
Am I affected? A three-state self-test
Am I affected? Where you stand right now
A passive check from outside can read headers and version hints. It cannot see your image reference, your package changelog, or when your Machines were replaced.
- Detected Your app serves PHP and a version below the fixed release for its branch is visible from outside. Treat it as exposed. Rebuild and run `fly deploy` today.
- Unknown The version is hidden, shows only a branch, or could be a backport. This is the common case behind a proxy. Fly has published no PHP2Shell status for your app, so the evidence has to come from your release and Machine.
- Confirmed by owner evidence You hold a release created after 21 October 2026 from a fixed base, and every Machine reports a fixed PHP or a package naming both CVEs. The runtime is patched. Whether anything got in earlier is a separate question.
No scan, ours included, moves you from "unknown" to "confirmed".
What if my app is on PHP 8.1 or older?
The PHP project says 8.1 and older no longer receive project releases (php.net), and the official image file lists no tags for them. Fly has no fix to offer for a branch upstream has dropped. Move to a supported branch and test, or use a vendor image whose changelog names both CVEs. The 8.1 and older guide covers the interim settings PHP recommends.
Was anything exploited on Fly.io?
We found no Fly.io statement on that, and no incident report tied to its platform. AWS reported PHP2Shell attempts against its honeypots from 17 October, four days before disclosure, and says it is unclear whether they would have succeeded on real systems (AWS Security Blog, vendor-claimed). Neither CVE appeared in the CISA catalog entries we could read on 24 October (CISA KEV). We did not search the whole catalog by CVE id, so check it yourself.
If your app was reachable and unpatched from 17 October, check for PHP files you did not upload, new admin accounts, scheduled tasks you did not create and unexpected outbound connections. A deploy replaces the Machines but does not tell you what ran in the old ones or what secrets they could read. The steps are in a post-compromise checklist for PHP2Shell.
Is there a newer PHP issue to watch?
On 23 October 2026 the PHP project posted an informational advisory for a separate issue, CVE-2026-115560, tied to session upload progress. It recommends session.upload_progress.enabled=0 until the next regular release (php.net). The changelog showed no 8.5.13 entry at our check (PHP 8 changelog). We will update this page when PHP publishes more.
What is the bug, without the exploit?
Both CVEs are memory-safety problems in the PHP engine, reachable by an unauthenticated web request. CVE-2026-109618 is remote code execution through out-of-memory handling that leaves a request partly initialised. CVE-2026-109619 is remote code execution through request state that outlives its memory and is reused by a later request (php.net). We do not reproduce exploit material, and you do not need it to fix an app.
Not sure which of your apps run PHP? The inventory guide shows how to list them. The free scan reads the stack your site serves and matches each version to known vulnerabilities. It is a lookup: it can say a version is affected, not whether your setup is exposed.
Questions people ask
Is Fly.io patched for PHP2Shell?
We found no Fly.io notice about PHP2Shell on its status page or security page at our check on 26 October 2026. Fly runs the container image you give it, so the PHP inside is whatever you built. The fix is a rebuilt image on PHP 8.5.12, 8.4.27, 8.3.36 or 8.2.35, deployed so the running Machines are replaced.
How do I check which PHP my Fly.io app is running?
List the deployed image with fly releases and its image flag, then connect to a running Machine with fly ssh console and ask the web PHP binary for its version. For FPM images use the FPM binary, not the command line one. A version number can mislead on Ubuntu and Debian, so also read the package changelog.
Does fly machine restart apply the PHP fix?
Fly's documentation describes restart as restarting existing Machines and does not say it fetches a new image. A fixed PHP reaches your app through a new image and a deploy. Check the deployed image reference afterwards instead of assuming.
I deployed with fly launch for Laravel. Where is my PHP version set?
In the Dockerfile that fly launch generated in your repository. Fly's Laravel page says the command creates a Dockerfile and does not name a PHP version. Open your own file, read the base image and PHP lines, update them to a fixed release, and run fly deploy.
Can a scan tell me my Fly.io app is patched?
No. From outside, a scan can read a version banner if the app exposes one. It cannot see your image, your package changelog or when your Machines were replaced. An outside result is detected or unknown. Only your own release and Machine details confirm it.
My app runs PHP 8.1. What do I do on Fly.io?
The official PHP image lists no 8.1 or older tags, so there is no fixed official image to move to on that branch. Move to a supported branch and test, or use a vendor image whose changelog names both CVEs. Fly does not change this for you.
Sources
- PHP security notice, 21 October 2026, with 23 October follow-up (php.net)CVE ids, fixed releases, scope, and the separate CVE-2026-115560 advisory. Checked 24 October 2026.
- GHSA-w8hw-w9fx-j79w: CVE-2026-109618 (php/php-src advisory)
- GHSA-6wmf-4rv5-p3rp: CVE-2026-109619 (php/php-src advisory)
- PHP 8 changelog (php.net)8.5.12 and 8.4.27 are dated 22 October 2026. No 8.5.13 entry at our check.
- Fly.io docs: Machines overviewA Machine is built from the container image you provide, fetched from Fly's registry.
- Fly.io docs: fly deployFlags --no-cache, --image, --strategy (default rolling) and the replacement of running instances.
- Fly.io docs: fly machine restartDescribes restarting existing Machines. The page does not say it fetches a new image.
- Fly.io docs: fly releasesThe --image flag shows the Docker image reference of each release.
- Fly.io docs: fly ssh consoleConnects to a running instance. -C runs one command, -s selects a Machine.
- Fly.io docs: app configuration (fly.toml), build sectiondockerfile, image and builder settings, and what each build path does.
- Fly.io docs: using the Fly Docker registryYou build and push the image; Fly runs it as a Firecracker VM. No PHP content on the page.
- Fly.io docs: Laravel on Fly.iofly launch generates a Dockerfile; fly deploy redeploys. The page does not name a PHP version.
- Fly.io statusAll systems operational, with no PHP or CVE entry, at our 26 October 2026 check.
- Fly.io security pagePlatform security overview. No PHP2Shell notice and no list of customer actions at our 26 October 2026 check.
- Docker Official Image: php (library definition)Lists 8.5.12, 8.4.27, 8.3.36 and 8.2.35, no 8.1 or older. Checked 24 October 2026.
- Debian security tracker: CVE-2026-109618Branch-specific fixed package versions that differ from upstream numbers.
- Canonical: PHP2Shell vulnerability fixes available (Ubuntu blog)Fixed packages per Ubuntu release and the instruction to restart applications after upgrading.
- Amazon Threat Intelligence: PHP2Shell attempts seen in MadPot honeypots before disclosure (AWS Security Blog, 21 October 2026)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 entries we could read on 24 October 2026.
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.