hamsa software
← All articles
AI developments7 min read

Why replacing a compromised key may not end an incident

A saved replacement, a running service and an attacker’s existing access can change at different times. Railway’s guidance explains why that matters; PingCAP and PHP show where the next job differs.

Three isolated geometric forms occupy separate boundaries: an interrupted enclosure, a detached duplicate and a repaired seam. No connecting line joins them.

A new key can leave old access working

You replace the compromised key, redeploy the application and watch the dashboard turn green. Finally. The service works again, but the dashboard is not checking whether someone else still has access. Railway’s Google Cloud guidance highlights the awkward detail: disabling a service-account key doesn’t necessarily stop tokens already issued through it.[2][3]

Think of the key as a machine that prints visitor passes. Switching off the machine stops it printing more; it doesn’t cancel the passes already in people’s pockets. Those need separate attention. Before closing the incident, check that the application uses the replacement and when the old tokens expire—or what action will stop them working sooner.

The green dashboard answers whether the application works. You still need to know who can get in. The PingCAP and PHP notices published that week raise different questions: what information was copied, and which runtime needs repair? Following each one makes the work clearer. This article uses their notices and guidance available on 22 October.

Railway: follow the key beyond the dashboard

Railway’s 21 October disclosure concerned systems holding customer environment variables. An unauthorised party may have accessed encrypted values and obtained some decrypted contents. The company recommended precautionary rotation of stored secrets and a review of activity in the services they could access, while it investigated which accounts were affected.[1]

An environment variable can hold a database password, cloud key or model-provider token. Railway stores the value, but another service decides what it permits. A problem at the hosting supplier can therefore send a small team into several other accounts, each with its own way to replace credentials and check their use.

Railway’s Google Cloud guidance makes the deployment step explicit: editing the variable stages a new configuration; the running service uses the replacement after deployment.[2] The dashboard can look correct while the application still uses the old key. Check the active deployment and its successful calls to Google, rather than stopping at the saved value.

Those visitor passes are separate credentials, with their own lifetime. Google gives service-account access tokens a default lifetime of up to 60 minutes, with longer lifetimes possible under additional configuration. Disabling the account or applying an appropriate deny policy can block remaining access; disabling the account also interrupts legitimate workloads using it.[2][3] The choice therefore affects both the suspected intruder and the service you are trying to restore.

Record when the replacement was deployed and how remaining token access was addressed. Account-level intervention has an operational cost, so follow Google’s instructions for the relevant configuration and the wait before re-enabling access. A working replacement alone is no reason to shorten that wait. Keep the token lifetime with the response decision, so the colleague taking over can see why an account is still disabled even though the new deployment is ready.

Railway’s AWS guidance also calls for checking CloudTrail in every Region for unfamiliar users, roles, keys and resources.[4] An attacker-created identity may need separate attention after the exposed key is withdrawn. For the person managing the account, this is the reason to investigate activity during the exposure window: replacing the original entry point may leave another one behind.

Three checks within Railway’s Google Cloud response

A saved key, an active deployment and tokens issued earlier can change at different times.

  1. Stored configurationReplacement saved

    The new service-account key is present in the Railway variable. The running workload still needs its deployment.

  2. Running workloadReplacement deployed

    Check that the active service uses the replacement. Investigate access obtained through the old key separately.

  3. Issued accessRemaining authority addressed

    Tokens already issued through the old key are considered separately, using their lifetime and the relevant account or deny-policy response.

Based on Railway’s 22 October guidance and Google’s credential-response documentation. Follow the provider’s instructions for token lifetimes and account-level intervention, including the effect on legitimate workloads.

PingCAP: find out what was copied

PingCAP’s 19 October report describes access between 9 September and 7 October using stolen service-account credentials. Data and source code were copied. The company began disabling affected credentials when it discovered the incident on 7 October and reported the identified access paths blocked by 14 October.[5]

The material included account and product-use records, SQL-editor material and business information. Investigators found no evidence of attacker commands or persistent access in the production systems they reviewed. Customer-specific exposure remained under investigation.[5] Those details matter together: the production review gives some reassurance, while the copied records create a separate problem for customers.

Blocking the access route stops further requests; it cannot bring back information already copied. I would ask which of my organisation’s records appeared in the exported material, and whether their contents could affect another contact, connection or secret. The reported categories do not mean every customer lost every kind of information. A customer needs the details of their own exposure before deciding which other relationships require attention.

PHP: repair the machinery before the login check

PHP’s 21 October advisory announced fixes for two critical remote-code-execution vulnerabilities: flaws that can let an attacker run code on a server. Fixed releases are 8.2.35, 8.3.36, 8.4.27 and 8.5.12; distribution-package users should check their vendor’s patched builds.[6] This was a vulnerability announcement, rather than another confirmed breach.

The out-of-memory advisory explains a particularly consequential path. Memory exhaustion can interrupt a request while PHP’s internal request data is partly initialised. Error handling leaves that work unfinished, then shutdown processing can encounter the invalid state. On Apache’s mod_php, this can happen before application code begins.[7] The application’s login check has not had a chance to help.

