Top
Best
New

Posted by abhisek 7 hours ago

Compromised LiteLLM 1.107.0 on PyPI Installs a Credential Stealer and Backdoor(safedep.io)
358 points | 118 comments
rsanheim 1 hour ago|
This is the second significant exploit against LiteLLM in what, a year or two ? Just last night I came across notes and a script from an older claude session to help audit all project dependencies and verify nothing used litellm.

Okay, checked, it was March of this year: https://futuresearch.ai/blog/litellm-pypi-supply-chain-attac.... What even is time anymore in the llm age?

atmosx 33 minutes ago|
Indeed, I don't think I'm upgrading ever again. I'll stuck with 1.04.2 for a year or two. Feels like a Russian rulette at this point.
linsomniac 4 hours ago||
Just going to remind you all that https://canarytokens.org/ exists.
dropbox_miner 3 hours ago|
TIL! this is cool
crossroadsguy 4 hours ago||
All the sandbox-exec and all the Lulu rules are not going to protect against something like this.

At one point permission pop-up fatigue sets in we start giving any permission as if it's normal. We also become desensitised to isntalling tools: brew, npm, it becomes second nature.

"Oh, those 367 tools installed by package X? Yeah yeah, must be normal, that's how all these work now".

"Brew shows 59 packages outdated?". "Must upgrade". "Yeah, done. Perfect".

And the advent of agents and harnesses. It's not a matter of whether, it's when! OSes need to do something about it. Help users have complete separate "program space" at ease with better, easier, and lighter VMs if nothing else. I know, I know - Unix and Linux solved all this even before Alexander III of Macedon started wearing his nappies. Of course.

fdsjgfklsfd 2 hours ago||
No no it's really important that I have 5-factor authentication on every website and it requires me to go through the whole login process again every time I break eye contact.
hoppp 1 hour ago||
Ready to add anal probes?
tensegrist 14 minutes ago||
for what, chess.com?
isityettime 1 hour ago|||
> All the sandbox-exec and all the Lulu rules are not going to protect against something like this.

