Vulnerabilities

9 min readUpdated

nginx 1.18.0 vulnerabilities: a banner triage guide

Quick answer

A scanner that flags an nginx/1.18.0 Server header is reading the base version, not the patch level. On Ubuntu 22.04 and Debian 11 the package keeps the 1.18.0 version but carries backported security fixes, so most findings are already closed; Debian 11's free support ended on 31 August 2026, though. This page maps every CVE that affects 1.18.0 to its configuration precondition, upstream fix and distro backport, and shows how to check your real patch level.

01Does an nginx/1.18.0 banner mean I am exploitable?

Usually not on its own. A Server header or scanner banner of nginx/1.18.0 tells you the upstream base version, which was released on 21 April 2020. It does not tell you which security patches the build carries. On the distributions where 1.18.0 is common, Ubuntu 22.04 LTS and Debian 11, the package keeps the 1.18.0 version string while the maintainers add fixes on top, so the banner and the real risk are two different things.

Two more facts shape the triage. First, most nginx CVEs need a specific, often non-default configuration to be reachable, so a version match is necessary but rarely sufficient. Second, the upstream 1.18 branch itself reached end of life years ago: the nginx project only patches the current stable (1.30.x) and mainline (1.31.x) lines, so a build compiled from upstream 1.18.0 source gets no fixes at all. The distinction that matters is whether your 1.18.0 is a maintained distribution package or an unmaintained source build.

02Why a 1.18.0 banner is usually already patched

Debian and Ubuntu follow a stable-release policy: within a release they do not jump to a new upstream version, they backport the security fix into the existing one. So Ubuntu 22.04 ships nginx as 1.18.0-6ubuntu14.N and Debian 11 as 1.18.0-6.1+deb11uN, with the trailing number rising every time a fix lands. The headline 1.18.0 never changes, which is exactly what confuses version-based scanners.

That is why hiding the banner with server_tokens off reduces scanner noise but changes nothing about your actual exposure. The useful move is the opposite: read the package changelog to see which CVEs your build has fixed. An Ubuntu 22.04 box that applies security updates is clear of all but the two newest findings a scanner lists against 1.18.0, even though the version string is unchanged; a free Debian 11 install is missing five, as the table below shows. For the same pattern on the application layer, compare the distro-backport logic on the PHP2Shell page.

03How do I check my real patch level?

Compare the full package version, not the banner, against the fixes you care about, and confirm from the changelog. The commands below are for Debian and Ubuntu.

Banner version versus real patch level
# the banner version: only the distro base version
nginx -v

# the real patch level: the full package version with the distro suffix
dpkg -l nginx nginx-common | grep '^ii'

# did the distro backport a specific fix into the INSTALLED build?
zcat /usr/share/doc/nginx/changelog.Debian.gz | grep -m1 CVE-2026-42945
# (apt changelog nginx shows the candidate version, not the installed one)

# stop advertising the version at all (add to the http { } block):
#   server_tokens off;

04Triage: the CVEs that affect 1.18.0

Every current nginx advisory whose vulnerable range includes 1.18.0 is listed below, with the configuration it needs, the first upstream release that fixes it, and the backport status on Ubuntu 22.04 (jammy) and Debian 11 (bullseye). Most entries need a module or directive that is not in a default build, so read the precondition before assuming a finding applies.

Scanners also report IDs that are not on the nginx.org list. CVE-2020-12440, often shown against 1.18.0, was rejected by its CNA as not a security issue. Ubuntu marks its nginx packages on 20.04, 22.04 and 24.04 as not affected by HTTP/2 Rapid Reset, CVE-2023-44487. Those findings can be closed with that evidence rather than a patch.

