Hacker Dudes// alternate deck. same feed.
FEED ~21/h Δ0 ────:──── LINK ░ SIGNAL
100%
SPOOLED 0/45 CYCLE 61339.782.139.69
Compromised LiteLLM 1.107.0 on PyPI Installs a Credential Stealer and Backdoorsafedep.io
595pts/198 comments/5d/─
by abhisek / hn> / « feed
▲▼ rvz14:56 hn>

So in just 1 week:

1. Google Cloud Outage [0]

2. eMudhra CA private key Leak [1]

3. PingCap TiDB 10.6 TB data Leak [2]

4. PHP2Shell uncovers critical CVEs (with AI) [3]

...and now we have Round 2 of a LiteLLM compromise after the first one in [4].

[0] https://news.ycombinator.com/item?id=50163961

[1] https://news.ycombinator.com/item?id=50166579

[2] https://news.ycombinator.com/item?id=50173716

[3] https://news.ycombinator.com/item?id=50180836

[4] https://news.ycombinator.com/item?id=47501426

▲▼ gcr15:41 hn>

don't forget today's NodeJS security update addressing its own RCE bugs!

▲▼ rolls-reus17:06 hn>

is the google outage related to a security incident?

▲▼ push0ret17:35 hn>

No, it was a power event localized to one building.

▲▼ rcleveng14:59 hn>

Seriously again for litellm? I really with that things like Google ADK didn't add this to my deps.

▲▼ cyanydeez15:53 hn>

all popular, free, ungated software will be poisoned; like kesler syndrome but for the world of open source software.

▲▼ taylorfinley16:48 hn>

Horrifying framing, I will remember that analogy viscerally. Well done.

▲▼ stbenjam15:05 hn>

This... isn't acceptable. Once is forgivable, twice is malpractice.

▲▼ santiago-pl15:05 hn>

I wish all the best to LiteLLM team with handling it again. I can imagine how challenging are situations like this one.

However, if anyone is looking for 20x faster and less "targeted" LiteLLM alternative - I'm work on one in Go. That's why GoModel it's called. https://github.com/ENTERPILOT/GoModel/

▲▼ ghrl15:17 hn>

Sounds like a reasonable choice of a language.

I myself have written a small llm proxy in Go, doing nothing but injecting the real API key to outgoing requests while itself validating virtual keys it generates, and it works great.

▲▼ santiago-pl15:20 hn>

Definitely it was a deliberated decision. Also enterprises adapt Go more and more.

▲▼ TZubiri15:59 hn>

If you don't use any LLM router, it's infinity times faster, and infitesimally as targetted.

▲▼ toxik18:01 hn>

Yeah, this DIY MITM attack is entirely avoidable.

▲▼ verdverm18:26 hn>

I have GoModel running at home, being deployed at work. There are many good reasons to run a gateway, some include

- being resilient to upstream provider downtime

- centrally managed config/controls

- visibility and allocation into usage and costs

We are deploying a gateway at work primarily for these three.

At home, GoModel's virtual models have been super helpful for testing out new open weights. I can change the model deployed in vLLM without having to change any of my downstream tools, which get a stable name.

https://gomodel.enterpilot.io/docs/features/virtual-models

▲▼ jiwidi15:06 hn>

Twice? uiuiui

▲▼ 0xbadc0de515:07 hn>

Again! Yikes.

▲▼ stbenjam15:18 hn>

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.

▲▼ rcleveng15:19 hn>

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.

▲▼ stbenjam15:30 hn>

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.

▲▼ robinhoodexe15:30 hn>

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.

▲▼ mbrumlow15:58 hn>

Are security updates immune ?

─ 7 more ─
▲▼ trollbridge16:14 hn>

Problem is, we leave ourselves open for LLM injection attacks.

▲▼ giancarlostoro15:40 hn>

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.

▲▼ 0c3ca8317:38 hn>

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.

▲▼ whatshisface18:00 hn>

If we all implement a cooldown, nobody will find the attack. This implies the cooldown length must be the cooldown length plus one month.

─ 4 more ─
▲▼ lmeyerov02:09 hn>

Median is < 1d for major ones

We did a small survey of major incidents after shai-hulud and came to 2d cooldowns through that

▲▼ woodruffw03:43 hn>

My research did not show “months to years.” Even weeks of presence are an outlying event[1].

(This is a situation where everybody benefits from high quality data. If you have data that contradicts mine, please share it!)

