New Nginx Exploit

(github.com)

185 points | by hetsaraiya 3 hours ago

16 comments

  • RagingCactus 2 hours ago
    As a security person it is tiring to see so many people here either directly claim or at least allude to the claim that this is somehow much less scary because the _published_ exploit does not bypass ASLR. The writeup claims there is a way to reliably bypass ASLR with this attack. And that is a good default assumption I would be willing to believe without evidence.

    ASLR is a defense-in-depth technique intended to make exploitation more difficult. In almost all cases it is only a matter of time and skill to also include an ASLR bypass. Both requirements continue being lowered by LLM agents every few weeks. It is only a matter of time (and probably not a lot of time) until a fully weaponized exploit is developed. It may be published, it may also be kept private.

    It is straight up wrong to say "if you have ASLR enabled, you're not at any risk from this" and saying this is extremely harmful for anyone that trusts claims like that.

    This wrong belief that you shouldn't care about security vulnerabilities because mitigations may make exploitation more difficult has already caused so much harm in the past. Be glad that modern mitigations exist, but patch your stuff asap. If you are a vendor, do not treat vulnerability reports as invalid because the researcher has not provided an ASLR bypass. Fix the root cause and hope mitigations buy you enough time to patch before you get owned.

    • kro 1 hour ago
      No remotely reachable vuln should be taken lightly.

      At the moment though, the preconditions look odd. I've been using nginx in various constellations for 10 years and never once combined rewrite and set.

    • embedding-shape 2 hours ago
      > and saying this is extremely harmful for anyone that trusts claims like that.

      Kind of feels like the burden is on the one who is reading it though, good luck stopping people from spreading misinformation on the internet, most of them don't even know they're wrong.

      What's extremely harmful is trusting random internet comments stating stuff confidently. Get good at seeing through that, and it'll serve you well in security and beyond.

  • danslo 3 hours ago
    This one's pretty bad but there are some preconditions.

    Requires a "rewrite" directive with a questionmark in the replacement string, and then a subsequent "set" directive that references a regex capture group (e.g. set $var $1).

    Also the POC assumes ASLR is disabled.

    • argee 2 hours ago
    • dsr_ 2 hours ago
      Does any distro disable ASLR by default?

      If you were to do it by hand, nginx doesn't come to mind as a likely candidate.

      • Bender 22 minutes ago
        Not the person you asked but I am not aware of any that disable ASLR by default, though most default to 1 which only enables ASLR for applications compiled to enable it vs 2 forcing it on or 3 on some distributions that use a hardened kernel. Rather than trusting any assumptions I prefer to run checksec [1] on every OS I touch. It's an old script but works just as well today as it did long ago. One may find that some applications are missing some basic hardening compile time options. The script is not an exhaustive test of all modern hardening options.

        Typical invocation:

            checksec.sh --proc-all
        
        This invocation will list the status of RELRO, Stack Canary, NX/PaX, PIE of all running daemons. My CachyOS installation for example is missing Stack Canaries for all daemons.

            checksec.sh --fortify-proc 732
            * Process name (PID)                         : sshd (732)
            * FORTIFY_SOURCE support available (libc)    : Yes
            * Binary compiled with FORTIFY_SOURCE support: N
        
        Some additional compile time hardening options [2] and discussion [3].

        [1] - https://www.trapkit.de/tools/checksec/

        [2] - https://best.openssf.org/Compiler-Hardening-Guides/Compiler-...

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

  • neomantra 2 hours ago
    The official F5 page is here: https://my.f5.com/manage/s/article/K000161019

    As noted elsewhere, ASLR protects you. While you are waiting for your affected platform to get the fix, they note the mitigation:

    "use named captures instead of unnamed captures in rewrite definition"

    "To mitigate this vulnerability for this example, replace $1 and $2 with the appropriate named captures, $user_id and $section"

    F5 patched 1.31.0 and 1.30.1.

    OpenResty has a patch for 1.27 and 1.29: https://github.com/openresty/openresty/commit/ee60fb9cf645c9...

    You can track OpenResty's (a Lua application server based on Nginx) progress here: https://github.com/openresty/openresty/issues/1119

  • jcalvinowens 2 hours ago
    • linkregister 2 hours ago
      Worker processes are forked from the master, which means they receive the same memory layout. You get unlimited crashes against the worker. There's probably a way to exploit that to get a read oracle. At the very least this is a reliable denial of service.

      Depth First's full writeup: https://depthfirst.com/research/nginx-rift-achieving-nginx-r...

      • jcalvinowens 2 hours ago
        Sure, but I think the github README ought to make it more clear the POC as-is doesn't work against nginx on any current Linux distro.
        • gavinsyancey 1 hour ago
          So you're not vulnerable to script-kiddies running the published PoC. Still probably vulnerable to to a sufficiently-motivated attacker.
  • ptx 2 hours ago
    Is there a good alternative to Apache and Nginx that's written in a memory-safe language and not full of security holes? I briefly looked at Jetty (written in Java) and Caddy (written in Go) but they seem to have a history of vulnerabilities of other types (e.g. shell injection in Jetty) so I'm not sure they would be any better.
    • toast0 6 minutes ago
      Apache and I think Nginx have a huge list of features and stuff. Most alternate http servers limit the scope a lot, so you'd need to specify what features you're interested in.

      But I haven't seen a whole lot of discussion of http servers in memory safe languages. The big three C-based servers: Apache, Nginx, and lighttpd are all pretty solid... I don't think there's a lot of people interested in giving that up for a new project just because of the language.

    • dgellow 1 hour ago
      Any software used at the scale of Apache and nginx will have a history of vulnerabilities. The fact they both survived with their market share for so long is a good sign
      • ptx 32 minutes ago
        Right, that's essentially what I'm thinking.

        On the one hand Apache and Nginx are mature and proven but, being written in C, they will always suffer from memory-safety issues like this one and the recent Apache vulnerabilities.

        On the other hand, the alternatives are perhaps not as mature and perhaps not implemented as securely as they could be, given that e.g. Caddy had multiple vulnerabilities in its request parsing this year and Jetty's shell injection vulnerability seems easily foreseeable and avoidable. Using a memory-safe language doesn't help much if you then (to take an unrelated but well-known example) implement arbitrary code execution as a feature in the logging library.

    • embedding-shape 2 hours ago
      Caddy been a breeze to use, bit sucky model with "we have thousands of binaries depending on what combination of plugins you want" instead of a proper plugin system, but if you're building it from source, it's pretty nifty and simple anyways.
      • eikenberry 1 hour ago
        Recompiling with the features you want is a great model for a free software project. So much simpler to write and maintain compared to a plugin system that it really makes more sense in a lot of cases.
      • vbernat 52 minutes ago
        nginx had this defect for a long time too!
  • geophph 7 minutes ago
    Someone tell LowLevel
  • panzi 2 hours ago
    Does Debian 12 have this patched? But I guess I'm not affected if I don't use `rewrite` or `set` anywhere?
    • aftbit 40 minutes ago
    • wiredfool 57 minutes ago
      Ubuntu has patched as of this morning. Debian doesn't look like they've patched trixie yet.
      • rslashuser 25 minutes ago
        Just as a PSA, I found that "nginx -v" was not detailed about the version sufficient to check, but "apt list nginx" gave the full version number that was checkable, and indeed the 24.04 version of this morning (1.24.0-2ubuntu7.8) is patched.
    • iririririr 2 hours ago
      I find it very unlikely that anyone using nginx does NOT use `set` at least.

      Most nginx use cases are to end tls and then pass the request to node/php/go/etc. So, I bet you have at least one set with attacker controller data on a line like 'proxy_set_header X-Host $host;'

      edit: nvm. aparently named captures are not affect. Unless you have a $1 somewhere, it should be fine.

      • babuskov 33 minutes ago
        The default NGINX PHP integration uses this:

            # regex to split $uri to $fastcgi_script_name and $fastcgi_path
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            set $path_info $fastcgi_path_info;
    • lpcvoid 2 hours ago
      [dead]
  • ChrisArchitect 2 hours ago
  • FlyThruTheSun 2 hours ago
    [dead]
  • kitsune1 2 hours ago
    [dead]
  • jhatemyjob 1 hour ago
    tl;dr If you don't use ngx_http_rewrite_module, you're fine

    Honestly it's such a weird feature, if you're doing complicated redirects like this in nginx where PCRE is necessary, you should do it in your application code. And if you need speed use ngx_http_lua_module.

    • PaulDavisThe1st 55 minutes ago
      We do this for 3 sub-domains of ardour.org; there's no application code involved, because we're rewriting historical URLs to their current form, and the "application" doesn't do that or need to do that or need to know about that.
  • hetsaraiya 3 hours ago
    Just saw this pop up — full public PoC for CVE-2026-42945 ("NGINX Rift"), a heap buffer overflow in NGINX's ngx_http_rewrite_module that's been there since 0.6.27 (2008).

    It triggers on a very common pattern: a `rewrite` directive (with an unnamed capture like $1/$2 and a `?` in the replacement string) followed by `set`, `if`, or another `rewrite`. The root cause is a classic two-pass script engine bug (length calculation vs. actual copy pass with ngx_escape_uri).

    The PoC turns it into unauthenticated RCE using cross-request heap feng shui + pool cleanup pointer corruption. Tested with a simple Docker setup.

    - Repo + Python exploit: https://github.com/DepthFirstDisclosures/Nginx-Rift - Full technical write-up: https://depthfirst.com/research/nginx-rift-achieving-nginx-r... - F5 advisory + patches (1.31.0 / 1.30.1 for OSS, plus Plus updates): https://my.f5.com/manage/s/article/K000160932 (or the latest K000161019)

    Affects basically any NGINX doing URL rewriting in front of apps/PHP/etc. Workaround mentioned is switching to named captures.

    The discovery angle is also interesting — it was found autonomously by depthfirst's security analysis tool after one-click onboarding of the NGINX source.

    Anyone running NGINX in production using rewrite rules? How are you checking your configs? Thoughts on the exploit chain or the AI-assisted finding process?

  • stephenlf 3 hours ago
    Crap
    • Twirrim 3 hours ago
      Given it relies on ASLR being disabled, it's extremely unlikely you're at any risk from this.
      • Tepix 2 hours ago
        That‘s wishful thinking
    • hmokiguess 3 hours ago
      I read that in my own voice, so relatable hahahaha
  • pjmlp 1 hour ago
    Looks into the CVE, ah an heap memory corruption, business as usual.
  • jmaw 3 hours ago
    Wow, coming from the webdev world. It is so funny seeing NGINX, one of the widest used web servers in the world, on version 1.x. React is on version 19. Really shows how differently new vs. old software is designed and built, and not necessarily in a good way.

    https://world.hey.com/dhh/finished-software-8ee43637 https://josem.co/the-beauty-of-finished-software/

    • 0x457 2 hours ago
      That's because nginx doesn't break things for end user every release, so there is no reason to bump major version.
      • embedding-shape 2 hours ago
        I bet nginx doesn't even follow semantic versioning, which you seem to be talking about.
    • chasd00 2 hours ago
      anyone can choose any version string convention they want for their project. Comparing two different pieces of software by their version string doesn't make sense.
    • syoc 2 hours ago
      I guess someone need to update https://0ver.org/ then.
    • ranger_danger 3 hours ago
      I chalk that up more to different versioning schemes rather than how much work is being done. If nginx changed whole numbers like react did, I bet it would be even higher.
    • joecool1029 3 hours ago
      lighttpd still around too, on 1.4.82, not too much changed there.
      • ranger_danger 3 hours ago
        They've been working on version 2.0 for many years now as well, I wonder when they think a release might happen.
    • shooly 2 hours ago
      > not necessarily in a good way

      How do you think versioning works? You know that it's completely arbitrary and up to the author, right? Very ironic comment.