85 comments

  • mirashii 5 hours ago ago

    I feel as though this should be googlebrotli2shell, not http2shell. Google deserves to take a bit of a reputational hit for this. This is a basic memory safety violation, from the same organization that does wuffs, that promotes Rust for memory safety, that has Carbon. zstd has high quality rust implementations and is from roughly the same time.

    On top of that, the brotli library saw no releases for almost a full year, with the fix for this vulnerability being committed back in February. Google builds from main for all their projects, so were unaffected, but open source releases are a complete afterthought. Over 100 commits with miscellaneous fixes left languishing until a security incident forces a release.

    • CodesInChaos 3 hours ago ago

      > zstd has high quality rust implementations

      On the decompression side yes, on the compression side the first good zstd rust port was announced yesterday. Until then, brotli was better supported in Rust than zstd.

      But I agree, decompression libraries should be (mostly) memory safe nowadays, since that side is both easier to implement and more likely to be vulnerable.

  • ataraxia937 7 hours ago ago

    This one again feels overblown, at least for servers. I just checked an org of over 200 GitHub repos. Node, Python, and C#. None of them are vulnerable... because none of them actually call the Brotli decoder. It's just not enabled by default on the server side, by the platforms themselves. This is much like the PHP bugs, where specific conditions have to be in play before you're actually vulnerable.

    For clients? Sure, that's a bigger risk. Patch them. But bad guys aren't attacking your clients unless the clients connect to them. Don't stay up late to fix this.

    (And yes, .NET is included here, because Microsoft's Brotli module is a binding for Google's vulnerable reference implementation.)

    • guac 5 hours ago ago

      Doesn't node's fetch call the decoder automatically for `br` responses? So any attacker controlled content that a server fetch's may be vulnerable?

    • babuskov 6 hours ago ago

      How did you check? Is there are PoC or some kind of command to run?

      • shakna an hour ago ago

        Is your Brotli library built from older than the February commit? (The last tagged release is before then.)

        If so, might be vulnerable.

        Don't have Brotli enabled? Not vulnerable to this.

    • Koffiepoeder 2 hours ago ago

      The PHP thing is exploitable by now. No specific conditions needed. Stop spreading misinformation.

      • FreakLegion 13 minutes ago ago

        There were no known breaches or end-to-end exploits as of Friday. I've seen LLM hallucinations purporting to be exploits and real exploits missing pieces (address leaks), but nothing complete. Friends at some of the bigger IR practices (CrowdStrike CAO, Unit 42, Talos) have said the same thing.

        It'll happen sooner or later, but all signs are that this was first and foremost a process nightmare. It wasn't another Log4Shell.

    • bbor 6 hours ago ago

      I mean, I dare say the 4,200,000 Python servers built yesterday alone with this package might disagree...? https://pypistats.org/packages/brotli

      I can't find download numbers for extras, but it comes in the pretty dang innocuous-seeming `aiohttp[speedups]`, as well. Also `urllib3[brotli]`. Many, many people will be running these servers without recognizing the name of the library, especially in the agentic era.

      I might be missing something obvious in your message, cause I don't see why server/client is relevant. Why would a frontend app speak a protocol that the backend doesn't?

      • deathanatos 6 hours ago ago

        That's just the total number of times that package was downloaded, which is completely unrelated to how many servers it appears in? Same with `aiohttp`: aiohttp can be used as a client library.

        Sure, people should check their dependency trees, and make informed decisions.

        • bbor an hour ago ago

          Ok putting aside the "client" thing again assuming I'm just behind the times on python client-server architecture norms: What kind of vulnerability would concern you?

          Sure, we can't say for sure that all 4 million of the jobs who downloaded (not built-with, but downloaded to cache anew) this library yesterday are running public-facing servers. But what subset of them might be? How much would it take before it's a concern?

          Python feels particularly worrisome to me, as those are the kind of casually-setup servers on local dev boxes for some random little tool that are the most fertile ground for an exploit like this, where creds could be spread around in plaintext and malware could go unnoticed for a long time. And, of course, where the developers responsible probably aren't in the habit of watching the CVE list (yet...).

          I hope I'm not coming across as rude -- I am honestly curious!

      • vinyl7 5 hours ago ago

        The whole package manager system is a complete disaster. A huge number of dependencies are pulled in that go unused in most projects, so the number of downloads is an extremely unreliable number. I'd be surprised if more than 10% of those downloads actually use the brotli decoder.

        • bbor an hour ago ago

          Well first off I love PyPI and am greatly offended on the behalf of thew newly-formed (forming?) council to fix it, but also I don't think that applies in this case. If your server is capable of decoding brotli packets it's at risk -- you don't have to actually use that functionality regularly.

  • anonymous908213 8 hours ago ago

    I could do without every memory bug getting a cute sensational name and marketing push, I have to say.

    • aaronbrethorst 6 hours ago ago

      We should start naming them like hurricanes: NIST creates a list of alphabetical names and assigns any CVE >= 9.0 with a name. Vulnerability Alex (CVE 9.4)

      • ks2048 6 hours ago ago

        Vulnerability Zzyzx in a week

        • nevir 5 hours ago ago

          Tomorrow

      • cowlevel 3 hours ago ago

        CVE scores are already inflated because it looks good for their discoverers.

      • duxup 3 hours ago ago

        "Oh man, Jan really ruined my weekend."

        I actually kinda like how that works.

      • my-huge-pony an hour ago ago

        CVSS is a terrible proxy for vulnerability real world impact. Not to mention, that CVE with CVSS 10.0 in Bob's Flower Names library with 5 users is probably not that important.

    • lovich 7 hours ago ago

      that ship sailed a while ago. Rowhammer is the first one I can remember

      • vinkelhake 7 hours ago ago

        Let's not forget about heartbleed!

        • judge2020 7 hours ago ago

          Back in the email days the virus authors named them, e.g. YouAreAnIdiot, ILoveYou

          • Waterluvian 6 hours ago ago

            The Blaster virus was a fun one.

        • mhio 7 hours ago ago

          That was the first exploit logo I can recall

          • weinzierl 7 hours ago ago

            The most memorable one for me is DirtyCOW.

      • card_zero 5 hours ago ago

        Rowhammer was kind of special, surely, what with being based on a physical design flaw?

  • rvanlaar 8 hours ago ago

    It looks like brotli <= 1.2.0 is vulnerable.

    The python package has already been updated to 1.2.1. https://pypi.org/project/brotli/1.2.1/

    • Gigachad 7 hours ago ago

      This is the fix commit https://github.com/google/brotli/commit/b418fa81c48262a86a95...

      Another day another out of bounds access in C code.

      • ks2048 6 hours ago ago

        Can someone point the heart of this fix? I see a bunch of change of naming of constants, etc

        • red75prime 5 hours ago ago

          As far as I understand it's line 1978: `goto saveStateAndReturn;`. Early return that prevents further processing.

        • cowlevel 3 hours ago ago

          Doesn't mix up error-need-more-data with error-invalid-data

        • therein 4 hours ago ago

          Had a short moment to glance at it. My guess would be BROTLI_DCHECK(s>meta_block_remaining_len <= (int)BROTLI_BLOCK_SIZE_CAP) along with BROTLI_SAFE_WITH_STATUS having that goto saveStateAndReturn on non BROTLI_DECODER_SUCCESS.

  • hatthew 6 hours ago ago

    I feel like normal security issues don't get much publicity. The PHP and eMudhra issues seemed severe, and worth publicity. But then with things like this, I'm not sure. Is this a severe issue? Or is it just a run of the mill issue that's only newsworthy because web security is on people's minds right now?

    • Gigachad 6 hours ago ago

      The whole industry is on edge right now, and numbers wise the CVE count has exploded beyond belief. It's probably to take the side of caution, treat everything as important and update everything promptly rather than the old way of doing things where libraries are left months or years out of date until something happens.

      • tdeck 4 hours ago ago

        > I's probably to take the side of caution, treat everything as important and update everything promptly

        The risk is that if people keep seeing headlines about some vuln emergency that isn't in fact exploitable in most cases they'll just start to ignore them.

    • cowlevel 3 hours ago ago

      If your code ever accesses an HTTP URL that server can hack it. Some of the time, clients might be able to hack it too. This is comparable to the PHP issue.

    • oofbey 2 hours ago ago

      I’d say this is reasonably severe. For a decently large class of servers exposed to the internet there’s a pretty simple way to RCE them. The actual set of vulnerable servers isn’t nearly as big as many would like to suggest. But if you’re running a node/express server, you should really be in panic mode right now.

  • kccqzy 7 hours ago ago

    There’s apparently no writeup on exactly what was the fix. So I’m going to make a guess that this is the chromium commit that fixed the problem: https://source.chromium.org/chromium/chromium/src/+/224140d4...

    And this commit contained a refactoring from BROTLI_BOOL to BrotliDecoderErrorCode so the situation was that probably one of the error conditions previously simply returned false but needed more detail about what went wrong to continue safely.

    Well okay this change from `if (prev_ix < cur_ix)` to `if (prev_ix < cur_ix && cached_backward <= max_backward)` is also suspicious and could be an related or unrelated hardening fix.

  • iracigt 2 hours ago ago

    I had some fun playing with this on Wednesday. After the node release, it was still about a day before the patched brotli package showed up on pypi.

    Very easy to reproduce the with a single httpx.get(URL) in Python, but I couldn’t figure out an ASLR bypass from that context. Crashing is easy and I (with LLM assistance) can get some read/write primitives, but no chain into getting a function pointer where I needed it. Probably needs heap manipulation, but I lost interest at that point.

    Really hoping we see an actual RCE PoC. Also, the open weight models can easily provide a "regression test" that would shoo away most crawlers.

    • oofbey an hour ago ago

      Why are you hoping for an RCE PoC? Curiosity's sake? Or because you'd like to use it offensively? The existence/publication of such a PoC makes the world less safe.

  • adzm 8 hours ago ago

    Interestingly the commit that fixes this in brotli dates back to February https://github.com/google/brotli/commit/0ed4268a4401abcb4472...

    • cowlevel 8 hours ago ago

      OpenAI's tweet says it wasn't recognized as security relevant so wasn't important enough to make a release - until their agent realised it was.

      https://nitter.jaydenha.uk/OpenAI/status/2113766354386084338

      • dofm 7 hours ago ago

        Until their agent realised there was a good chance of a press release in it.

        • robswc 5 hours ago ago

          I am just amazed at how many people are blind to this.

          Every single time one of these labs does something it is almost always sensationalized. They absolutely cannot refrain from describing how incredible their models are, it has to be injected into everything. I get this is basic grow-your-company stuff but it is getting obnoxious.

          • dofm 4 hours ago ago

            I think — and this is not at all a criticism of your comment — that we all have to urgently get out of the habit of calling them “labs”, because in this way we reinforce their ability to portray themselves as sort of scientifically neutral observers of what is happening. I make this error all the time and I am trying to stop.

            Though I got told off for saying it maybe too snarkily, I also think that when well-paid, high-profile employees of one of these LLM as a service companies post in controversial or notable ways that could affect the perception of their employer’s products, we should consider that they are acting as a spokesperson. Any tweet where you might think “do I need to consider how this relates to my employer’s SEC filings” is PR. Just because they are acting in informal ways doesn’t mean it’s personal opinion; we shouldn’t give it maximum benefit of the doubt.

            Similarly, I think we have to consider that Patch The Planet may be vulnerable to perverse incentives.

        • SV_BubbleTime 7 hours ago ago

          Chat, we need to constantly be justifying our absolutely absurd IPO. Use UltraMegThink and reference the ExploitToGetUsRegualtoryCapture.md. kkthnx

  • Sytten 8 hours ago ago

    Since I checked Rust servers should be fine since the brotli crate is not a binding on the C.

    • doodlesdev 6 hours ago ago

      Apparently it doesn't contain a binding to the C library, but it does contain some compatibility and shares design decisions with it. In other words, it's not a clean-room implementation from the spec, but rather it's a port. Since this RCE is triggered by a OOB access, it's unlikely to have made it into the crate, but it's good to keep these things in mind.

    • octoberfranklin 5 hours ago ago

      Nope, run ldd on cargo; it links to libbrotlidec.so.1. Via libcurl.

      Aren't you glad cargo connects to the network whenever it feels like it? I just love it when my build tool does that.

      There are 753 crates that drag in brotli this way: https://lib.rs/crates/curl/rev

      The real killer is the oath crate. Basically every rust project using OAuth is vulnerable. That's 398 projects on crates.io plus who knows how many binaries (a lot of non-library projects don't bother publishing to crates.io).

      Another scary one is "a practical HTTP client that is fun" https://lib.rs/crates/isahc used in 317 crates including sequoia. In case you wanted somebody to steal your private keys.

  • kylepomykala 7 hours ago ago

    They just keep coming, don't they?

    • Gigachad 7 hours ago ago

      For as long as we still have C code accessible to the internet.

    • hoppp 7 hours ago ago

      Never gonna stop. Consider it normal. Hey, at least humans still have a job. Incident response

      • awakeasleep 7 hours ago ago

        Let's not kid ourselves, llm's are already doing the incident response for this in many infrastructure teams

        • chelmzy 6 hours ago ago

          I would love to hear your definition of this. Are llms used to aid in incident response? 100%. Why would I sit there and manually review data from multiple sources when I could have an agent pull from all and summarize? But to hand it off end to end? I haven't seen anyone accomplish this.

        • hoppp 7 hours ago ago

          But they don't respond with fear and flailing arms!

  • cowlevel 9 hours ago ago

    Likely mitigation: disable brotli (br) content-encoding on both sides

    • thayne 7 hours ago ago

      Unfortunately, AFAICT, there is no way to do this for node's fetch. I suspect there are other client libraries that don't have a way to disable it.

  • VladVladikoff 5 hours ago ago

    >A significant blast radius

    Is it really so hard to write a 2 sentence tweet that you need an AI to do it for you?

  • dboreham 7 hours ago ago

    This is a better article: https://www.aikido.dev/blog/python-packages-vulnerable-node2...

    and this is the actual CVE report, which doesn't say much: https://www.cve.org/CVERecord?id=CVE-2026-111497

  • 0xbadcafebee 5 hours ago ago

    If you are using Python, you are affected if you use urllib3, requests, httpx, aiohttp, Scapy, and others, if they were installed when Brotli was also installed. You can mitigate by uninstalling brotli and brotlicffi, OR, strip `br` from Accept-Encoding on outbound AND reject `Content-Encoding: br` on inbound.

    This is not a server-side issue (unless for some weird reason you're using Brotli decoding in your http request processing), it's client-side.

    Thank you Paul for the write-up (https://opensourcemalware.com/blog/node2shell-affects-python)

    • cowlevel 3 hours ago ago

      HTTP requests can use content-encoding:br but this isn't normal in browsers so might not be implemented in many servers

  • csiegert 6 hours ago ago

    Is Deno affected, too? It uses brotli by default. But I don’t know how it is implemented.

    • gnabgib 6 hours ago ago

      Deno is dead (baby)

      > We will support the Deno runtime for another year with monthly releases containing bug fixes and security updates. After that year we will end our development

      https://deno.com/blog/cloudflare

      • csiegert 6 hours ago ago

        I know that it is dead but since they provide security updates for another year I haven’t migrated off of it immediately. Anyways, the Deno runtime uses a brotli Rust crate that does not wrap C code, and with unsafe off, so I assume it is safe.

        • gnabgib 6 hours ago ago

          So a person of rhetorical questions? Great

          • csiegert 5 hours ago ago

            No. After your unhelpful answer I started investigating if my deployment is affected.

    • Amsozzer 6 hours ago ago

      I doubt it

  • cpburns2009 7 hours ago ago
  • QuadmasterXLII 8 hours ago ago

    is flask hello world with gunicorn behind apache vulnerable?

    • cpburns2009 7 hours ago ago

      Only decompression with Google's brotli library is affected. So if you use "Brotli" or "brotlicffi" in your Python app to decompress brotli, you're vulnerable. Compressing responses with brotli from Apache is safe.

    • TZubiri 8 hours ago ago

      what I can say is that a 5 liner hello world starting with ‘import socket’ is not affected

      whether a hello wolrd in fastapi is affected might also be interesting

  • bogomind 8 hours ago ago

    The brotli commit under this is a state fix more than a bounds fix: DecodeBlockTypeAndLength used to return BROTLI_FALSE for both "needs more input" and "format error", so a stream truncated at a block-switch boundary is reported as invalid, and a caller that branches on that can be walked into the wrong path. The commit gives the function a BrotliDecoderErrorCode, adds a distinct BLOCK_SWITCH format error and keeps NEEDS_MORE_INPUT for the truncated case (google/brotli 0ed4268).

    Worth checking before the panic: node vendors that decoder in deps/brotli, and its v24.x tree already carries the changed function, so 24.x is not exposing the old behaviour. What is exposed is anything still vendoring brotli from before February 2026, and "disable br" is a fine stopgap that leaves the decoder in place.

    From the honeypot side, an HTTP/1.1-only decoy farm is blind to this class. Mine is: no h2 preface in 7,900 lines, so the sweepers can't tell me whether anybody is already trying it.

    • cowlevel 3 hours ago ago

      This is an AI karmabot and should remain flagged.

  • DogeGode 8 hours ago ago

    Another day, another buffer-overflow vulnerability in C code …

    • cowlevel 8 hours ago ago

      No language is safe, not even Rust

      https://news.ycombinator.com/item?id=50069499

      Edit: why flagged

      • Dylan16807 an hour ago ago

        > Edit: why flagged

        Well for one you linked a bug that didn't lead to any known vulnerabilities. (And isn't an overflow.)

      • OCTAGRAM 5 hours ago ago

        Ada is measured to have 9 times less bugs in average

      • caymanjim 6 hours ago ago

        > Edit: why flagged

        Rust Derangement Syndrome is at epidemic levels here.

        • gnabgib 6 hours ago ago

          Check history, unconstrained

  • userbinator 6 hours ago ago

    Brotli, another one of those pseudostandards[1] from Big G that I was avoiding all along. Dodged another bullet.

    [1] When more than half of the "standard" https://www.rfc-editor.org/info/rfc7932/#page-44 is an opaque binary blob, they're really not encouraging independent implementations.

    Edit: the votes really show what an echochamber for Big G this place has become. FUCK YOU, GOOGLE!

    • johncolanduoni 5 hours ago ago

      How do you suggest they provide the static compression dictionary?

      • userbinator 5 hours ago ago

        You don't. Any real compression algorithm, including all the other standard ones, doesn't need such a thing.

        • Dylan16807 an hour ago ago

          Many compression formats support static dictionaries, and for a good reason. Short messages don't compress well. If you know a bunch of common data for a context, you can make the first several kilobytes compress a lot better.

  • profdevloper 9 hours ago ago