Vulnerabilities
9 min readUpdatednginx 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.
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.
# 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.
| CVE | Needs (precondition) | Upstream fixed | Ubuntu 22.04 | Debian 11 |
|---|---|---|---|---|
| CVE-2026-15176 | alias + rewrite + $request_filename in set, return or log_format | 1.31.7 / 1.30.6 | Pending (needs-triage) | Unfixed, also in ELTS |
| CVE-2026-97205 | aio enabled + SSI include virtual | 1.31.7 / 1.30.6 | Pending (needs-triage) | Unfixed, also in ELTS |
| CVE-2026-42533 | map with regex capture read before output, or volatile map | 1.31.3 / 1.30.4 | 1.18.0-6ubuntu14.21 | ELTS only: 1.18.0-6.1+deb11u9 |
| CVE-2026-60005 | slice module (non-default) + unnamed captures, or background cache update | 1.31.3 / 1.30.4 | 1.18.0-6ubuntu14.17 | ELTS only: 1.18.0-6.1+deb11u9 |
| CVE-2026-56434 | SSI + proxy_pass + proxy_buffering off + MITM upstream | 1.31.3 / 1.30.4 | 1.18.0-6ubuntu14.17 | ELTS only: 1.18.0-6.1+deb11u9 |
| CVE-2026-42055 | grpc_pass + ignore_invalid_headers off + header buffers over 2 MB | 1.31.2 / 1.30.3 | 1.18.0-6ubuntu14.16 | 1.18.0-6.1+deb11u8 |
| CVE-2026-48142 | charset + source_charset utf-8 in one location | 1.31.2 / 1.30.3 | 1.18.0-6ubuntu14.16 | 1.18.0-6.1+deb11u8 |
| CVE-2026-9256 | rewrite with overlapping captures ($1$2) in a redirect or arguments | 1.31.1 / 1.30.2 | 1.18.0-6ubuntu14.12 | 1.18.0-6.1+deb11u7 |
| CVE-2026-42945 | rewrite with ? in the replacement, then rewrite, if or set with $1 (NGINX Rift) | 1.31.0 / 1.30.1 | 1.18.0-6ubuntu14.11 | 1.18.0-6.1+deb11u6 |
| CVE-2026-42946 | scgi_pass or uwsgi_pass + MITM upstream | 1.31.0 / 1.30.1 | 1.18.0-6ubuntu14.12 | 1.18.0-6.1+deb11u6 |
| CVE-2026-42934 | charset + source_charset + charset_map + proxy_pass with buffering off | 1.31.0 / 1.30.1 | 1.18.0-6ubuntu14.12 | 1.18.0-6.1+deb11u6 |
| CVE-2026-27654 | WebDAV MOVE/COPY + prefix location + alias | 1.29.7 / 1.28.3 | 1.18.0-6ubuntu14.10 | 1.18.0-6.1+deb11u6 |
| CVE-2026-32647, CVE-2026-27784 | mp4 module + mp4 directive (crafted MP4); 27784 hits 32-bit builds only | 1.29.7 / 1.28.3 | 1.18.0-6ubuntu14.10 | 1.18.0-6.1+deb11u6 |
| CVE-2026-28753 | mail proxy (SMTP) + attacker-controlled DNS responses | 1.29.7 / 1.28.3 | 1.18.0-6ubuntu14.10 | 1.18.0-6.1+deb11u6 |
| CVE-2026-27651 | mail auth_http + CRAM-MD5 or APOP + Auth-Wait retry | 1.29.7 / 1.28.3 | 1.18.0-6ubuntu14.10 | 1.18.0-6.1+deb11u6 |
| CVE-2026-1642 | proxy to upstream TLS + MITM upstream | 1.29.5 / 1.28.2 | 1.18.0-6ubuntu14.8 | 1.18.0-6.1+deb11u6 |
| CVE-2025-53859 | mail SMTP + smtp_auth none + Auth-Wait from the auth server | 1.29.1 | 1.18.0-6ubuntu14.7 | 1.18.0-6.1+deb11u6 |
| CVE-2025-23419 | shared server blocks + client-cert auth + TLS resumption | 1.27.4 / 1.26.3 | 1.18.0-6ubuntu14.6 | 1.18.0-6.1+deb11u4 |
| CVE-2024-7347 | mp4 module + mp4 directive (crafted MP4) | 1.27.1 / 1.26.2 | 1.18.0-6ubuntu14.5 | 1.18.0-6.1+deb11u4 |
| CVE-2022-41741/41742 | mp4 module + mp4 directive (crafted MP4) | 1.23.2 / 1.22.1 | 1.18.0-6ubuntu14.3 | 1.18.0-6.1+deb11u3 |
| CVE-2021-23017 | resolver directive + forgeable DNS responses | 1.21.0 / 1.20.1 | 1.18.0-6ubuntu9 | 1.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.
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.conf06Debian 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.
| Platform | nginx package base | Security status (24 Oct 2026) |
|---|---|---|
| Ubuntu 22.04 jammy | 1.18.0-6ubuntu14.N | Standard support until May 2027; two newest CVEs at needs-triage |
| Ubuntu 20.04 focal | 1.18.0-0ubuntu1.x | ESM only (Ubuntu Pro) |
| Debian 11 bullseye | 1.18.0-6.1+deb11uN | Free LTS ended 31 August 2026; later fixes are paid ELTS only |
| Debian 12 bookworm | 1.22.1-9+deb12uN | Debian 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
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.
- 01nginx security advisories · nginx.org
- 02nginx 1.18.0 changelog (released 21 April 2020) · nginx.org
- 03nginx server_tokens directive · nginx.org
- 04nginx download page (current mainline and stable versions) · nginx.org
- 05Debian security tracker: source package nginx · Debian
- 06Debian security tracker: DLA-4660-1 (nginx, bullseye 1.18.0-6.1+deb11u8) · Debian
- 07Freexian ELTS tracker: source package nginx · Freexian
- 08ELA-1832-1: nginx security update (bullseye 1.18.0-6.1+deb11u9) · Freexian
- 09Ubuntu CVE tracker: CVE-2026-42533 (nginx) · Ubuntu
- 10Ubuntu CVE tracker: CVE-2026-15176 (nginx) · Ubuntu
- 11Ubuntu CVE tracker: CVE-2023-44487 (nginx not affected) · Ubuntu
- 12NVD: CVE-2020-12440 (rejected) · NVD
- 13Debian long-term support schedule · Debian
- 14Ubuntu release lifecycle and support · Ubuntu
Last updated