The repair belongs in the PHP runtime processing the request. Adding authentication inside the application leaves the earlier failure untouched. Nor does a small website escape the problem by being uninteresting: its requests can use the same affected machinery as those of a much larger service.

The advisory identifies updating as the complete mitigation and explains why configuration workarounds are incomplete.[7] Confirm the patched package and the runtime used by active PHP workers. An application deployment can leave those workers on their previous runtime, so the application’s release number is the wrong place to finish this check.

AI has different roles in these reports

Railway assessed that the incident belonged to a wider campaign targeting AI inference providers.[1] Here, AI describes the suspected target. The disclosure does not identify an autonomous agent as the attacker. For a business connecting an assistant to those providers, the immediate concern is still concrete: where is its credential stored, and what else could someone reach through it?

PHP describes AI helping defensive research and validation. Its Foundation explains why a remedy took time: competing fixes to a longstanding memory-management problem could break compatibility, introduce other risks or require changes across third-party extensions. Specialist capacity was limited.[8] A convincing demonstration can settle whether a bug is dangerous while leaving a difficult choice about how to fix it.

That is an engineering constraint worth keeping in view when a faster discovery process is celebrated. Maintainers still need to choose and implement a change that works for the software depending on them. Reproducing the failure makes the decision more urgent; it does not remove the compatibility work or supply more people who understand the engine.

The security team’s 14 October description shows AI helping examine reports, follow claimed failures and group reports sharing a root cause. People reproduce issues, assess severity and review patches. The team recorded 15 published CVEs since July and 106 reports closed as non-vulnerabilities, duplicates or failures to reproduce.[9] Those 106 were not all labelled AI-generated, so the total cannot tell us an AI accuracy rate. The useful detail is how the team checks a report before acting on it.

Leave the next person something they can use

I would make the recovery record answer an actual handover question. For a Railway-hosted service, can the next colleague find the active deployment, the credentials it uses and the response to old access? For a PingCAP customer, can they find the customer-specific exposure information? For PHP, can they identify the patched runtime serving requests?

A small team may divide that work between its infrastructure owner and business owner. Give each unresolved item a named owner and a place for the next result. The comparison below helps route those questions; it cannot replace the provider’s current response instructions for an affected system.

Three reports, different work to finish

Railway’s credential guidance, PingCAP’s copied records and PHP’s runtime fixes call for different follow-up work. The reports do not describe a shared attack.

Scroll sideways to see all columns.

ReportWhat happenedWork still to doWhere AI appears
Railway · 21–22 OctPossible exposure of stored secrets; response guidance issuedWhich accounts were affected and how credentials were used elsewhereAI inference providers described as suspected targets
PingCAP · 19 OctStolen service credentials; information and source copiedIdentify which records were copied for each customerThe report does not attribute the attack to AI
PHP · 21 OctCritical runtime vulnerabilities; patched releases availableConfirm patched PHP is serving requests; investigate suspected misuse separatelyAI-assisted defensive research and report validation
These are separate events. Follow the relevant provider’s response guidance: stopping access, assessing copied information and repairing a runtime address different problems.

Start with the running service

Open the recovery record for one affected service and compare it with what is running. If it says “key rotated”, can you tell which deployment uses the replacement and what happened to tokens issued earlier? That is a worthwhile check to do now. The application being available again should make the investigation easier to finish, rather than make its unfinished work disappear.

Working on a workflow like this? Hamsa helps finance and operations teams connect their tools and handle the exceptions, starting with one workflow.

See the Payment Operations Pilot

References & further reading

Primary sources behind this article. Living documentation may change.

  1. Railway: 21 October security disclosure Published 21 October 2026
  2. Railway: 22 October guidance for anomalous Google Cloud access Published 22 October 2026
  3. Google Cloud: responding to compromised credentials and issued tokens
  4. Railway: 22 October guidance for anomalous AWS access Published 22 October 2026
  5. PingCAP: 19 October security incident report and investigation scope Published 19 October 2026
  6. PHP: 21 October critical security advisory and fixed releases Published 21 October 2026
  7. PHP: out-of-memory corruption advisory, GHSA-w8hw-w9fx-j79w Published 21 October 2026
  8. PHP Foundation: the security release, research and engineering decisions Published 21 October 2026
  9. PHP Foundation: how the security team handles reports Published 14 October 2026
Hamsa Jama

Practical engineering. A human perspective.

More about Hamsa Software and the person behind it. Editorial notes.

A few more things
worth a read.

Back to the reading room
AI developments7 min read

What did the browser actually confirm?

Computer use needs an observation contract for account, object and outcome, especially when a visible click produces only partial completion.

AI developments7 min read

What comes with an AI model on your laptop?

Local inference offers a different operating boundary. Evaluate the completed task, data routes and maintenance responsibility before buying into it.