All briefings
Optimus Labs · CivilizationsCRITICAL · LIVE INCIDENTS · KEY CUSTODIANS

Live incidents, as of Oct 21, 2026. LiteLLM and Railway are still investigating and this page will be updated.

Four Custodians of AI Provider Keys, Hit in Sixteen Days

Fireworks, OpenCode, LiteLLM and Railway all hold customers' AI provider keys or environment variables, and each has now been breached or backdoored. Attribution is unconfirmed.

CredentialInference

Organizations in this briefing

Fireworks AIFireworks AI
OpenCodeOpenCode
LiteLLMLiteLLM
RailwayRailway
AnthropicAnthropic
OpenAIOpenAI
GoogleGoogle

Key takeaways

3 min read
  • Live incidents as of Oct 21, 2026. Four companies that sit between teams and AI model providers had customer secrets exposed or targeted between Oct 6 and Oct 21: Fireworks, OpenCode, LiteLLM and Railway. Only OpenCode ties its breach to distillation. Railway calls its incident part of a series aimed at AI inference providers. LiteLLM and Fireworks have named no motive. Revoke at the provider, not at the custodian.
  • Blast radius: Any team that stored provider keys or environment variables with one of the four: Fireworks evaluation jobs, OpenCode Console workspaces, a LiteLLM proxy or host that ran version 1.107.0, or Railway service variables. LiteLLM receives about 23 million downloads a week, and its proxy keeps every upstream provider key in one database table.
  • CRITICAL · LIVE INCIDENTS · KEY CUSTODIANS

Timeline

  1. Fireworks finds unauthorized use of internal credentials

    Environment variables in evaluation jobs were captured in a limited number of accounts. It published its bulletin on Oct 9 (Fireworks).

  2. LiteLLM look-alike domain registered

    litellm[.]dev was created Oct 13 and updated Oct 18, per JFrog. The real project uses litellm.ai.

  3. OpenCode Console keys exposed and breach disclosed

    Earliest possible exposure 00:30 UTC. 1.4% of Console users, "related to a large scale distillation attack".

  4. LiteLLM release protections overridden

    Branch protection rejected a change to the private release workflow. Five seconds later a privileged developer credential overrode it (LiteLLM).

  5. Malicious litellm 1.107.0 live

    Seven PyPI wheels until 13:23 UTC. Docker tags latest, main-latest, main-stable and v1.107.0 were poisoned from 11:46 to 14:20 UTC.

  6. Railway detects anomalous activity

    Systems that store customer environment variables. Railway notified upstream providers to revoke keys and paused all deployments.

Blast radius
Any team that stored provider keys or environment variables with one of the four: Fireworks evaluation jobs, OpenCode Console workspaces, a LiteLLM proxy or host that ran version 1.107.0, or Railway service variables. LiteLLM receives about 23 million downloads a week, and its proxy keeps every upstream provider key in one database table.

Summary

Live incidents, as of Oct 21, 2026. On Oct 6, Fireworks found that someone had used internal credentials to read environment variables, including API keys, in a limited number of customer accounts. On Oct 17, OpenCode said a breach of its hosted Console may have exposed provider keys for 1.4% of Console users. On the morning of Oct 21, a poisoned LiteLLM release went out through PyPI and Docker with a credential stealer built to take the provider keys a proxy stores. The same day, Railway said someone may have read decrypted customer environment variables and paused all deployments. Railway also said it believes this is part of a series of attacks on platform companies, aimed at AI inference providers. No one has published a root cause that links all four.

Am I affected?

