Hacker Dudes// alternate deck. same feed.
FEED ~9/h Δ0 ────:──── LINK ░ SIGNAL
100%
SPOOLED 0/45 CYCLE 61339.584.95.50
Broccoli2Shell: Brotli decoder RCE in Node.js, Python and morebroccoli2shell.com
398pts/214 comments/2d/─
by theanonymousone / hn> / « feed
▲▼ est10:38 hn>

wtf Python is also effected. https://pypi.org/project/brotli/ not sure about shell

▲▼ Incipient11:40 hn>

Side point from going to pypi:

>Security notice: Upgrade certifi, pip, and uv in response to CA certificate incident

Blimey PIP is affected? That's bad. I feel like that should have been bigger news?

▲▼ murderfs11:51 hn>

Pretty sure that's the eMudhra "private key is 4" issue.

▲▼ skeledrew12:34 hn>

Because pip uses it's own certificate bundle, so even if you fix the system itself pip still needs its own upgrade to handle the eMudhra episode.

─ 17 more ─
▲▼ tetha10:55 hn>

Well at least we know about it while or before the giant patch effort for everything else goes on. Just put it onto the pile.

Who turned on hard mode this week?

▲▼ loloquwowndueo11:37 hn>

Nah man. We were on casual mode all along. This is the new normal.

▲▼ netsharc11:13 hn>

Well, whoever picked the name HTTP2Shell certainly didn't use any intelligence, artificial or genuine.

It's so meaningless, broad and undescriptive of the actual issue. No it probably doesn't affect an HTTP server with nothing else behind it, so why is HTTP being blasted?

You might as well call it Exploit Pro Max...

▲▼ CharlieDigital11:17 hn>

Feels like the goal was sensationalism.

▲▼ cromka23:17 hn>

Something that OpenAI would coin. Just like Anthropic did with Mythos.

▲▼ reddozen11:51 hn>

The author clearly used super intelligence.

▲▼ Stitch422301:30 hn>

You and I, my friend, are the only ones in this thread not being sent to work in the glitter mines of south Arkansas as enemies of God's Country. SI has the best names, other intelligence is vastly inferior, using it is worse than many schisms of -isms combined.

▲▼ techpression12:00 hn>

I immediately thought HTTP/2 was having a bad day somehow. Might I suggest Software2Shell to be less confusing.

▲▼ CharlieDigital12:14 hn>

Specifically Brotli2Shell

─ 3 more ─
▲▼ groundzeros201514:20 hn>

All these names are silly. It's just marketing.

▲▼ sigmarule14:52 hn>

There are levels of silliness, and this has achieved a new one.

▲▼ cowlevel14:32 hn>

Actually it does, if the server is willing to decompress POST bodies.

▲▼ croes14:43 hn>

Brotli bodies, so Brotli2Shell

─ 2 more ─
▲▼ Rapzid14:39 hn>

I think we've all seen where an LLM names a session, issue, or PR based on its early understanding and fails update it later.

AI isn't being asked to review the title, and it doesn't have experience or think, so of course it's not going to flag it.

No human reviews anything anymore so of course they aren't going to catch it.

Edit: AI for as good as it is at "writing" is terrible at writing and particularly at naming things. I had an AI name a client OpenAICompatibleEmbeddingClient. "Brooooo.. I think "compatible" is implied, who names stuff like that?!"

▲▼ rmaxdev17:58 hn>

LLM-based AI is a synthesis of human observed behavior

─ 1 more ─
▲▼ lifeisloving20:01 hn>

Descriptive type names are a good thing. Id argue that one isnt that bad, but llms do take it to another level sometimes.

▲▼ rafram20:41 hn>

