Most security problems live in an application's own code, so the application's own checks can be part of the answer. A runtime vulnerability is different. When the flaw sits in the language that runs every request, it can be reached before a login screen, before input validation and before any business rule. On 21 October 2026 the PHP project shipped emergency fixes for two flaws of exactly this kind, nicknamed PHP2Shell. RemitSo had the fix on all 23 of its servers within an hour. This guide uses that advisory to show how RemitSo's engineers handle a critical vulnerability, from the moment it is published to the moment every client installation is proven safe, and what that means for the money transfer operators who run on RemitSo.
The principle: the objective is not simply to deploy a security fix. It is to establish four things: what was updated, what was verified, what the investigation found, and whether further action is required. An incident is closed only when all four have a written answer.
RemitSo, a white label remittance platform, gives every client its own deployment in a dedicated AWS account. That shapes everything below: there is no single server to patch, there is a known list of installations, and each one has to be updated and checked on its own. Your team still owns your own decisions, such as telling your customers or your regulator about an incident, but you should never have to find out about a platform vulnerability before we do.
What PHP2Shell is, in plain terms
The PHP project published advance notice on 20 October and released fixes on 21 October 2026 for two vulnerabilities, each rated 9.2 out of 10 under CVSS 4.0:
- CVE-2026-109618: when PHP runs out of memory part-way through setting up a request, the clean-up step can treat half-built data as valid.
- CVE-2026-109619: internal state that belongs to one request can survive after its memory is freed, and a later request handled by the same worker can use it.
Under the right conditions, either could let an attacker run code on the server without signing in. Both sit in how PHP processes a request, which is why application-level protections cannot be relied on alone.
| PHP branch | Fixed release |
|---|---|
| 8.5 | 8.5.12 |
| 8.4 | 8.4.27 |
| 8.3 | 8.3.36 |
| 8.2 | 8.2.35 (8.2 reaches end of life on 31 December 2026) |
| 8.1 and older | No project release; minimal source backports, or a vendor fix, or an upgrade |
The PHP project, the UK's National Cyber Security Centre and AWS all said the same thing: updating is the only complete fix. Temporary settings and firewall rules reduce exposure while you patch. They do not make an installation safe, and AWS notes that the second flaw is largely out of reach of any web application firewall.
PHP2Shell at RemitSo: patched on 23 servers within an hour
When the PHP project released its fixes on 21 October, RemitSo's engineers had the patched runtime on all 23 servers that run client installations within an hour. That speed did not come from heroics on the day. It came from the groundwork described in the rest of this guide: a list of every installation and what it runs, a pipeline that can rebuild and redeploy each one, and a habit of proving a fix rather than assuming it.
For clients: nobody had to raise a ticket, book a window or patch anything themselves. The fix reached every installation as a security fix, which is never held for office hours.
From advisory to a closed incident
The response follows the same path whatever the vulnerability:
Advisory published → find every installation → read what the flaw really reaches → contain → patch the runtime → prove the fix → validate critical operations → look back for compromise → assess customer impact → close with four answers → tell clients → improve.
Know where you run, before the advisory arrives
The first question in any incident is "where are we exposed?" Teams that answer it by logging in to servers one by one lose the first day. RemitSo answers it from records it keeps all the time:
- A known list of installations. Every client runs its own deployment, and every environment, staging and production, shows exactly which release it runs. "Which version are we on?" always has an answer.
- A software bill of materials. Each installation can list every third-party component it is built from, with its version and licence, in the format auditors and security scanners read. When an advisory names a component, the question "do we use it?" takes minutes.
- An infrastructure picture. Each installation can draw its own hosting estate: the domain names requests arrive on, what answers them, and the database, queue and storage behind them. That tells the team which part of the stack a runtime flaw would touch.
Useful test for any platform you rely on: ask your provider how long it would take them to list every environment running a given component, and which version each runs. If the answer is "we would need to check", the first day of an incident will be spent checking.
Read the advisory, not just its score
A 9.2 score says how bad a flaw can be. It does not say whether it reaches you. RemitSo's engineers assess exposure from what the advisory actually describes: which request path is affected, which settings make it worse, and whether that path exists in how our installations are built and hosted.
The same habit applies to everyday dependency alerts. Automated audits run against the platform's dependencies, and each finding is read for what it actually does before anyone decides how urgent it is. Two rules come out of that:
- An advisory with no fix in the version line we run turns an upgrade into security work. A framework upgrade planned as modernisation stops waiting its turn when it is the only way to close an advisory.
- "Nil exposure" is written down, with the reason. When a flaw cannot reach us, the reasoning is recorded, so the next person does not have to rediscover it. If it can be fixed cheaply anyway, it is fixed.
Contain, then patch the runtime everywhere
Where a fix is not yet in place, the published temporary mitigations reduce exposure. They are treated as a stopgap, never as the fix.
The fix itself means replacing the runtime, not just the application. In practice:
- Rebuild from a corrected base. The runtime an installation runs is rebuilt from the patched release, not edited in place.
- Deploy to every installation. Each client's deployment is updated through the normal release pipeline. Security and stability fixes are not held for office hours: they can go out any day, including weekends.
- Replace what was running. A new image does not help if old workers are still serving requests, so running instances are replaced, not assumed to have picked it up.
- Keep the checks that matter. Critical journeys, such as a quote, a payment and a payout, are checked after the change, without letting ordinary release scheduling delay an urgent fix.
Prove the fix, installation by installation
"We deployed it" is not the same as "every installation runs it". RemitSo closes that gap in two ways:
- Coverage, not hope. Each release is tracked against every client installation, staging and production, so the team can see how many production installations run the fixed release and which, if any, do not yet.
- Evidence that does not change. When a fix is proven on a real installation, the proof is recorded as a sealed evidence record: what was claimed, whether it passed, where, on which version and when, with the files that prove it. Sealed records cannot be edited. A newer record can only supersede an old one.
A security fix is verified the way its advisory is described: against the patched versions it names, one by one, rather than by trusting a summary that says "no issues found".
Validate the critical operations
A patched runtime that breaks payouts is a second incident. So after the fix, the operations that move money are checked one by one, on each installation, using the same pages your team uses every day:
| Operation | What is checked | Where a problem would show |
|---|---|---|
| Sign-in | Customers and staff can sign in, and one-time codes arrive | Login sessions |
| Quotes and rates | A live corridor prices a quote; rate feeds are still moving | The "Exchange rates not moving" alert |
| Money in | Payment providers' messages arrive and are applied | Webhook log; Scout's "Payments awaiting a provider answer" |
| Money out | Payouts are sent and partners answer | Outbound API log; Scout's "Payouts needing action" |
| Screening | The nightly sanction list load runs and its signature verifies | Sanction Lists page; the "Sanction lists could not be loaded" alert |
| Books | Payments, payouts and refunds still post to the accounts | Accounting balances |
| Background work | Nothing piles up in the job queue | Failed queues; Scout's system health |
Scout measures its figures every five minutes, so after a change the team can watch each one settle back to normal rather than wait for a customer to notice.
Look back for signs of compromise
Patching stops future exposure. It does not prove nothing happened before the patch. The look-back uses records the platform keeps anyway:
| Record | What it shows |
|---|---|
| Audit log | Every change made in the admin panel, by date, event, record and member of staff, with values before and after |
| Login sessions | Every staff and customer sign-in, with time, IP address, device and whether two-step sign-in was completed |
| Outbound API log | Every call made to a partner or provider, with secrets masked, so unexpected outbound activity stands out |
| Webhook log | Every incoming message from a provider, saved before it is processed |
| Error monitoring | Unexpected failures, which can be the first sign of something probing the platform |
Watch out: a clean log is not proof that nothing happened. If anything suspicious is found, evidence is preserved before anything is cleaned up, secrets are rotated, and affected clients are told directly.
Assess the potential customer impact
A money transfer platform serves two groups: the operator's team and the operator's own customers. Before an incident is closed, each installation gets an impact statement that answers the questions both groups would ask:
- The window. From when was the installation exposed, and when was it patched?
- Data. Could customer or staff data, such as profiles or identity documents, have been reached, and does any evidence say it was?
- Money in flight. Were any transfers delayed, failed or sent twice during the window or the fix?
- What customers saw. Did anyone meet an error or an outage in the app?
- Secrets. Could any credential, such as a key to a payment or payout partner, have been exposed? If so, it is rotated.
"Potential" matters here. The statement separates what could have been reached from what the evidence shows was reached, so nobody under-reacts or over-reacts. Deciding whether to tell your customers or your regulator stays with you. Our job is to give you facts you can rely on when you make that decision.
Close the incident with four answers
The objective is not simply to deploy a fix. Each installation's incident record answers four questions, each backed by evidence:
| Question | What the answer covers | The evidence behind it |
|---|---|---|
| What was updated? | Every installation, the runtime release it now runs, and when | Release coverage per installation and the deployment record |
| What was verified? | The running version on every instance, and each critical operation | Sealed evidence records; Scout figures back to normal |
| What did the investigation find? | The look-back result and the customer impact statement | Audit log, login sessions, outbound and webhook logs, error monitoring |
| Is further action required? | Anything left to do, such as rotating a secret, an app change or a hardening task, or "nothing", with the reason | Each action with an owner and a deadline |
Rule of thumb: "probably fine" is not one of the answers. If any of the four cannot be answered with evidence, the incident stays open.
Tell clients what they need, when it is safe to
Security communication has two jobs that pull against each other: clients need to know, and detail published too early helps attackers more than defenders. RemitSo's release notes handle both:
- Every release says whether it contains a security fix, and whether it needs downtime or a maintenance window.
- The detailed security note is shown only once every production installation has the fix. Until then, a client knows a security fix is coming without the release notes describing how to exploit an installation that has not been updated yet.
- Actions a client must take are spelled out, such as a setting to review or an app change to make, rather than buried in technical notes.
What this means for a money transfer business
| When a critical advisory lands | On your own stack | On RemitSo white label |
|---|---|---|
| Finding out | Your team must be watching the right advisories | Our engineers track them for the platform |
| Knowing if you are exposed | Inventory every server, image and service | Every installation's release and components are already known |
| Patching | Your engineers, your weekend | Security fixes deployed to your installation any day |
| Proof for your auditor | Whatever your team wrote down | Release coverage, sealed evidence, ISO 27001-certified processes |
| Telling your customers and regulator | Your decision | Still your decision, with the facts in a business note you can rely on |
For your customers, the benefit is mostly invisible, and that is the point: their money keeps moving, their data stays where it belongs, and nobody has to explain an outage that a patched runtime would have prevented.
A response checklist you can use on any runtime
If you run your own stack, including on RemitSo source code, this is the checklist we work to:
- Keep a live list of every environment, the runtime and version it runs, and its owner.
- Keep a software bill of materials for each one.
- When an advisory lands, list affected environments within hours, internet-facing first.
- Read what the flaw reaches; record "not exposed" with the reason.
- Apply official temporary mitigations only as a stopgap, and restart workers so they take effect.
- Rebuild from the patched runtime; replace running instances.
- Verify the running version on every instance, not just the image tag.
- Check every operation that moves money: sign-in, quotes, payments in, payouts out, screening, the books and background jobs.
- Preserve logs and look back for compromise before you declare it closed.
- Write an impact statement per environment: the window, what could have been reached, what the evidence shows, and what customers saw.
- Close only when you can say what was updated, what was verified, what the investigation found and whether further action is required.
- Tell the people who depend on you what they need to do, without publishing exploit detail early.
- Plan upgrades off end-of-life runtime branches before the next advisory forces it.
Doing it with RemitSo
Security is built into how RemitSo is run, not added when an advisory arrives: ISO 27001:2022 certified processes, a dedicated AWS account per client, rate-limited sign-in and verification codes, secrets masked in every log, and dated releases tested on your staging first. Read how we work with established operators, see the admin features, follow every change in the release notes, or book a demo to ask our engineers how they would handle your next security review.
Sources: PHP security release, 21 October 2026; UK National Cyber Security Centre advisory; AWS Security Blog on PHP2Shell mitigations.
Frequently asked questions
What is PHP2Shell?
The name given to two critical PHP vulnerabilities, CVE-2026-109618 and CVE-2026-109619, fixed on 21 October 2026. Under certain conditions either could allow code to be run on a server without signing in.
Is a web application firewall enough?
No. Firewall rules can reduce exposure while you patch, but the PHP project, the NCSC and AWS all say updating is the only complete fix. AWS notes that one of the two flaws is largely out of reach of any web application firewall.
How quickly did RemitSo patch PHP2Shell?
Within an hour of the PHP project's fixed release on 21 October 2026, the patched runtime was on all 23 servers that run RemitSo client installations.
When is a security incident closed?
When four questions have a written, evidenced answer for every installation: what was updated, what was verified, what the investigation found, and whether further action is required.
Who patches a RemitSo white label installation?
RemitSo does. Security and stability fixes are deployed to each client's installation and can go out any day, including weekends.
How do clients find out about security fixes?
Every release says whether it contains a security fix. The detailed security note is shown once every production installation has the fix, so it never describes a gap that is still open somewhere.
We bought the source code. Does this apply to us?
You run your own installation, so you own the patching. The checklist above is the one our engineers work to, and critical fixes are included for six months after handover.