Any single yes means treat this as an incident.

  • Did a host, CI runner or container of yours run litellm 1.107.0, or pull the latest, main-latest or main-stable LiteLLM image, between 11:39 and 14:20 UTC on Oct 21?
  • Do you keep API keys or registry credentials in Railway variables, run Fireworks evaluation jobs with secrets, or save provider keys in OpenCode Console (briefing #13)?
  • Does provider billing since Oct 6 show models, volumes or regions you do not recognise?

Not affected if

  • LiteLLM says its private enterprise release and every version before 1.107.0 are safe. Fireworks says no notice means it has not identified your account. Both are the vendors' own claims.

Rotate stored keys at the provider that issued them. Fireworks says removing a stored secret does not invalidate the underlying credential, and the same holds for all four custodians.

Three hosted platforms and one package

Fireworks, OpenCode and Railway are hosted platforms that store customer secrets, and an intruder reached each one. Fireworks says internal credentials were used to capture evaluation-job variables and that it found no access to customer models, datasets or inference traffic. OpenCode's Console was reached through a legacy system being retired. Railway says some encrypted variables were obtained in decrypted form.

LiteLLM is different. It is the open source gateway many teams run themselves, and the poisoned release ran inside their own environments. It reads the proxy's provider-key table directly, takes cloud credentials, SSH keys and environment variables, and installs a backdoor that checks in hourly.

How the LiteLLM release was taken

LiteLLM says the attacker used three engineers' GitHub accounts, apparently through stolen GitHub CLI OAuth tokens: one changed the pipeline, one approved the release, one deleted the workflow records. Branch protection stopped the first attempt, then a token belonging to an organization owner overrode it. The build ran from a look-alike repository, Berri-AI instead of BerriAI, and the official source tag stayed clean. JFrog notes that reading the source would have missed it.

LiteLLM has not said how the tokens were stolen. Hijacked publishing access is a repeat pattern in our own briefings: in arrayref, a compromised maintainer account pushed malicious crates to crates.io.

Why the middleman holds the prize

Only OpenCode ties its breach to distillation, the pulling of a strong model's answers at scale to train a cheaper copy. Anthropic says distillers often use stolen API credentials from legitimate customers. Railway says its incident is part of a series aimed at AI inference providers. Fireworks and LiteLLM have named no motive, and no source links the four incidents to one actor.

Our read, not the vendors': a gateway or platform holds keys for many customers in one place, so one intrusion yields a pile of paid, aged accounts with normal usage history. That is plausible, not proven. Stored tokens as the way in is not new: in Salesloft Drift, attackers stole the OAuth tokens a vendor held for customers and used them against customer CRMs.

LiteLLM was already hit in March

On Mar 24, versions 1.82.7 and 1.82.8 reached PyPI for about 40 minutes after attackers took LiteLLM's publishing token through a poisoned Trivy scanner (Cloud Security Alliance). CloudSEK later counted more than 2,500 organizations in the captured data, which means potential exposure, not confirmed compromise. JFrog says the October release uses different payloads and infrastructure and that no evidence links it to the March actor. Both went after the same asset: the keys a gateway holds.

How it maps to OWASP

In the Agentic Applications Top 10, ASI04 Agentic Supply Chain Vulnerabilities covers LiteLLM and the hosted custodians, and ASI03 Identity & Privilege Abuse covers the stolen keys. In the LLM Applications Top 10, LLM02 Sensitive Information Disclosure names API keys as protected information, and LLM06 Unbounded Consumption covers what stolen keys are used for, including distillation theft.

The OWASP GenAI Security Project does not endorse any product, service or tool, including Optimus Labs. We cite its lists to classify these incidents.

If you hold other people's keys

The eight practices for storing a customer's key are in briefing #13. LiteLLM adds a question for any vendor: who can change what you ship? Our read: keep an organization owner's token out of developer tooling, require approval from an account not reachable the same way, and copy workflow logs where an account cannot delete them. Environment variables are a favorite place to look: in the Coder registry hijack, poisoned modules scraped credentials from environment variables, config files and shell history, and no CVE was assigned.

What we still don't know

As of Oct 21, 2026, unpublished: how LiteLLM's GitHub tokens were stolen, how many Railway accounts were read and how the attacker got in, how the Fireworks intruder got the internal credentials, whether the four share an actor, and how many of the stolen keys are in use today.

Remediation

Contain now · 0-24h
  • Rotate keys at the issuing provider (Anthropic, OpenAI, Google and others), not only in the custodian's dashboard, and check billing since Oct 6.
  • LiteLLM: isolate any host or container that ran 1.107.0. [Do not start with pip](https://docs.litellm.ai/blog/security-incident-oct-21-2026), because any Python start re-runs the startup hooks. Delete cook.pth, cook.py and sitecustomize.py, rebuild from verified artifacts, and rotate everything the host could reach: proxy provider keys, master and virtual keys, DATABASE_URL, the IAM role and every environment secret.
  • Railway and Fireworks: follow their notices. [Railway](https://blog.railway.com/p/security-disclosure-wednesday-october-21st) says to roll every environment variable and registry credential. [Fireworks](https://fireworks.ai/security/bulletins/october-2026-security-incident) says to rotate the third-party credentials named in your notice.
Investigate · 24-72h
  • Block and search for www[.]litellm[.]dev and the GitHub dead drop in the indicators below. The marker /tmp/.pc_once_72129118c59f5636c0bb proves exfiltration if present, but its absence proves nothing.
  • Check cloud audit logs for the instance role being used from outside your infrastructure after install time. LiteLLM suggests starting with CloudTrail GetCallerIdentity.
Harden the agent surface
  • Pin gateways and base images by digest. Do not pull a mutable tag such as latest, and verify the exact wheel, not only the source tag.
  • Keep provider keys in a secrets manager you control, one key per tool, with a hard spend cap that stops traffic.
  • Ask every vendor that holds your keys how they are encrypted, how releases are approved, and how fast you will be told about a breach.

Indicators

  • Malicious package: litellm 1.107.0 (PyPI, all seven wheels). Last safe version 1.106.2.
  • Docker tags on Oct 21: v1.107.0, latest, main-latest, main-stable (digest sha256:1bbcb1443bc962e45f5aad53fe3d2c30600e0379715fb6c664cdd3ac126c339e)
  • Files in site-packages: cook.pth, cook.py, sitecustomize.py
  • Exfiltration: hxxp://www[.]litellm[.]dev/healthcheck. Dead drop: raw[.]githubusercontent[.]com/letters9813/pythonclient-test/main/domain.txt
  • Lock file /tmp/remote_code_loader.lock. Look-alike source in build provenance: Berri-AI/litellm (legitimate: BerriAI/litellm)

Sources

Sourcing & confidence

Confirmed by the vendor

Assessed by Civilizations

  • That the four incidents form one pattern aimed at provider keys is our read. Only OpenCode names distillation, and Railway says it is part of a series. No source links the four to one actor.
  • Counts of exposed accounts, keys and organizations are the vendors' or researchers' figures and are not independently verified. Railway and LiteLLM are still investigating.

Related briefings

Optimus Labs · Civilizations

Get the next briefing first

Threat research, disclosures, and practical tips on enterprise Agentic AI attack surface management, directly in you or your agent's inbox.

Subscribe