LiteLLM root cause: a leaked key was force-pushed, not revoked
LiteLLM's attack began with a master key leaked in May and never revoked. A force-push hides a secret but does not kill it. Rotate first, then clean up.
The LiteLLM supply chain attack started five months before the bad release. LiteLLM's attack chain write-up says a master key landed in a public GitHub repo on May 27, 2026. The team force-pushed over the commit. The key was never revoked. On October 10, an attacker used it. On October 21, a poisoned litellm==1.107.0 shipped to PyPI and container registries. We covered the cleanup for 1.107.0 last week. This is the root cause, and it applies to every team that has ever committed a secret.
What actually happened
Per LiteLLM's own post, published October 23:
- May 27: an
opencode.jsonfile with a LiteLLM Agent Platform master key was committed to the publicLiteLLM-Labs/lite-harnessrepo. In LiteLLM's words, "the commit force-pushed over, and we identified the exposed keys as requiring revocation. However, key revocation did not occur for the master key." - October 10: the attacker used the key to get into the Agent Platform and pull a GitHub CLI OAuth token. The token belonged to one of two GitHub organization owners.
- That week: release approval normally needed an engineer plus a locked-down approval account. LiteLLM had relaxed it so "any two engineers" could trigger and approve a release.
- October 21: with stolen tokens, the attacker repointed the release pipeline and published 1.107.0.
The Hacker News adds that malicious workflows on throwaway branches collected more secrets on October 10 and 12, including keys for Anthropic, OpenAI and AWS Bedrock. LiteLLM says it is now revoking every token tied to its internal systems and vendor platforms.
Why a leaked secret is a business problem, not a Git problem
A force-push hides the secret. It does not kill it. Public commits get cloned, cached and scraped in minutes. Once a key is public, the only fix is to revoke it at the issuer and confirm the old value fails. Rewriting history is cleanup, not response.
One owner token was the whole org. An unscoped OAuth token on an owner account reached every repo. Your automation should not run as the person who owns the GitHub org.
Relaxed controls are the window. The release rule was loosened for speed the same week it mattered. If you loosen a control, put an end date on it.
Do this this week:
- Turn on GitHub secret scanning and push protection on every repo.
- Keep a list of every key and who can revoke it, so a leak response takes minutes.
- When a secret leaks, revoke first, test that the old value fails, then rewrite history.
- Move CI and bots to fine-grained tokens or GitHub Apps, not owner accounts.
Key takeaways
- A LiteLLM master key leaked on May 27, 2026; the commit was force-pushed over but the key was not revoked
- On October 10 the attacker used it to take a GitHub OAuth token from an org owner
- A release approval rule relaxed that week let two stolen tokens ship litellm 1.107.0 on October 21
- Revoke a leaked secret at the issuer first; rewriting Git history does not make it safe
- Run automation on scoped tokens, not on the account that owns your GitHub org
Do you know how fast you could kill every key your AI stack uses? We set up secret inventories, scoped CI tokens and a written leak runbook as part of every build. Ask us to audit your keys and pipelines, or see how we build.
Sources: LiteLLM: Security incident attack chain, The Hacker News.
- #litellm
- #secret-leak
- #supply-chain
- #github
- #ai-gateway
Tommy Rush — Founder, Rush Commerce
Operator turned builder. 15+ years running operations — now shipping the systems businesses run on. More
Get The Rush Report weekly — one email, zero fluff.
Keep reading
Tailworm: unpatched Tailscale SSH flaws. Tighten your ACLs now.
A researcher says Tailscale SSH forwarding lets one hacked device get root on others. No patch yet. Use per-pair ACLs and turn off SSH port forwarding.
Read itPillow 13.0.0 fixes 38 flaws: upgrade before your uploads bite
Pillow 13.0.0 patches 38 security advisories, including CVE-2026-112398, a FlashPix heap overflow that can run code from one image. It also drops Python 3.10.
Read it