No, you can block this with sandboxing tools. For my LLM agents, I use a tool called Nono, whose macOS implementation is built on the same foundation as sandbox-exec. One of the key features it supports (and it's not the only tool that does this) is proxying and the injection of credentials via the proxy. For example, when I run Codex at work, Codex does not have access to my Azure AI Foundry API credentials. It sends out requests via dummy credentials, and the proxy injects the real ones outside the sandbox.

The other thing that proxy does is let you restrict network access in various ways. So you can run something like LiteLLM so that it doesn't have access to the internet at large; it can only talk to Azure AI Foundry or AWS Bedrock or whoever your inference provider is. You sandbox LiteLLM separately from your agents, and you give it access to much less. The software firewall stuff isn't perfect but it is a significant defense against things like this.

There are also lots of other restrictions that are easy to do which mitigate this. Nono blocks access to the root of $HOME, then selectively allows access to paths within it, and also explicitly blocks access to common paths to secrets. So it's pretty easy to make sure that access to important things are blocked: SSH credentials, GnuPG socket (and local Unix sockets in general), local OS keyrings, etc.

The way I use tools like this is exclusively by writing policy, testing it, and revising where the policy is inadequate. I never get approval fatigue because I don't do approvals.

You're right that attacks like this are hard to defend against, and that we're used to tool sprawl, and also that LLMs can do things like install tools we don't expect them to themselves! But there are ways to anticipate and mitigate attacks like this. Sandboxing tools (including contained and VMs) that support credential injection are genuinely useful for this.

drdaeman 36 minutes ago||
Until this Nono tool gets a supply chain attack and happily ships all your Azure credentials somewhere they aren’t supposed to be, then starts mining Monero or something.

LiteLLM is frequently used in roughly the same scenario - trading virtual LAN-only keys for real ones as it relays requests to the inference providers.

abhisek 3 hours ago|||
What are you talking about? Even dependency cooldown of 24h is enough to protect the consumers from these breaches. The attack did not have any novelty, used a newly registered look-alike domain for C2 and a PTH technique which is now known.

Sandbox comes in for the unknown ones and yes, its a pain to get the profile right.

lrvick 3 hours ago||
> Even dependency cooldown of 24h is enough to protect the consumers from these breaches.

From some of them perhaps, but plenty hide for -years- undetected.

nvme0n1p1 2 hours ago||
Don't let perfect be the enemy of good
cptmurphy 3 hours ago|||
Fuchsia solved that
caaqil 3 hours ago||
> Unix and Linux solved all this even before Alexander III of Macedon started wearing his nappies

I mean, didn't Linux shells invent pop-up fatigue? I thought we (yes, we) all used to -y flag preemptively so the upgrades and installations/setups go through. Linux really did do it first, the agents are just more needy and their popups more verbose now, but not exactly new.

VM isn't a silver bullet.

fc417fc802 1 hour ago||
Stuff like this is highly context dependent. It is a good thing that apt asks about each step. I voluntarily add more of this by opting for things like listbugs. If I then decide to override such protections with a -y for whatever reason that's a choice on my part to prioritize convenience.

Either way it's got nothing to do with security - I was never going to catch a vulnerability in the central debian repos by reading a list of dependent packages.

pkulak 4 hours ago||
How could this happen to a project with 55k commits in three years?
Aurornis 3 hours ago||
The compromise appears somewhere in the build and deploy system.

> No public commit in BerriAI/litellm contains data = "cook" or a cook/ folder.

> SafeDep assesses, with moderate to high confidence, that BerriAI’s private release pipeline built these wheels from an attacker-modified git source.

crossroadsguy 4 hours ago|||
Every harness thinking right now… "if we want do something like this we won't even have to compromise anything."
zargon 4 hours ago||
Sarcasm?
pkulak 4 hours ago||
haha, yes, sorry.
rirze 4 hours ago||
you needed more exclamation marks :)
arcanemachiner 2 hours ago|||
The gentleman's /s tag.
cromka 3 hours ago|||
I mean, 55k commits in 3 years, that's about 55 a day, 7 days workweek. It's reasonably implied no one can be looking at all them thoroughly.
yujonglee 3 hours ago||
This incident is unrelated to what was committed to the repository. More info: https://docs.litellm.ai/blog/security-incident-oct-21-2026
threecheese 2 hours ago||
"Attackers compromised 3 unique developer github credentials" is a little scary; this seems systemic - if three developers had their keys stolen, it implies the real problem is elsewhere.

They revoked all but one developers, which is probably the right approach, but I'd pin LiteLLM to "something before this version" and keep it there until further notice!

madamelic 5 hours ago||
I am not following how someone snuck the files into the release.

All I read was that it creates a directory from the build file but seemingly no description how new files or added dependencies slipped by. Was `cook.pth` a dependency that got automatically downloaded from PyPI on install and then the build system put it into dependencies?

--

Leaving this for others:

> BerriAI’s private release pipeline built these wheels from an attacker-modified git source. The attacker could have used a compromised maintainer or bot credential, a private branch or mirror, or the reference the pipeline builds from. A stolen PyPI token used from the attacker’s own machines fits the evidence less well.

Makes sense. It was that a maintainer or the private pipeline was attacked and the malicious dependency was injected there by squatting on the maintainer's local copy rather than the dependency being hijacked for everyone. Very clever.

aakashpawar 5 hours ago|
If that's right then attestations wouldn't have saved anyone here either. They prove which workflow published the wheel, not what source that workflow checked out. A private pipeline building from the same-looking repo still gives you a perfectly valid attestation.

What would catch it is someone rebuilding from the public tag and comparing the result, which almost nobody does for the python wheels. I have been treating attestations as the answer for my own project's releases, so this is a good reminder of where they stop.

