OpenCode Console Breach: Your Provider Keys, Their Custody
An intruder reached a legacy OpenCode Console system and may have exposed provider API keys that teams saved there, for 1.4% of Console users. OpenCode has not said how.
ReadLive incidents, as of Oct 21, 2026. LiteLLM and Railway are still investigating and this page will be updated.
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.
Fireworks AI
OpenCode
LiteLLM
Railway
GoogleFireworks 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).
LiteLLM look-alike domain registered
litellm[.]dev was created Oct 13 and updated Oct 18, per JFrog. The real project uses litellm.ai.
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".
LiteLLM release protections overridden
Branch protection rejected a change to the private release workflow. Five seconds later a privileged developer credential overrode it (LiteLLM).
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.
Railway detects anomalous activity
Systems that store customer environment variables. Railway notified upstream providers to revoke keys and paused all deployments.
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.
Any single yes means treat this as an incident.
Not affected if
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.
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.
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.
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.
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.
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.
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.
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.
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.pyExfiltration: hxxp://www[.]litellm[.]dev/healthcheck. Dead drop: raw[.]githubusercontent[.]com/letters9813/pythonclient-test/main/domain.txtLock file /tmp/remote_code_loader.lock. Look-alike source in build provenance: Berri-AI/litellm (legitimate: BerriAI/litellm)Confirmed by the vendor
Assessed by Civilizations
An intruder reached a legacy OpenCode Console system and may have exposed provider API keys that teams saved there, for 1.4% of Console users. OpenCode has not said how.
ReadThe target was the registry's build service, not the people who use it. Publishing a gem triggered code execution on RubyDoc.info without anyone running gem install.
ReadCoder's own delivery infrastructure was hijacked to serve credential-stealing modules from the real registry.coder.com. No CVE, no poisoned package, nothing for a scanner to match.
ReadOptimus Labs · Civilizations
Threat research, disclosures, and practical tips on enterprise Agentic AI attack surface management, directly in you or your agent's inbox.
SubscribeBacked by
Ecosystem