CVENeeds (precondition)Upstream fixedUbuntu 22.04Debian 11
CVE-2026-15176alias + rewrite + $request_filename in set, return or log_format1.31.7 / 1.30.6Pending (needs-triage)Unfixed, also in ELTS
CVE-2026-97205aio enabled + SSI include virtual1.31.7 / 1.30.6Pending (needs-triage)Unfixed, also in ELTS
CVE-2026-42533map with regex capture read before output, or volatile map1.31.3 / 1.30.41.18.0-6ubuntu14.21ELTS only: 1.18.0-6.1+deb11u9
CVE-2026-60005slice module (non-default) + unnamed captures, or background cache update1.31.3 / 1.30.41.18.0-6ubuntu14.17ELTS only: 1.18.0-6.1+deb11u9
CVE-2026-56434SSI + proxy_pass + proxy_buffering off + MITM upstream1.31.3 / 1.30.41.18.0-6ubuntu14.17ELTS only: 1.18.0-6.1+deb11u9
CVE-2026-42055grpc_pass + ignore_invalid_headers off + header buffers over 2 MB1.31.2 / 1.30.31.18.0-6ubuntu14.161.18.0-6.1+deb11u8
CVE-2026-48142charset + source_charset utf-8 in one location1.31.2 / 1.30.31.18.0-6ubuntu14.161.18.0-6.1+deb11u8
CVE-2026-9256rewrite with overlapping captures ($1$2) in a redirect or arguments1.31.1 / 1.30.21.18.0-6ubuntu14.121.18.0-6.1+deb11u7
CVE-2026-42945rewrite with ? in the replacement, then rewrite, if or set with $1 (NGINX Rift)1.31.0 / 1.30.11.18.0-6ubuntu14.111.18.0-6.1+deb11u6
CVE-2026-42946scgi_pass or uwsgi_pass + MITM upstream1.31.0 / 1.30.11.18.0-6ubuntu14.121.18.0-6.1+deb11u6
CVE-2026-42934charset + source_charset + charset_map + proxy_pass with buffering off1.31.0 / 1.30.11.18.0-6ubuntu14.121.18.0-6.1+deb11u6
CVE-2026-27654WebDAV MOVE/COPY + prefix location + alias1.29.7 / 1.28.31.18.0-6ubuntu14.101.18.0-6.1+deb11u6
CVE-2026-32647, CVE-2026-27784mp4 module + mp4 directive (crafted MP4); 27784 hits 32-bit builds only1.29.7 / 1.28.31.18.0-6ubuntu14.101.18.0-6.1+deb11u6
CVE-2026-28753mail proxy (SMTP) + attacker-controlled DNS responses1.29.7 / 1.28.31.18.0-6ubuntu14.101.18.0-6.1+deb11u6
CVE-2026-27651mail auth_http + CRAM-MD5 or APOP + Auth-Wait retry1.29.7 / 1.28.31.18.0-6ubuntu14.101.18.0-6.1+deb11u6
CVE-2026-1642proxy to upstream TLS + MITM upstream1.29.5 / 1.28.21.18.0-6ubuntu14.81.18.0-6.1+deb11u6
CVE-2025-53859mail SMTP + smtp_auth none + Auth-Wait from the auth server1.29.11.18.0-6ubuntu14.71.18.0-6.1+deb11u6
CVE-2025-23419shared server blocks + client-cert auth + TLS resumption1.27.4 / 1.26.31.18.0-6ubuntu14.61.18.0-6.1+deb11u4
CVE-2024-7347mp4 module + mp4 directive (crafted MP4)1.27.1 / 1.26.21.18.0-6ubuntu14.51.18.0-6.1+deb11u4
CVE-2022-41741/41742mp4 module + mp4 directive (crafted MP4)1.23.2 / 1.22.11.18.0-6ubuntu14.31.18.0-6.1+deb11u3
CVE-2021-23017resolver directive + forgeable DNS responses1.21.0 / 1.20.11.18.0-6ubuntu91.18.0-6.1 (base)

05Which findings actually need non-default config?