vibewright 3 hours ago||
[flagged]
yujonglee 3 hours ago||
Official Incident Post: https://docs.litellm.ai/blog/security-incident-oct-21-2026
stbenjam 6 hours ago||
IMHO defaults for uv, npm, etc should all have a cooldown for 24 - 48 hours by default, you should have to go out of your way to install something newer.
sunbum 3 hours ago||
I use safechain for this, because there is always gonna be another package manager configured wrong. https://github.com/AikidoSec/safe-chain
robinhoodexe 6 hours ago|||
We have 7d cooldown on packages on an internal pypi proxy but that blocks security updates also, which we now have to manually exclude from the cooldown.

I’m unsure how to automate this properly, maybe an LLM is the best starting point.

mbrumlow 5 hours ago|||
Are security updates immune ?
tikkabhuna 5 hours ago|||
They definitely wouldn't be if attackers knew that it would then bypass cooldowns!

Ultimately, you need someone to verify releases and that probably means paying for it. I know Sonatype paid solutions utilise their own internal research to allow/block new releases.

fmbb 5 hours ago||||
It’s in the name. They are secure!
dlkasajiewo 5 hours ago||||
No, but there's a bigger tradeoff for not upgrading. In one case it's that you're potentially exposed to a known vulnerability, vs the other case where you might just be missing out on some new or slightly reworked feature.
mattstir 5 hours ago|||
But then an attacker marks their malicious release as a critical security update. It's really messy unfortunately.
happyPersonR 2 hours ago||
We need something external that actually checks to see if source code matches built artifacts, and also possibly something Llm based that checks to see if you’re making checked in code vulnerable or directly adding something malicious.
trollbridge 5 hours ago|||
Problem is, we leave ourselves open for LLM injection attacks.
rcleveng 6 hours ago|||
I didn't realize they've all such added that, this was a change we made to our own projects last year when these first started - glad to see it's common.

Risk is ensuring enough security researchers are finding these and quarantining these before that default cooldown lapses.

stbenjam 6 hours ago||
Yea, I think all the tools have this now but its not a default. Install scripts should also be turned off by default and require some hassle to turn them on for the first time in a package.
happyPersonR 2 hours ago|||
I’d imagine there were probably fixes for critical CVEs that were included …. A lot of companies are on a 24 hour timeline to get them out.
0c3ca83 4 hours ago|||
The last time I looked for information, I remember seeing that the median supply chain attack was in place for multiple months to years before being discovered. Cooldowns shorter than that seem like snake oil.
whatshisface 3 hours ago||
If we all implement a cooldown, nobody will find the attack. This implies the cooldown length must be the cooldown length plus one month.
stratos123 1 hour ago|||
No, because there are malware-finding mechanisms other than "let some unlucky guy get affected first", like automated scanners. If everyone implements a cooldown, everyone will in fact be safer.
comboy 2 hours ago||||
Plus some random value slow curve distribution. Basically incremental rollout from the client side. But if it's not caught at the commit time, attacker will just wait for a certain point on the curve.
0c3ca83 3 hours ago|||
You tell people that the cooldown needs to be a day, while you implement a two month cooldown.
Muromec 3 hours ago||
Something something don't need to outrun the bear
giancarlostoro 6 hours ago|||
I wonder if in some cases it's not so much that people are updating too quickly, but rather, their deployment pipelines do not have pinned / frozen versions attached to their builds.
galoisscobi 4 hours ago||
Then we’ll find out about malware 24 - 48 hours later.
saasisdead 4 hours ago||
Last time they had this, I just vibe coded a version of lite llm and it actually works better
starfallg 4 hours ago||
Yeah, thinking that after the last supply chain attack, people would be smarter than ship things with LiteLLM.
luke-stanley 3 hours ago||
Is that you Max?
baddash 6 hours ago|
litellm in the news again
TZubiri 6 hours ago|
What's interesting here is that this will only affect those who did not migrate off LiteLLM after it was attacked the first time.