[1]: https://blog.yossarian.net/2025/11/21/We-should-all-be-using...

▲▼ galoisscobi17:47 hn>

Then we’ll find out about malware 24 - 48 hours later.

▲▼ sunbum18:41 hn>

I use safechain for this, because there is always gonna be another package manager configured wrong. https://github.com/AikidoSec/safe-chain

▲▼ mstaoru14:00 hn>

It's just next level:

"Installing the Aikido Safe Chain is easy with the installation script.

curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.... -o /tmp/install-safe-chain.sh \ && echo "9e4af7107f06d9c0d758cb08fb36804c2af88e24972f3a9d3f8c2bd0ca002adf /tmp/install-safe-chain.sh" | sha256sum -c - \ && sh /tmp/install-safe-chain.sh \ && rm /tmp/install-safe-chain.sh "

(facepalm)

▲▼ happyPersonR19:45 hn>

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.

▲▼ petesergeant15:21 hn>
>There currently exists a private LiteLLM registry for enterprise customers, in which we are distributing an embargoed release that remediates a vulnerability whose disclosure date is scheduled for October 27.

https://github.com/BerriAI/litellm/issues/47826

oh boy. Announcing that there's a private enterprise repo you should be paying for if you don't want a credential stealer in your build is quite the optic, and then announcing there's an undisclosed second vulnerability that's being distributed, just not to the poors...

▲▼ sullivanmatt15:40 hn>

That's not what's being said, at all. They are simply telling their enterprise customers that there is a different build pathway for the enterprise builds and that pathway wasn't impacted by this issue.

Also if you don't like organizations fixing vulns without releasing the open source first, you're going to be upset when you learn how every major vuln and associated patches are distributed long before the fixes hit the repos. A timely example of this is PHP, literally today.

▲▼ petesergeant15:55 hn>
>A timely example of this is PHP, literally today.

Sorry, there was a paid-for PHP release that fixed it I could have gotten a week ago, and that they publicly announced existed, and it was just people who don't pay for PHP who had to wait...?

─ 2 more ─
▲▼ chias19:17 hn>

Note: I work at LiteLLM

There exists a critical vulnerability which affects only Enterprise LiteLLM deployments, and does not affect OSS deployments.

We have provided our customers with patched releases distributed via a private registry and are allowing them some time to update their deployments before we release the fix in our public registry and disclose the vulnerability details. Releasing the fix publicly in an open source product would be a de-facto vulnerability disclosure.

▲▼ callamdelaney15:23 hn>

Why on earth do these people make it impossible to select the title of their article?

▲▼ nkjoep15:32 hn>

it's just the poor styling of the selection highlight colour.

▲▼ hungryhobbit15:45 hn>

To clarify a little further, you can select the title, you just can't tell that it's selected because the author made a "poor" (REALLY REALLY DUMB) decision to deliberately style away a basic browser feature (text highlighting).

─ 2 more ─
▲▼ tech_solver15:39 hn>

its litellm again. I wonder about maintainer trustworthiness

▲▼ infecto15:40 hn>

Any package hosts that scan and include cooldowns by default that operate on a consumption model? The ones I have seen all charge a lot.

▲▼ cyanydeez15:51 hn>

man, people are going to be sorely disappointed in what's free on the internet in a couple of years.

Agents and malware will eradicate all goodwill left.

Good by internet.

▲▼ abhisek15:58 hn>

Not sure about a service, but PMG enforces dependency cooldown and sandbox on package install. https://github.com/safedep/pmg

▲▼ TZubiri15:59 hn>

Socket.dev