The table shows that almost none of these are reachable on a plain reverse proxy. Several need a man-in-the-middle position on an upstream connection (the scgi, uwsgi, SSI and TLS-upstream injection bugs), which is a much higher bar than sending a crafted request. Several need the mp4 module and a served MP4 file. The dav, slice, charset and mail entries each need their respective module and directive, and the resolver bug needs forged DNS responses.

The ones to check first are the rewrite, map and alias bugs: they appear in ordinary configs, and once the matching directive is present a crafted HTTP request is all they need. If your config uses rewrite with captures, prioritise NGINX Rift, CVE-2026-42945 and CVE-2026-9256; if it uses map with regex, prioritise the map overflow, CVE-2026-42533; the alias-plus-rewrite overflow CVE-2026-15176 needs a $request_filename read as well. A quick audit of the merged config narrows the list fast.

Flag the modules and directives these CVEs need
nginx -T 2>/dev/null > /tmp/nginx-full.conf

grep -nE '(^|[{;])\s*(mp4|slice|ssi|aio|dav_methods|grpc_pass|scgi_pass|uwsgi_pass|resolver|charset|source_charset|proxy_buffering|mail|smtp_auth)\b' \
     /tmp/nginx-full.conf

# rewrite, map and alias: the shapes behind the request-reachable overflows
grep -nE '(^|[{;])\s*(rewrite|map|alias)\b' /tmp/nginx-full.conf

06Debian 11 and Ubuntu 22.04 support status

The two platforms are not in the same place. Ubuntu 22.04 LTS is in standard security maintenance until May 2027, so it still receives nginx security updates; as of 24 October 2026 the newest two advisories (CVE-2026-15176 and CVE-2026-97205) were still at needs-triage for it, while everything older was fixed at the build shown above. Ubuntu 20.04 and earlier are covered only through Ubuntu Pro (ESM).

Debian 11 bullseye left free long-term support on 31 August 2026. Debian LTS shipped fixes up to the 1.18.0-6.1+deb11u8 build (DLA-4660-1), but the three July 2026 advisories (CVE-2026-42533, -56434 and -60005) were not released for bullseye before the cut-off. They arrived on 26 September 2026 as 1.18.0-6.1+deb11u9 (ELA-1832-1) through Freexian's Extended LTS, a paid subscription with a private repository, so a free Debian 11 install does not get them. The October advisories are not fixed for bullseye at all yet, even in ELTS. If you run Debian 11 on the public internet, the practical answer is to move to Debian 12 or 13 rather than to chase individual backports.

Platformnginx package baseSecurity status (24 Oct 2026)
Ubuntu 22.04 jammy1.18.0-6ubuntu14.NStandard support until May 2027; two newest CVEs at needs-triage
Ubuntu 20.04 focal1.18.0-0ubuntu1.xESM only (Ubuntu Pro)
Debian 11 bullseye1.18.0-6.1+deb11uNFree LTS ended 31 August 2026; later fixes are paid ELTS only
Debian 12 bookworm1.22.1-9+deb12uNDebian LTS until 30 June 2028 (not a 1.18.0 banner)

07What a reverse proxy can and cannot do

If the 1.18.0 in question is the server that terminates requests, these are bugs in its own request processing, so a filter running inside that same nginx cannot be relied on to stop them. The fix is to update the package, or to move off an end-of-life release. A separate, patched tier in front reduces exposure and absorbs flood and scan traffic in the way any reverse proxy shields an origin, but it does not turn an unpatched origin into a safe one.

Two practical habits help more than hiding the banner. Keep the distribution's nginx package updated, since that is where the 1.18.0 backports arrive, and audit the config so you know which of these CVEs could even apply; the nginx DDoS hardening guide covers the limits and timeouts worth setting on the origin itself. A web application firewall adds defence in depth and, once the origin only accepts proxy traffic, keeps it off the open internet, which also blunts the version scanners that flagged you in the first place; combine it with keeping the real address private, as in how to hide your origin IP.