I'm not saying everyong should migrate after there's a vuln, but I'm definitely saying that. Unless it's something huge and foundational like a programming language (PHP gets a second chance), just migrate within the next couple of weeks.

I didn't even have it installed the first time, so the ideal programmers, (read, your competition), actually suffered 0 vulns from this dep, if you suffered 1, that's already pretty bad, being burnt twice should be a wake up call. If you get hit 3 times by the same dependency, it's a lost case.

wongarsu 5 hours ago|||
As someone who does not use litellm but instead a barely maintained underpowered alternative: what did everyone migrate to?

If it matters, I am mostly interested in the aspect of having a proxy that unifies multiple ollama and openai-compatible endpoints with model-based routing and failover. Optionally with api-keys, reporting, budgets, etc. I do not particularly care about the MCP gateway, Agent-To-Agent thingy, and whatever else LiteLLM bolted on over time

tkz1312 5 hours ago|||
Claude will write you something custom that fits your exact requirements with zero supply chain risk in an afternoon.
spike021 5 hours ago|||
how is there zero supply risk? claude will still package dependencies into a homemade solution at some level...
tkz1312 5 hours ago||
sure zero was a bit strong, but I personally feel pretty good about depending on only the go stdlib, compared to pulling in litellm.
Cu3PO42 4 hours ago|||
Even if it plays out that way (which I doubt, we have a ton of requirements around spend tracking), the problem I'm seeing is long term maintenance. I don't want to fudge around with my proxy every time one of the model providers comes up with a new parameter that works slightly differently on Bedrock than it does on Azure.

That said, I am looking into alternatives. Two times in one year is really a terrible look.

hoppp 2 hours ago||||
I just installed it on my server in docker, then the UI was unusable and I deleted it and vibe coded a minimal alternative in golang. It works better.
dannyboland 5 hours ago||||
After the last LiteLLM compromise, I took my requirement (an OpenAI compatible endpoint routing across multiple providers based on latency) and built that as a small static Rust binary - https://github.com/sturnus-dev/sturnus

Now that AI makes it cheaper to build such tools in-house, the case for adopting a maximalist framework and trusting that entire supply chain is a lot weaker.

HumanOstrich 2 hours ago||
> and built that as a small static Rust binary

I don't think memory safety would have helped here.

> the case for adopting a maximalist framework and trusting that entire supply chain is a lot weaker

You mean the Rust ecosystem?

connorbrinton 5 hours ago||||
Pydantic AI has a great set of abstractions over LLM providers. The documentation tends to focus on its agent loop more, but I find the LLM abstractions quite nice even on their own
TZubiri 4 hours ago|||
As with many dependencies, I wholeheartedly question the requirement and relentlessly cut them out without replacement.

Taking the definition from another user on this comment-chain:

"an OpenAI compatible endpoint routing across multiple providers based on latency"

If the endpoint is truly OpenAI compatible, you can just switch out the vendor by switching out the HTTP address, we are talking potentially about a single line change.

- LLM_HOST = "api.openai.com" + LLM_HOST = "api.competitor.com"

It sounds silly, but remember that software is a winner-takes all game, 99% of devs will lose, so if you are seeing 99% of devs do the same thing, it isn't surprising that it's a grossly wrong choice. It takes skill and guts to be in the 1%, reject the mainstream trends, and just write code without grasping at external imports to do even the most basic things.

I'd like to take this opportunity to sell out, I'm open for contracts if you are looking for a remote 1% dev. Early stage startups only, email in userpage.

john_strinlai 5 hours ago||||
>PHP gets a second chance

second? i haven't kept count, but we have to be somewhere in the hundreds of chances now

antonvs 4 hours ago|||
> I'm not saying everyone should migrate after there's a vuln, but I'm definitely saying that.

Turns out Ancient Aliens was onto something all along.

More comments...