That means that it supports other services with OpenAI-compatible embeddings APIs (not just OpenAI's own API). Seems reasonable!

─ 2 more ─
▲▼ rererereferred14:45 hn>

Just call it CVE-2026-111497. More accurate and much easier to remember and to talk about with your boss.

▲▼ N19PEDL215:16 hn>

Or EUVD-2026-108169.

▲▼ kevincox22:50 hn>

I can maybe remember CVE-2026. But there is no way I can remember 6 random digits.

─ 2 more ─
▲▼ vanschelven12:31 hn>

Fun fact: not even Google can remember that number on the first try, apparently:

https://github.com/google/brotli/issues/1597

▲▼ TZubiri16:43 hn>

It looks like marketing HTTP2Shell seems to appeal to everyone that uses HTTP, while Brotli2Shell might not wake up people that know what it is.

Now, whether it's warranted or not, that's another matter, but they know how to appeal for maximum awareness/interaction.

▲▼ hulitu11:01 hn>
>while Brotli2Shell might not wake up people that know what it is.

And, most of all, is damaging to Google, which are the master of software engineering. /s

▲▼ super25600:40 hn>

A better name is Konduktsemmel, which is a bread roll (Semmel) which you eat on a funeral (Kondukt) in Austria. Fits to Brotli, doesn't it?

(Actually you eat cake and drink coffee on a funeral, but it's still called like that in some parts of Austria.)

▲▼ cowlevel13:55 hn>

A better name is Fred, because

▲▼ vanschelven11:34 hn>

Should have definitely been Brotli2Shell, but Google ingeniously managed to dodge that bullet by having NodeJS come out with a fix before they did (others might call that accidental exposure), and then barely communicating about that with the broader community once they finally did. Here's a timeline of events[0] and here's me more broadly complaining about Google's stance[1]

[0] https://www.bugsink.com/blog/http2shell-timeline/

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

▲▼ francisduvivier15:38 hn>

Bro2Shell sounds better though

─ 1 more ─
▲▼ llm_nerd12:38 hn>

I mean...who cares? It's actually kind of strange that your comment got others talking about AI naming things.

SQL Slammer didn't actually slam anything, and applied to a single vendor among many SQL providers. Heartbleed didn't make anyone's heart bleed...I mean, at least directly. Shellshock only impacted a single shell environment, again among many. Log4Shell impacted a single logging implementation, among many. Spectre and Meltdown...I mean, who would think that related to CPU cache side channels?

These are just dumb names for people to share in referring to something. Seems silly and like a waste of time to spend effort getting upset about them.

▲▼ davedx11:32 hn>

Honestly it's time to get rid of C as a language used where security is a factor. Enough already. Why the hell is a lib like brotli that processes public general internet traffic, and maintained by google, not in rust?

▲▼ doublerabbit11:34 hn>

Because these applications were created long before Rust existed.

There is a cost to conversion.

▲▼ Gigachad11:36 hn>

Brotil was actually created post rust, but before rust took off.

▲▼ davedx11:41 hn>

It's not even an application it's a compression library

▲▼ _flux16:58 hn>

Rust-Brotli (by Dropbox) is actually a drop-in replacement for the Brotli C lib: https://github.com/dropbox/rust-brotli#:~:text=rust-brotli%2...

Dropbox switched to it a decade ago, so it's probably quite product-ready.

▲▼ anthk19:25 hn>

Check Librsvg, or php-rust. Or tons of gtk4-rs software doing it just fine.

▲▼ thephyber14:27 hn>

Security is a factor everywhere. And C is everywhere. There's not going to be a "rewrite everything in Rust" project until after there is some legit penalty for selling / offering software in C that could be more secure in another language.

I think Mozilla got it right when they abandoned the effort to rewrite the entire browser in Rust and instead focused on analysis of which modules needed priority rewrites. If a module has historically had zero memory-related bugs, then there are other higher priority things to spend time on.

That said, Google Project Zero should have had Brotli on their radar. Hopefully they still have people and resources.

▲▼ anthk15:43 hn>

Asterinax. RustPyhon. PHP 8.5 rewrite in Rust. FFMPEG and Qemu might follow soon. It's inevitable.

▲▼ gsnedders16:42 hn>

I’ll point out that Servo was always a research project — any thought of it replacing Gecko was an incredibly long-term stretch goal. It was _a lot_ more interested in “can we write a high-performance browser engine in Rust” (there’s a reason why it significantly predates Rust 1.0 — they were very much developed together!) and “can we implement parallelism in places where browsers historically have not” (because you have more guarantees of safety).

Chromium _has_ been replacing certain components with ones in safe languages, and it seems like that will continue slowly (with integrating them into the existing codebase, with web compatibility risk of any changes in behaviour, with the risk of performance and power regressions).

▲▼ _flux16:55 hn>

I can understand why people used a C library for these apps, as when HTTP2 was specified, the C lib was the only game in down.

However, why not switch to the Rust lib when it was available? I suppose people at Dropbox are now pretty happy they did in 2016: https://dropbox.tech/infrastructure/lossless-compression-wit...

It's slower, though. Too high a price to pay for safety it seems.

▲▼ uecker18:56 hn>

Sorry, I find the supply chain risks of Rust much more worrying than these memory safety issues. So how about we get rid of Rust? At least cargo is a problem.

▲▼ nairboon11:39 hn>

Brotli2Shell seems to be a more appropriate name for this.

▲▼ mkl13:19 hn>

Not when you're prioritising sensationalism over accuracy. Everyone's heard of HTTP, but hardly anyone's heard of brotli.

▲▼ brazukadev14:02 hn>

call it GoogleBrotli2Shell then.

▲▼ sli07:01 hn>

There's this other name for the same vuln: https://broccoli2shell.com/

▲▼ cowsandmilk11:41 hn>

Article claims OpenAI found this in February, but I don’t think that’s correct. I think Google made a change to the Brotli source code in February that fixes the issue, but hadn’t realized it was a security issue and therefore hadn’t cut a release.

▲▼ Rapzid12:38 hn>

Yeah that doesn't make a lot of sense that they reported it but also nobody knew it was a security issue..

Maybe an LLM just happened to do one of those "while I'm here" fixes in Feb and because nobody reviews anything anymore..

"Fixed reading too many bytes."

LGTM!

Edit: I was close! "Detect and report invalid stream earlier." Could have been a person.

▲▼ serious_angel16:35 hn>

Thank you! Of course! I do believe these cases are dreams for LLM vendors to advertize themselves regardless truth, and many believe trends over actual evidence...

Please do consider sharing the actual evidence to keep in the history, and respect actual human authors involved, their effort, time, and humane attitude... for discoveries, competition, actual achievements to learn from and get inspiration...

▲▼ galadran18:47 hn>

Mozilla reported it as an RCE in April

https://bugzilla.mozilla.org/show_bug.cgi?id=2029458

▲▼ flyingjoe11:47 hn>

A few month ago, everyone was advising to use cool-downs in your package upgrades. Now we're constantly overriding those because security incidents will be exploited immediately. Guess that's just how it's gonna be from now on.

▲▼ medler12:07 hn>

It used to be a flex to say you deploy daily but it’s going to become a necessity just to keep up with the vulns

▲▼ ManuelKiessling16:51 hn>

CI/CD — Continuous Incidents, Continuous Defense.

▲▼ mort9618:13 hn>

Yeah, obviously? Deploy fixes to security issues which apply to you as soon as possible, deploy random feature additions and non-critical bug fixes after some cooldown.

As always, the easiest way to manage this is to have as few dependencies as possible. If you have a lockfile with thousands of entries, you won't be able to go through them and decide which upgrades are legitimate urgent security updates and which can wait. If you have 10? You'll manage.

▲▼ da_chicken12:36 hn>

Exactly.

Security fixes for actively exploited vulnerabilities demand an emergency response. The risk of introducing new, unknown flaws is less than risk of having an active known exploited vulnerability.

However, absent the risk of a KEV, that changes the equation. Now the risks of code changes causing breaking changes plus the risk of supply chain attacks is greater than the risk of having to put some thought and time in to manage your software library versions.

It's not like AI created this distinction, either. Neither did CI/CD. This is standard systems administration -- literally ISO/IEC 20000 ITSM. It's exactly why, traditionally, new features are often limited to major versions. It's why binary compatibility was a huge issue with RHES 20 years ago, and why distros pin versions and backport security and selective bug fixes. A developer that doesn't know this is telling on themselves why they shouldn't have write access to production. Stability matters a lot because we like to get paychecks.

▲▼ acdha00:02 hn>

That's why it's important to practice your processes for both shipping quickly and overriding cooldowns. There's a baseline of things which are not easy to exploit where you want to patch on a regular cadence and the risk posed by a supply chain attack is greater than the risk of an attacker having enough of a footprint inside your systems to escalate. The fact that sometimes you have a specific situation like this where that's not true doesn't mean that 9 times out of 10 the cooldown was the better risk-reduction strategy.

▲▼ gsnedders16:33 hn>

A cooldown is a coarse way to deal with “supply chain security” — and that’s mostly a question of how much you trust your dependencies.

You may well (and probably should) trust the maintainers and release process of Brotli, Node.js, PHP, etc. security releases more than you trust some-random-JS package deep in your front end dependency graph.

You want to reduce the risk of introducing a compromised dependency into your product, and that’s largely a question of how much you trust upstream.

▲▼ upofadown11:51 hn>

An example of the cost of added complexity I suppose. Brotli is much more complicated than the gzip/deflate it replaces. ... and of course we still have to expose gzip to attack as well.

Every time you add something you lose something...

▲▼ TacticalCoder12:21 hn>

I really don't understand how so many different things are affected by the same brotli bug/exploit.

I even read the patch for the C code (patch which, btw, seems a bit hacky to me with isSafe? methods added and whatnots but YMMV: now I understand things had to be patched in a hurry but this patch really looks like "lipstick on a buffer overflowing C pig" to me).

What's the link between Python / Node / C++ / libbrotli / Envoy / Bun: are those some all using the same C brotli encoder/decoder?

Can someone who knows more explain why all those are vulnerable?

>As for unaffected software, Apache’s standard mod_brotli does not decode Brotli

Because this one only encodes and doesn't decode and the bug is in the decoder? (for I take it mod_brotli, with such a name, still does something brotli related and isn't, say, a TOTP token generator nor a SAT solver?).

I mean overall, sheesh: could we get better explanation / better writeups when such big fuckups happen?

▲▼ Rapzid12:51 hn>

Yes. All these language runtimes compile against common libraries. Compression libs are one of the most common common libraries that platforms like node, ruby, dotnet, python, and etc need to compile.

Google provides the Brotli implementation. Package maintainers slurp that up and create ie libbrotli-dev. When you compile node it uses that for brotli support.

▲▼ thephyber14:10 hn>

Brotli was a library released by the Google team that developed it. There weren't lots of independent implementations; they were all from the same source code.

▲▼ rfgplk14:40 hn>

Or you can roll your own and not rely on the literal disaster that Google developed. Brotli is trivial to implement.

─ 1 more ─
▲▼ Rapzid12:28 hn>
>reported it as unauthenticated remote code execution that works in both directions
>but it wasn't recognized as a security issue at the time and no release shipped with the fix until now

I'm always getting my dangerous RCE bugs mixed up with my harmless RCE bugs.

I'm curious how this was reported and fixed back in Feb but nobody recognized the importance. A case of AI automation and nobody at the wheel?

▲▼ wavemode18:16 hn>

I'm not seeing any source for the claim that OpenAI discovered this in February. The source that the article links (a tweet by OpenAI) doesn't claim that.

▲▼ soiax12:23 hn>

Exatly, it was patched silently, OpenaAI just discovered that patch, and that it has upstream effects in NodeJS etc.

▲▼ zahlman00:49 hn>

No matter who discovered it, there was a patch in late February. One can excuse them for describing the commit as something ordinary to avoid alerting the baddies (traditional "disclosure window" etc. stuff) but it's absurd to me that the corresponding releases, with no other code changes (per the commit history), took almost 8 months.

▲▼ galadran18:46 hn>

Mozilla found and reported it as an RCE in April: https://bugzilla.mozilla.org/show_bug.cgi?id=2029458

▲▼ zahlman00:43 hn>

[Edit: I was inattentive and replied twice in different ways, thinking they were to different parent comments; I've now merged my thoughts and edited them to be more coherent.]

>reported

This is Mozilla's own discussion of the issue, though. There's mention of

>https://github.com/google/brotli/blob/master/SECURITY.md suggests that it should go through Google's regular vulnerability reporting process. I don't have any more specific knowledge around this library, however.

but that doesn't establish that this was done.

If it was done, then I think we deserve answers about why it took Google almost 8 months to release a new version of a common dependency, applying a security patch (and no other changes!) when the vulnerability was known at least 6 months ago (and possibly the full 8 months ago) to cause RCE.

If I'm understanding the report correctly, the patch was applied in Firefox's vendored copy within days, and available in 151 and I guess some 150.0.x release. And also they were supposedly beaten to the punch:

>Probably we should update to cfa184a997ac19454d5a3ae97f6d600aac2445a6 which was rolled into chromium 2 weeks ago. If there are other recent sec fixes this would pick them up

It seems even more embarrassing if chromium got the patch but Chrome didn't. And if Chrome did, then it's that much more appalling not to see a patched separate release for so long.

(I was confused trying to go through the technical details, though: the "affected code" seems to have very little overlap with the code actually altered by the patch.)

▲▼ bawolff12:28 hn>

To me, the surprising part is how many of these implement brotli compression of request (not just response) bodies, given how obscure a feature that is.

In any case all this sensationalism is starting to get annoying. Patch your stuff and move on.

Edit: actually, between all the sensationalism, its hard to tell from the article how many of these actually support brotli compressed request bodies in common configs vs some other use of brotli (which is bad but nowhere near as critical)

▲▼ ArcHound12:34 hn>

I think the issue is that the servers "silently" support brotli. Then nobody uses it, but the attacker can still abuse the feature.

So as a hotfix I block this on my reverse proxy.

▲▼ bawolff12:42 hn>

But is that actually true?

It seems like node supports it with body parser enabled.

But im having trouble finding any docs suggesting anything else supports it on inbound requests.

Obviously there are other scenarios where it is exploitable, but it is a much less severe vuln if the attacker must first force the program to make an outbound request to a server of its chosing rather than just connect to a vulnerable server.

─ 8 more ─
▲▼ bflesch15:30 hn>

Cloudflare has this amazing feature where it accepts compressed payloads and forwards them to unsuspecting backends. Can be weaponized in many ways.

▲▼ AlienRobot15:33 hn>

I wonder if we'll see more of this thanks to AI. Extremely complex features that nobody uses and that were easy to add, which incidentally tremendously expand the attack surface. One would hope that maintainer would be wise to avoid that, but for how long?

─ 4 more ─
▲▼ therein19:54 hn>

My experience with Brotli is from back when all the hype was mobile first and India etc was super mobile first so all these social networks lost their mind optimizing for request success and speed. So they were going crazy over micro-wins like that.

▲▼ perlgeek18:48 hn>

Why would request compression be obscure? When you support posting big forms, requests get big too, so why not compress them?

▲▼ jgalt21212:34 hn>

How may web servers only serve brotli?

How many clients only accept brotli?

▲▼ michaelbuckbee12:40 hn>

Well it's negotiated, right?

So say you run a SaaS that allows for something like letting people set their Avatar from an image URL which gets downloaded.

As an attacker I setup a new server that serves only brotli and then submit that URL to the SaaS.

▲▼ jgalt21213:21 hn>
>So say you run a SaaS that allows for something like letting people set their Avatar from an image URL which gets downloaded.

That's a clever example, but why would you do that? The avatar should be a static resource. As such, I'd only provide an upload file dialog.

─ 5 more ─
▲▼ cowlevel14:39 hn>

Just send a POST with Content-Encoding:br to any URL and hope it gets decided before the URL route is checked.

▲▼ gsnedders16:43 hn>

There’s both request compression (no negotiation) and response compression (negotiated).

▲▼ skeledrew12:36 hn>

I've just been pointing a Claude Code at these things as they pop up. A great time to not have to worry about chasing all these things manually.

▲▼ pimterry12:59 hn>

Much prefer the Broccoli2Shell name & site (for the same vuln): https://broccoli2shell.com/. For starters, I'm pretty sure you can hit this without HTTP if you do any manual Brotli decoding, HTTP just happens to be the most common case that comes up.

▲▼ dang15:53 hn>

Ok, we've belatedly changed to that from https://www.aikido.dev/blog/python-packages-vulnerable-node2.... I'll put the other link in the top text as well.

▲▼ ChrisArchitect17:30 hn>

What about merging up with the already ongoing discussion which needed a url cleanup anyways https://news.ycombinator.com/item?id=50216791

▲▼ perching_aix13:31 hn>

git for windows is vulnerable even in its latest release (2.56.0.windows.3), careful pulling repos over https from random ass servers (prolly uncommon but hey). they already merged the fix on the repo, it's just in a snapshot build only; should prolly arrive on Monday (2.56.0.windows.4).

also affects codex (gui), which ships its own git, could be more of a problem there, when the LLMs get quirky at night. still unlikely to be a problem though.

speaking of, update codex (and wipe its cache at ~/.cache/codex-runtimes), ships its own node. update python.

stuff like wireshark and imhex remain vulnerable, even on their latest repo commits, which may or may not be spicy.

also Microsoft 365 Copilot still has its own unpatched brotlidec.dll from Oct 7, if anyone uses that. no fix available for that one afaik, not sure about how it can be made to access the vulnerable decoder.

▲▼ andersonpico15:25 hn>

why is this downvoted? are any of those not accurate?

▲▼ hiitsmyaccount16:09 hn>

Because a local software vuln is much less scary, less exploitable, and more common than an exploit like PHP2Shell, which requires basically no effort to exploit a large chunk of publicly exposed webservers. Basically, local vulns have been a thing forever and GP is off topic.

─ 1 more ─
▲▼ austin-cheney14:20 hn>

Why are we still so reliant on HTTP? HTTP came out in 1990 (36 years ago) and the most common version of HTTP still in use, 1.1 (RFC2616), came out in 1999 (27 years ago)?

Yes, I know HTTP 2 and 3 and SSE are attempts to make it faster and more parallel, but its still slow. Its slow because its unidirectional with a full round trip and by default its a new socket per each message. Yes, I know the real reason HTTP became and remains popular is because its sessionless... in theory. Still, there are better options available. You can do so much more with a full duplex channel.

▲▼ singpolyma314:26 hn>

We don't need new versions of http or SMTP because they're already simple and great and they're dumb protocols so there's not much you could ever add

If you want something else you can take your pick based on need from dozens of other options

▲▼ cowlevel14:36 hn>

HTTP 1 is full of parser differential vulnerabilities, which 2 fixes. That is probably its biggest flaw.

SMTP is too chatty - it uses too many round trips for efficient transfer across the internet. It can take several seconds just to get to the point of sending the email data. It also duplicates information between the SMTP envelope and the email body which creates vulnerabilities when they don't match.

For APIs that don't have to work in a browser I suggest JSON lines over TCP, or over TLS.

─ 3 more ─
▲▼ rfgplk14:37 hn>

Agreed. The issue with all these archaic standards is that they were rolled decades ago back when certain practices were either outright not being employed OR that hardware wasn't fast enough. Ironically, HTTP itself is a literal nightmare to parse (performance wise) on top of having like... ten? distinct vulnerability classes. The world desperately needs new standards.

▲▼ cowlevel14:41 hn>

Just open a TCP socket and send JSON messages. Or if you want a bit more efficiency, fixed-format binary messages, but remember to include a version number.

─ 4 more ─
▲▼ cowlevel14:40 hn>

"by default its a new socket for each message" is misinformation - keepalive is the default since HTTP 1.1 (1999).

▲▼ austin-cheney17:41 hn>

Keep alive is not default behavior, so my prior comment was still more correct.

─ 3 more ─
▲▼ rfgplk14:35 hn>

As I've mentioned numerous times at this point, relying on third party code is a massive liability (supply chain attacks/sloppy code). My hand rolled brotli implementation is not only faster than libbrotli but also immune to this vulnerability (yes, I checked). Roll your own code people.

▲▼ ethin15:41 hn>

Would you also apply this to cryptography or, well, really any security library? Because I hope the answer will be no...

▲▼ zbentley17:11 hn>

Please feel free to publish and/or link to your alternative implementation. Many eyes can help with identifying security/functionality issues, and if your implementation proves superior to libbrotli in general, this area of the ecosystem is in dire need of diversity.

▲▼ semiquaver15:25 hn>

Let’s say I have a node.js app behind an Amazon elastic load balancer which terminates TLS. My understanding is that in nearly all configurations, my app would be unaffected because the ELB would handle decompression. Is that generally correct?

▲▼ aleaph15:58 hn>

Yep, I don't think too many people are exposing their python/node servers directly, it should be always behind a proxy or a fancy cloud LB.

Apache and nginx don't handle brotli out of the box.

▲▼ valleyer10:44 hn>

Your two sentences basically contradict one another, no? Apache doesn't handle brotli, so it will pass the compressed body to the underlying server undecoded, which means the underlying server is effectively exposed to attacks on this bug, if it does brotli decode on the body.

▲▼ chrismorgan16:11 hn>

I don’t know about that specific software, but I would be surprised if it decoded message bodies, which is entirely unrelated to TLS termination and shouldd be entirely unrelated to routing. So I would expect you would still be vulnerable.

▲▼ anttihaapala15:48 hn>

I had to check all of our Python deployments and installation BOMs and was quite relieved - turns out that none actually installed brotli libraries. HTTP libraries like httpx, requests and frameworks consider them optional and autodetect their presence.

▲▼ zbentley17:07 hn>

...which points to an area where Python has a significant drawback: optional/accelerator dependencies are loaded via try/except-ImportError. That's suboptimal for a bunch of reasons:

- If a vulnerable dependency is in your environment as a transitive of something that's not at risk (e.g. code you don't use, code that doesn't talk to untrusted sites), code that shouldn't use it will pick up that transitive.

- Autodetection of optional stuff is often silent. E.g. libxml vs. pure-python XML parsing doesn't really act any different at load time or most of runtime, besides being faster, so it's non-obvious what's being used when.

- Probing for packages that aren't listed as a concrete dependency by importable name risks loading unintended code due to name conflicts (malicious, or accidental/caused by local files with the same name or weird PYTHONPATH).

- There are plenty of ways to get an ImportError after running a lot of Python code in a dependency before giving up! That code might mutate global state/change behavior, or do insecure things, etc. Malicious actors could take advantage of ImportError being raiseable by user code to conceal naughty behavior at import time.

I really want Python to come up with a saner way to concretely identify (avoiding name conflicts) and probe for optional dependencies at import time. try/except-ImportError ain't it.

▲▼ illusive408016:32 hn>

Why do critical vulnerabilities get a cutesy name and website nowadays? Who’s paying for these sites?

▲▼ TZubiri16:44 hn>

Are you asking why do we name things? In a programming forum?

▲▼ solyin06:36 hn>

Listen. There are TWO problems, okay‽

─ 2 more ─
▲▼ cubefox17:22 hn>

I'm certainly not complaining about some selfless guy making a helpful website without expecting anything in return!

▲▼ nicce19:10 hn>

They excpect fame and may make things look worse than they are

─ 4 more ─
▲▼ sbarre18:14 hn>

Small static websites are effectively free (Cloudflare, GCP free tier, etc)..

▲▼ reassess_blind19:28 hn>

Domains aren’t

─ 4 more ─
▲▼ o_m18:45 hn>

It is annoying (and ironic) because larger companies, that will benefit from this information the most, blocks newly registered domains.

▲▼ illusive408013:51 hn>

Yep, this website was blocked at my work all day yesterday despite me submitting it for review.

─ 1 more ─
▲▼ cyphar06:59 hn>

This has been the case for more than a decade, Heartbleed was probably the one which really created the trend.

▲▼ tclancy12:32 hn>

You remember CVEs by heart? Do you even bother using DNS?

▲▼ Flere-Imsaho15:28 hn>

The same reason we name storms and hurricanes... It's easier to raise awareness, and refer to these things after the fact. More memorable then CVE-whatever.

I find it helpful at least...

▲▼ dang18:27 hn>

We detached this subthread from https://news.ycombinator.com/item?id=50220841.

▲▼ 1vuio0pswjnm718:38 hn>

"In 2016, the Brotli algorithm shipped in Chrome, delivering overall better compression ratios for eligible resources."

"By the end of 2017, all modern browsers supported Brotli, and server support for it started to become more widespread."

For www users, all that data collection, surveillance and ad services traffic to enrich so-called "tech" companies acting as intermediaries, can make the www exceedingly slow

The way to "make the web faster" (or less inefficient) is to get rid of that needless traffic, and the ads it supports

SPDY,^1 HTTP/2 Server Push,^2 HTTP/3 QPACK,^3 brotli, .... make www users ("ad targets" to Google) uninformed, nonconsenting subjects in Google's failed experiments

The www already works just fine for its intended purpose (_not_ data collection, surveillance and ad services)

1. "As of 2021, no major browsers supported SPDY" https://en.wikipedia.org/wiki/SPDY

2. https://en.wikipedia.org/wiki/HTTP/2_Server_Push

3. https://foxio.io/blog/header-accordions-qpack-amplification-...

▲▼ graemep19:46 hn>

I agree with you, but the immediate problem here seems to be that all major browsers support Brotli, and i think they all use the Google library, so they are all vulnerable.

Most of the discussion here is about vulnerabilities in servers, but it looks like its mostly a client problem.

Is there a way to turn brotli off?

Going back to your point, if we kept things simple we would be a lot more secure.

▲▼ 1vuio0pswjnm720:14 hn>

"OpenAI found this in February reported it as unauthenticated remote code execution that works in both directions, so a malicious client can take over an unpatched server and a malicious server can take over an unpatched client that accepts compressed responses."

Every user is different

For me I'm a text-only user not interested in graphics

I do not use a so-called "modern" browser to make HTTP requests

I don't request brotli-compressed content/resources^1

Normally I don't send an Accept-Encoding header

Almost always servers to which I connect^2 will return uncompressed text, which is what I want. No Accept-Encoding header needed

Occasionally servers will send gzip-compressed text by default and will ignore "Accept-Encoding: identity"

However the popular so-called "modern" browsers will send an Accept-Encoding header whose value includes brotli (br) by default

Unsuspecting www users are consequently opted in to Google's brotli experiment. Me, I opt out

1. I use a text-only browser (1.3MB static binary) to read HTML. I compile it without brotli support

2. Other users may connect to different servers. Preferences vary from user to user

▲▼ ChrisArchitect19:59 hn>
▲▼ RachelF20:41 hn>

Pretty much everything that talks http has this Brotli library linked in. A quick file search on a Windows dev box showed:

- git

- Sublime text

- VS studio

- CUDA

- .NET

- inkscape

- AzureTools

▲▼ gok21:12 hn>

This is yet another example of the incredible negative impact of Google’s pattern of crapping out open-source libraries without actually maintaining them, so that people just copy and paste them into their projects.

▲▼ truelson22:19 hn>

So, uh, isn’t the blast radius huge here? Like ticking time bomb for unpatched servers huge once someone figures out how to craft their br payload just right?

Browsers were patched back in March, but if you can get anything else that is unpatched to decode br, and most HTTP clients do by default, and you’ve figured out the right payload (yes not easy, but still), isn’t this, well, really bad? Like Heartbleed big?

▲▼ Rapzid23:07 hn>

Ubuntu still has libbrotli1 patch under review as medium. This is holding up updates to libcurl and thus git and a whole bunch of other stuff.

▲▼ misiek0806:08 hn>

They’ll have it for few months and then make you pay to get the update.

▲▼ nayuki05:43 hn>

I see some irony here. For a period of time, Google chose not to include JPEG XL in Chrome because vulnerabilities in the library could compromise the software - a legitimate concern. Yet, Google is the author of the Brotli data compression format a decade before the JPEG XL drama, and was happy to use it in Chrome and encourage others to use the library, despite the fact that it also increases the attack surface.

▲▼ progbits10:16 hn>

1. People change their minds over time.

2. JXL is waaay more complex than Brotli so the risk of vulnerable implementation is also higher.

They should have demanded more rigor from the Brotli library, same for countless other dependencies chromium has. But there's no irony.

▲▼ cxcorp12:16 hn>

Brotli reduces their compute costs, whereas JPEG XL reduces storage which at least historically is cheaper than compute?

▲▼ gsnedders16:30 hn>

From a browser point-of-view, the real questions are about data size (if you can get the wireless interface back to a low power state, you’re winning on power benchmarks), about decompression cost (again, power benchmarks), and decompression time (for performance benchmarks and user-perceived performance).

Storage and compression compute costs aren’t really relevant — only insofar as if there’s very little adoption, the security risk of exposing the code is there but isn’t providing user benefit.

▲▼ wat1000014:26 hn>

This is getting real close to "yet you participate in society, curious." Yes, Google chose not to use some software and chose to use other software. It's not ironic to decline to use some software because it increases the attack surface, and then find out that it's not enough and the software you did choose to use is vulnerable. It's just unfortunate.

▲▼ rpdillon18:31 hn>

My reading of the critique is that the criteria was unevenly applied. Decompression vulnerabilities exist in both libraries. They rejected one on the basis that it expanded the attack surface area, but accepted the other, despite similar claims applying to it as well.

It's pretty far from the "yet you participate in society" anti-pattern.

─ 1 more ─
▲▼ gsnedders16:23 hn>

Things like Rust in Chromium weren’t even being talked about back when Brotli was introduced to Chromium.

I think Chromium as a project would be happier if they had less unsafe code in general, and holding new dependencies (especially those like media formats, which have a long history of security issues) to that standard doesn’t seem particularly surprising.

There’s always going to be trade-offs: how much benefit does this provide (users, developers) compared with how much risk does it incur (safe/unsafe code, quantity of code you’re now on the line for the security of).

(And that’s taking that reason to not support JPEG XL at face value, ignoring any debate about it.)

▲▼ anthk20:46 hn>

Sandbox + more Rust: vulnerabilities axed down.

▲▼ da_chicken18:21 hn>

Well, don't worry. libjxl includes the brotli library, too, so it's also vulnerable to this.

https://github.com/libjxl/libjxl/pull/5062/commits/269661f71...

▲▼ hahn-kev13:14 hn>

IMO this should be Brotli2Shell if anything

▲▼ doublerabbit13:16 hn>

Cool. C is going to become that cool forgotten forbidden programming language.

▲▼ kristjansson16:46 hn>
>Installing the update isn't enough. A running process keeps the old decoder until it restarts, and a container keeps it until you rebuild the image on a patched base and redeploy

Claudeslop aside, it really is a whole new world we’re in now, where the audience of a run-of-the-mill RCE CVE announcement really does need this stated.

▲▼ 1over13718:13 hn>

Is enabling Brotli a worthwhile performance improvement for, say, wordpress site?

▲▼ mg79461318:16 hn>

Ah yes, domain registered, logo made.

Real carreer starter.

▲▼ sarabarasa10018:46 hn>

Remember when the undici guys deprecated request.formData for _all_ serverside JS installs everywhere including bun, node, deno, because they felt it was unsafe? wonder how they're doing these days.

▲▼ bjoli07:32 hn>

Wasn't that the correct decision? They put a deprecation warning on it to inform people it was unsafe in server context, while also keeping it.

It was unsafe and surprisingly easy to DOS servers using it incorrectly. And by "incorrectly", I mean how a lot of (most?) people used it with user data. An API that happens to be safe by accident when people use it should be deprecated.

▲▼ hoppp19:28 hn>

Is there a fix already in node so I can start updating?

▲▼ philipwhiuk09:08 hn>

Anyone know if there’s a Java decoder?

▲▼ croes13:04 hn>

Why a name that says nothing about the affected software?