Tell em Tom Zubiri sent ya (I don't get a commission, just good karma)

▲▼ edoceo16:41 hn>

This one ? https://news.ycombinator.com/item?id=46909037

I use it, I don't cooldown, proper version pinning for me.

▲▼ wallrat20:15 hn>

Bytesafe (https://bytesafe.dev). Pure Dependency Firewall, not a package host, with usage based pricing.

▲▼ baddash15:50 hn>

litellm in the news again

▲▼ TZubiri15:55 hn>

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.

▲▼ john_strinlai16:04 hn>
>PHP gets a second chance

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

▲▼ wongarsu16:04 hn>

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

─ 11 more ─
▲▼ antonvs17:31 hn>
>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.

▲▼ syntaxing15:53 hn>

I figured LLMs nowadays would be good enough to catch issues like this. Is it because it’s too costly to do it?

▲▼ abhisek15:56 hn>

Yes if you use LLM to analyse everything. Not really if you analyse diffs, with heuristics to select candidates for LLM/agent based analysis. But at the cost of missing out novel attacks.

▲▼ bcvvvy15:57 hn>

Fuck this week.

▲▼ zxilly16:36 hn>

Welcome to the AI era, every week in the near future

▲▼ antonvs17:45 hn>

There are over 8 billion people on Earth, and some subset of the computer systems that they all use are going to have issues, every day.

It's really not as bad as the accumulated headlines and exploitative hype make it sound.

It's similar to the mass hysteria and moral panics over things like child abduction. Media reports make certain dangers seem much more important than they really are, when considered in context.

▲▼ hmokiguess16:14 hn>

https://github.com/BerriAI/litellm/issues/47826#issuecomment...

>OSS Users > For the time being, please pin your version to 1.106.2 or any explicit version published prior to now.
>Enterprise Customers > There currently exists a private LiteLLM registry for enterprise customers, in which we are distributing an embargoed release that remediates a vulnerability whose disclosure date is scheduled for October 27. Our private registry is not affected. If you are an enterprise customer pulling from our private registry you are not affected.
▲▼ wongarsu17:21 hn>

So they sell advance access to information that will allow me to hack other people's LiteLLM instances?

Seems a little unethical

▲▼ ctxc17:38 hn>

I'm not following, what did you mean?

─ 2 more ─
▲▼ 1-616:22 hn>

This is the 2nd time. I'm glad I moved away from this platform.

▲▼ SomaticPirate16:26 hn>

Second f**king time. Just torching their reputation at this point

▲▼ madamelic16:30 hn>

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.

▲▼ aakashpawar16:45 hn>

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.

▲▼ zahlman21:32 hn>
>Was `cook.pth` a dependency that got automatically downloaded from PyPI on install and then the build system put it into dependencies?

This isn't the name of an entire package, but just a single file included in the package. .pth files are part of Python's import system. At startup, the standard library `site` runs automatically, and configures the (initial) places that Python will look for code to satisfy `import` statements. By design (because some people occasionally find it very useful), arbitrary Python code can be run from these[0]. The system searches the entire site-packages folder for these files.

The compromised build packages up a .pth file in such a way that installers will treat it as a "data file"; but because Python programmers are accustomed to looking for data files at paths relative to the current source file, installers put .pth files in places that will easily be picked up by the `site` scan.

So the point is simply that, once LiteLLM is installed, malware injected directly into the final package (not a dependency) runs at startup in the compromised environment even if you don't use the LiteLLM code explicitly.

Nothing "creates a directory from the build file". The attacker-modified source includes the entire "cook" payload directory and also modifies the build file so that the build system would include its contents. No dependencies are involved (unless you're thinking of LiteLLM as being a dependency for something else).

The Python ecosystem has been working on mitigations for this. Starting in 3.15 the .pth file system is being reworked[1], but a deprecation period is necessary. Also, the PyPI repository has an opt-in system called "Trusted Publishing"[2] which is supposed to allow verifying that a wheel was built from the appropriate source directly using GitHub's CI mechanism. (Opt-in because of the long tail of developers who don't use this or any other CI system and shouldn't be expected to learn them for a small hobby project.) However, since the attacker did use the CI system from a separate GitHub repository, and compromised multiple maintainer accounts, I imagine it was possible to defeat that protection as well.

If you don't need the `site` mechanism for your project (of course, this needs to be tested per project), it can be disabled by passing the -S flag to Python[3]. This has always been available, but awareness seems to be low.

Historically, Python packaging has overall had a pretty lax security posture, and new attempts to improve that are often delayed by the consensus process and by backward compatibility concerns.

[0]: It's possible to put arbitrary code directly in the file, but rather unwieldy. Interestingly, this payload is neatly organized: the .pth file simply runs an import statement and appears to keep hundreds of lines of code in two actual Python files: one that works directly, and one that sets up a sub-hook called `sitecustomize` (another explicit provision of the `site` configuration system).

[1]: https://docs.python.org/3/whatsnew/3.15.html#whatsnew315-sta...

[2]: https://docs.pypi.org/trusted-publishers/

[3]: https://docs.python.org/3/using/cmdline.html#cmdoption-S

▲▼ 1vuio0pswjnm716:40 hn>

1792590200 | LiteLLM Hijacked: Malicious 1.107.0 Wheels Steal Credentials | https://research.jfrog.com/post/litellm-hijacked-again/ | https://news.ycombinator.com/item?id=50180838 | 0 comments

1792590232 | Litellm 1.107.0 Compromised | https://github.com/BerriAI/litellm/issues/47826 | https://news.ycombinator.com/item?id=50180845 | 0 comments

▲▼ avereveard17:08 hn>

Again this is the second time this year

▲▼ pkulak17:09 hn>

How could this happen to a project with 55k commits in three years?

▲▼ zargon17:24 hn>

Sarcasm?

▲▼ pkulak17:34 hn>

haha, yes, sorry.

─ 5 more ─
▲▼ crossroadsguy17:45 hn>

Every harness thinking right now… "if we want do something like this we won't even have to compromise anything."

▲▼ Aurornis18:12 hn>

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.
▲▼ saasisdead17:30 hn>

Last time they had this, I just vibe coded a version of lite llm and it actually works better

▲▼ starfallg17:32 hn>

Yeah, thinking that after the last supply chain attack, people would be smarter than ship things with LiteLLM.

▲▼ luke-stanley18:17 hn>

Is that you Max?

▲▼ crossroadsguy17:44 hn>

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.

▲▼ abhisek18:16 hn>

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.

▲▼ lrvick18:53 hn>
>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.

─ 11 more ─
▲▼ caaqil18:21 hn>
>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.

▲▼ fc417fc80220:34 hn>

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.

▲▼ isityettime22:09 hn>

It's kind of the opposite. The more typical Unix nehavior is to just assume you knew what you were doing and meant it, and not ask for confirmation in the first place. -y is just the reversion of an abberation.

▲▼ cptmurphy18:32 hn>

Fuchsia solved that

▲▼ fdsjgfklsfd19:23 hn>

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.

▲▼ hoppp20:05 hn>

Ready to add anal probes?

─ 3 more ─
▲▼ Terr_01:03 hn>

And if it ever detects that you briefly used a browser with any kind of privacy-preserving features on any website, you will be logged out from all devices and forced to revalidate your email and gene sequences.

Discord does this with Firefox: It doesn't even tell you that a captcha failed or anything, just poof logged out and you must re reverify the same email you verified 10 minutes ago.

─ 6 more ─
▲▼ sznio07:08 hn>

and yet somehow an attacker never needs all these auth methods.

my boyfriend didn't have 2fa enabled, but google would still ask him to verify a code on his phone. recently his password leaked, the hackers got into the account and google never bothered them with an extra verification. amazing. the fact that they signed in from a completely different country? who cares!

(yes i enabled 2fa for him now)

▲▼ isityettime20:30 hn>
>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.

▲▼ drdaeman21:21 hn>

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.

─ 1 more ─
▲▼ atmosx22:07 hn>

Yes it’s messed up. I was thinking about pi agent and the extensions getting updates every three hours.

▲▼ decentstates05:14 hn>

Sandboxing should be built in to your windows manager like: https://decentstat.es/posts/shai-halud-nix-housing/

▲▼ yturijea07:17 hn>

This is seriously one of the reasons I see Rust as quite suspicious(with its 200-300 dependencies in all builds), unlike golang where you can actually create a full app with no dependencies.

▲▼ smolder10:18 hn>

There are not that many dependencies in Rust if you know how to write it. That's just what vibe coders end up with. It's a great language which is overtaken by people with no idea what they're doing that heard it was a great language.

─ 1 more ─
▲▼ happyPersonR18:16 hn>

This software should be rewritten until it has no dependencies other than the compiler. Like it should use no libraries at all other than crypto.

Also put it in rust ….

▲▼ merelydev17:45 hn>

A bad day for opensource, but I guess this is how we get stronger patch by patch.

▲▼ linsomniac17:48 hn>

Just going to remind you all that https://canarytokens.org/ exists.

▲▼ dropbox_miner18:06 hn>

TIL! this is cool

▲▼ TacticalCoder23:28 hn>

Yeah it's not totally unlike people who consider learning that they've been hacked is worth more than $x and so, even if they're not into cryptocurrencies, they leave the equivalent of $x on their computer in a "software wallet", in an obvious place.

It's not a guaranteed you'll know you've been hacked, but it's still quite a flag to leave. And there are services doing the equivalent of what you posted, but for cryptocurrencies: they contact you through email, SMS, snail mail even, if they detect that "coins at address ..." ever move.

▲▼ radku06:12 hn>

Canary token is great to tell you've been hacked.

There are ways to try to prevent this from happening in a first place. I wrote kow (keys-on-the-wire) to fix this. Apps only see placeholder tokens. The proxy injects real key from the vault into outbound requests for allowed hosts.

Author here. Apache-2.0. [1] https://keysonthewire.com [2] https://github.com/inflightsec/keys-on-the-wire

▲▼ myzek09:03 hn>

This is awesome, why did I just learn about this! Gonna add these all over my homelab

▲▼ yujonglee18:42 hn>
▲▼ abletonlive18:56 hn>

Well it seems like it’s over for litellm. You’d have to be negligent to be using them at this point. If you’re managing this at your company good luck explaining why you should continue to use litellm after this

▲▼ detente1801:26 hn>

Hi abletonlive,

I appreciate the feedback. We work hard to make every release safe and secure. The attack was novel, and I'd love your feedback on how we can improve our ci/cd further.

https://docs.litellm.ai/blog/security-incident-oct-21-2026#h...

▲▼ abletonlive01:55 hn>

"Novel" is doing a lot of work here. Save the PR for people that will fall for it. There's nothing novel about being internally compromised which you've demonstrated two times in a row

▲▼ nairboon18:59 hn>

Isn't that at least the second time that LiteLLM got compromised?

▲▼ mihaaly19:47 hn>

Déjà vu for both of us, huh?

▲▼ threecheese19:19 hn>

"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!

▲▼ detente1804:28 hn>

Hi threecheese,

Pinning is a good idea.

So far, we believe it came from the github oauth cli tokens which are embedded in claude code tool responses - https://docs.litellm.ai/blog/security-incident-oct-21-2026#g...

It's something we're still investigating. I'll update my thread on this post, as we learn more!

▲▼ rsanheim20:21 hn>

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?

▲▼ atmosx21:24 hn>

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.

▲▼ detente1801:24 hn>

Hi atmosx - i would recommend upgrading.

We work hard on improving the stability and security of LiteLLM on each release.

Please let me (krrish@berri.ai) know if you have any issues upgrading!

─ 2 more ─
▲▼ staticman212:51 hn>

If you stick with older LiteLLM versions you won't get proper support for new LLM releases, correct?

▲▼ halJordan23:47 hn>

And buried under the lede is that one of the compromised people was one of the organization owners. So it seems like the culture of insecurity comes from the top, which is unfortunate especially bc they keep acting like "this could've happened to anyone guys"

▲▼ brookst01:50 hn>

Yeah the excuse that it wasn’t a project vuln, just the project maintainers having a machine taken over… that’s not great.

▲▼ sebdufbeau00:51 hn>

there's another one this summer that didn't get as much attention (or any at all) which allowed exfiltrating master provider keys with any authenticated user/virtual key

https://nvd.nist.gov/vuln/detail/cve-2026-84377

▲▼ te_chris09:29 hn>

I looked at the code a year ago and decided I will always avoid it.

▲▼ Sherveen23:07 hn>

In this thread: people who would blame the inventors of the computer for the impact of computer viruses.

▲▼ abhikap23:43 hn>

Crazy day - but seems like this was contained fairly quickly: https://docs.litellm.ai/blog/security-incident-oct-21-2026

▲▼ jkercher23:52 hn>
▲▼ stuaxo00:01 hn>

Oof.

LiteLLM has one of the nicest programmer UX to use but this is not good at all.

▲▼ hendersoon01:10 hn>

I setup 8 day age gates on everything back in May. This is inobtrusive and pretty safe.

▲▼ yujonglee01:13 hn>
▲▼ detente1801:21 hn>

Hi everyone, this has been contained. The attack was novel, and I'd love feedback on how we can improve from this.

Here's what we know so far: https://docs.litellm.ai/blog/security-incident-oct-21-2026#h...

- Krrish

▲▼ wisty01:22 hn>

Original articles says it was likely a comprimised maintainer machine?

▲▼ detente1801:30 hn>

From our investigation, the token compromised was included by claude code in the tool call.

This was captured in the request/response logs.

The attacker, having gotten access to the logs, then looked for this and used it.

So - yes a local github cli oauth token, but not the machine.

▲▼ joshheitzman02:01 hn>
>specific situations in which Claude Code will embed a user's GitHub CLI OAuth token into a response body, and in situations where response bodies are logged, these tokens may appear in LiteLLM logs.

That's pretty hand wavy. What did y'all have CC doing that it had your GitHub CLI OAuth token in its context at all?

Stuff like this is why my coding agent is a coding agent not shell agent that basically own the machine. Mine has no tool for shell use narrow tools specific things like ripgrep, finding files, and deleting files that limit the paths to explicit workspace directory.

I take care of commits, push/pull, building wheels, and publishing wheels myself. It really doesn't take the much time and the coding agent frees up a lot of my time.

▲▼ altbdoor02:33 hn>
>I take care of commits, push/pull, building wheels, and publishing wheels myself.

I too was surprised when I see my colleagues telling me that these actions are "not maximizing your efficiency".

They'd rather hand all controls to the LLM, and then be surprised when shit hits the fan.

─ 1 more ─
▲▼ craftkiller17:47 hn>
>narrow tools specific things like ripgrep

Ripgrep has the `--pre` flag and `--hostname-bin` flag that enables it to execute arbitrary commands.

>finding files, [...]

Does that tool invoke the `find` command? Because `find` has the `-exec` flag which could then be used to invoke arbitrary commands.

I really think the only safe option is putting your agent in a virtual machine with only a copy of your code (sans credentials), let the agent work, and then copy it back and manually audit it.

─ 1 more ─
▲▼ fny03:29 hn>

It's not a novel attack: it's novel negligence.

The best improvement would be to blame yourselves instead of Claude.

▲▼ detente1804:21 hn>

Hi fny,

That's fair feedback. What I'm trying to express is the complexity of it.

For this to work:

1. The attacker had to get access to our internal gateway

2. Claude code had to embed the github oauth cli token in tool call responses (not directly, but as part of an embedded url call).

3. We had to enable request/response logging.

4. The attacker had to be aware of this token logging circumstance, then harvest multiple user account tokens (one of which had to belong to an org admin)

5. The attacker had to wait for / hope that we would expand the release trust boundary (as we did on Monday)

among other things. This wasn't a "whoops we had shitty governance around our auth tokens" kind of situation, it involved a number of non-trivial circumstances many of which were beyond the attacker's direct control, including Claude Code behavior of which we were not previously aware of, and a sophisticated attacker.

- Krrish

─ 1 more ─
▲▼ franktankbank03:53 hn>

Amateur hour again.

▲▼ neop1x12:47 hn>

What about adding a human in the loop? So the actual releases to the package registry would be done manually after reviewing the package?

▲▼ joshheitzman01:47 hn>

Seems like pip doesn't have a way to exclude packages although it was requested at least once: https://github.com/pypa/pip/issues/10797

Just checked if litellm crept in with any packages I installed recently. Fortunately it didn't, but I'm working on an OSS AI agent harness so its certainly a concern and I'd like just flatout block litellm so I don't have to worry about picking it up as transitive dependency. Guess I'll have to vibe a script and remember to run it. Sigh.

▲▼ wilkystyle02:21 hn>

If you can use uv, try the --exclude flag, e.g.:

    uv pip install -r requirements.txt --exclude excludes.txt
excludes.txt is basically like an inverse requirements.txt. Your requirements.txt could have this...

    pandas
    scikit-learn
    matplotlib

...while excludes.txt has this...

    numpy
... and uv would resolve the dependencies in requirements.txt, excluding numpy from the dependency graph entirely and ignoring any dependencies that would have been introduced by numpy itself.

EDIT: You can also configure this for uv directly in a pyproject.toml file:

    [tool.uv]
    exclude-dependencies = ["numpy"]

▲▼ joshheitzman02:34 hn>

From the docs it seems like that would just silently not install the blocked package, so while it would protect my dev environments regular pip installs would still pick up the transitive dependency.

─ 1 more ─
▲▼ garou03:14 hn>

https://github.com/gumieri/nenya

If someone just need an AI Proxy with no deps.

▲▼ mc809807:27 hn>

That just shifts the risk

▲▼ wolvoleo06:57 hn>

What worries me is that this seems to be the second time this happened and there's not even a notification on litellm.ai about it.

▲▼ valgaze09:47 hn>

Google's ADK (agent development kit) uses LiteLLM extensively: https://adk.dev/agents/models/litellm/

Their docs list LiteLLM's vulnerability from March... https://i.imgur.com/TPVrVyW.png

▲▼ tesnorindian12:04 hn>

Earlier it was eMudhra and now BerriAI's internal failure? AI usage is both a boon and a bane. Shortsightedness due to continuous AI usage?