08When should I actually upgrade or rebuild?

  • Your 1.18.0 is a hand-built upstream binary: upgrade now to current stable (1.30.x) or mainline (1.31.x), because the upstream 1.18 branch is end of life and gets no fixes
  • Your config uses rewrite with captures or map with regex: patch the request-reachable overflows first (CVE-2026-42945, CVE-2026-9256, CVE-2026-42533, CVE-2026-15176)
  • You run Debian 11 on the public internet: plan a move to Debian 12 or 13, since free LTS ended on 31 August 2026 and newer nginx fixes are paid ELTS only or not yet available
  • You run Ubuntu 22.04: keep applying security updates and watch for the two pending advisories to be released
  • In every case, judge by the full package version and its changelog, not the nginx/1.18.0 banner

Questions

Frequently asked questions

It depends on the build. An updated Ubuntu 22.04 package reported as 1.18.0 carries backported security fixes and is nearly current, while a binary compiled from upstream 1.18.0 source is not, because the upstream 1.18 branch is end of life. Debian 11 sits in between since its free support ended in August 2026. Check the full package version and changelog rather than the banner.

Confirm the real patch level before acting. Run dpkg -l nginx to see the full package version, then check the changelog for the CVEs the scanner listed. Most nginx CVEs also need a specific configuration, such as a module or directive, so audit the merged config with nginx -T. Many 1.18.0 banners are already patched, and many listed CVEs do not apply to a default proxy.

No. server_tokens off only stops nginx advertising its version in the Server header and on error pages, which reduces version-scanner noise. It does not change the code that runs or patch any CVE. It is a reasonable hardening step, but the fix is to run a patched package, and the way to verify that is the package changelog, not the banner.

Debian 11 bullseye left free long-term support on 31 August 2026 before the July 2026 nginx fixes were released for it. Those arrived only in the paid Extended LTS repository, and the October fixes are not out for bullseye at all. Ubuntu 22.04 is in standard support until May 2027 and still receives updates. On an internet-facing Debian 11 server, moving to Debian 12 or 13 is the maintainable path.

The rewrite, map and alias bugs, because those directives are common and a crafted request is enough once they are present. CVE-2026-42945 and CVE-2026-9256 need rewrite with captures, CVE-2026-42533 needs map with a regex capture, and CVE-2026-15176 needs alias plus rewrite plus a $request_filename read. Most others need an upstream man-in-the-middle position, forged DNS or a module such as mp4, slice, dav or mail.

Sources

Sources and verification

The audit greps were run against nginx -T output of a scratch config (nginx 1.22.1, GNU grep 3.8), and the dpkg and changelog checks against the installed nginx 1.22.1-9+deb12u10 package, on Debian 12, October 2026. Ubuntu and Debian package versions were read from the Ubuntu, Debian and Freexian trackers on 24 October 2026.

  1. 01nginx security advisories · nginx.org
  2. 02nginx 1.18.0 changelog (released 21 April 2020) · nginx.org
  3. 03nginx server_tokens directive · nginx.org
  4. 04nginx download page (current mainline and stable versions) · nginx.org
  5. 05Debian security tracker: source package nginx · Debian
  6. 06Debian security tracker: DLA-4660-1 (nginx, bullseye 1.18.0-6.1+deb11u8) · Debian
  7. 07Freexian ELTS tracker: source package nginx · Freexian
  8. 08ELA-1832-1: nginx security update (bullseye 1.18.0-6.1+deb11u9) · Freexian
  9. 09Ubuntu CVE tracker: CVE-2026-42533 (nginx) · Ubuntu
  10. 10Ubuntu CVE tracker: CVE-2026-15176 (nginx) · Ubuntu
  11. 11Ubuntu CVE tracker: CVE-2023-44487 (nginx not affected) · Ubuntu
  12. 12NVD: CVE-2020-12440 (rejected) · NVD
  13. 13Debian long-term support schedule · Debian
  14. 14Ubuntu release lifecycle and support · Ubuntu

Last updated