← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
tenable:193421 · CWE-348 · Disclosed 2022-06-08

Apache 2

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
01 · The Real Story

This is a fake VIP badge that only works if the receptionist trusts the courier too much

The Nessus plugin maps to CVE-2022-31813 in mod_proxy. Apache HTTP Server 2.4.0 through 2.4.53 can drop X-Forwarded-* headers when a client abuses the HTTP Connection hop-by-hop mechanism, and the fix landed in 2.4.54. The bug matters when Apache is acting as a reverse proxy and the backend application makes security decisions from forwarded client-IP or host headers.

The scary part is the scanner/NVD label, not the real-world attack path. Apache itself rated this issue low, and that is closer to reality than NVD's 9.8, because exploitation is heavily configuration-dependent: you need a vulnerable Apache reverse proxy, a reachable proxied route, and a backend that incorrectly trusts missing or rewritten forwarding headers for IP-based access control. That is still worth fixing, but it is nowhere near a generic unauthenticated full-stack compromise.

"Treat this as a config-dependent proxy trust bug, not a universal internet-breaking Apache auth bypass."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Find an old Apache reverse proxy

The attacker first needs an Apache httpd instance at 2.4.53 or earlier that is actually using mod_proxy or related reverse-proxy plumbing. Tooling here is basic: version detection with Nessus 193421, banner grabs, package inventory, or manual httpd -v / apachectl -M. The plugin itself is version-based and does not prove the dangerous proxy topology exists.
Conditions required:
  • Apache HTTP Server 2.4.53 or earlier
  • mod_proxy or equivalent reverse-proxy path in use
  • Public or internal reachability to the proxy
Where this breaks in practice:
  • Lots of estates run patched distro backports on older-looking package versions
  • Many Apache hosts are not reverse proxies at all
  • Banner/version enumeration does not confirm exploitability
Detection/coverage: Excellent package/version coverage from scanners; poor coverage for the required backend trust condition. Expect false-positive pressure from version-only findings.
STEP 02

Locate a backend that trusts forwarded identity

Next the attacker needs an application behind Apache that uses X-Forwarded-For, X-Forwarded-Host, or similar for IP-based allowlists, admin gating, or localhost/proxy trust logic. Synacktiv's write-up shows how framework behavior varies here; some apps fail closed, others quietly treat the request as if it came from the proxy itself. This is where the vulnerability becomes an auth bypass instead of a harmless header quirk.
Conditions required:
  • Backend application or middleware consumes forwarded headers for access control
  • Application behavior on missing forwarded headers is insecure
  • Targeted sensitive route is exposed through the proxy
Where this breaks in practice:
  • Many modern apps use real authentication, not IP-only trust
  • Some frameworks reject or safely handle missing forwarded headers
  • Protected backend paths are often not internet-exposed
Detection/coverage: Weak automated detection. This usually requires config review, app logic review, or black-box validation with crafted requests.
STEP 03

Strip the forwarded headers in transit

The weaponized request is simple: send Connection: X-Forwarded-For and related hop-by-hop values so Apache adds forwarding headers and then removes them before the request reaches the origin. The practical tool is curl, Burp Suite Repeater, or a public PoC such as dodiorne/cve-2022-31813. This does not exploit memory corruption; it manipulates trust boundaries.
Conditions required:
  • Attacker can send arbitrary HTTP headers through Apache
  • Proxy path preserves the crafted request to the vulnerable module
Where this breaks in practice:
  • Upstream CDNs, L7 load balancers, or WAFs may normalize or drop malformed header combinations
  • Some edge stacks overwrite forwarding headers consistently before origin delivery
Detection/coverage: Possible in HTTP logs or reverse-proxy telemetry by alerting on suspicious Connection headers naming X-Forwarded-*, but default detections are uncommon.
STEP 04

Backend misidentifies the caller and grants access

If the backend equates 'missing forwarded headers' with 'request came from the trusted proxy or localhost,' the attacker can reach routes that were supposed to be IP-restricted. Impact is usually access-control bypass to specific endpoints, not host takeover. The blast radius depends entirely on what the backend protected with that trust assumption.
Conditions required:
  • Backend trust logic fails open or trusts proxy/localhost identity
  • Sensitive function exists behind that trust gate
Where this breaks in practice:
  • Impact is often limited to one application or route set
  • No direct code execution or privilege escalation primitive in Apache itself
Detection/coverage: App access logs may show impossible source-IP transitions, proxy-IP attribution, or successful access to admin-only paths without normal auth events.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo authoritative evidence of widespread exploitation found; Wiz shows Has CISA KEV Exploit: No for this CVE.
PoC availabilityPublic testing code exists, including dodiorne/cve-2022-31813 on GitHub; Synacktiv also published the exploitation mechanics and preconditions.
EPSSCurrent public aggregators show this CVE as low-likelihood: Tenable EPSS 0.00041 and Wiz EPSS percentile 12.1.
KEV statusNot listed in CISA KEV in the sources reviewed; Wiz reports CISA KEV Release Date: N/A.
CVSS reality checkNVD: 9.8 / AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H badly overstates reality because the actual path requires a vulnerable reverse-proxy deployment *and* unsafe backend trust logic.
Vendor viewApache's own advisory rates CVE-2022-31813 as low, which better reflects the configuration dependency.
Affected versionsApache HTTP Server 2.4 through 2.4.53 are affected per the CVE record and Apache advisory; Synacktiv notes the underlying behavior dates back much further in mod_proxy history.
Fixed versionsUpstream fix is 2.4.54. Distro backports exist, e.g. Ubuntu 22.04 LTS fixed in 2.4.52-1ubuntu4.1 and Debian bullseye fixed in 2.4.54-1~deb11u1.
Scanner/exposure caveatInternet-wide search can find Apache, but not the backend trust mistake that makes this exploitable. Exposure is therefore not fingerprintable reliably from Shodan/Censys alone; version-only counts overstate risk.
Disclosure and creditPublicly disclosed 2022-06-08/2022-06-09 and credited to Gaetan Ferry (Synacktiv).
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.8/10)

The decisive factor is that this bug only turns into a meaningful auth bypass when a backend application improperly trusts proxy-derived identity. That narrows the exposed population hard: many Apache hosts are unaffected in practice, and even vulnerable reverse proxies often do not front routes protected solely by forwarded-header IP logic.

HIGH Affected version and fix mapping
MEDIUM Real-world exploitability without application-specific validation
HIGH Downgrade from NVD/Tenable-style criticality

Why this verdict

  • Config chain required: vulnerable Apache alone is not enough; you also need reverse proxying and a backend that trusts X-Forwarded-* for access control.
  • Attacker position is narrower than CVSS implies: this is network-reachable, but only against the subset of hosts fronting the right kind of backend workflow.
  • Blast radius is usually route-level, not host-level: the common outcome is access to IP-gated pages or APIs, not shell on the proxy.
  • Population is overstated by scanners: Nessus 193421 is a version check and does not validate mod_proxy usage, proxy rules, or backend trust behavior.
  • Threat intel is quiet: no KEV listing and low EPSS are both downward pressure on urgency.

Why not higher?

There is no generic unauthenticated RCE, no memory corruption, and no evidence of broad active exploitation. Most importantly, the vulnerability depends on a second design flaw in the backend trust model, so the reachable victim pool is far smaller than 'all Apache 2.4.53 and earlier' suggests.

Why not lower?

When the preconditions line up, this is still a real access-control bypass on internet-facing infrastructure. Enterprises do have legacy admin panels, API gates, and localhost/proxy allowlists behind Apache, so dismissing it as pure hygiene would miss the subset where the impact is serious.

05 · Compensating Control

What to do — in priority order.

  1. Audit reverse-proxy trust paths — Identify Apache hosts that proxy to apps making auth or ACL decisions from X-Forwarded-*, REMOTE_ADDR, or 'trusted proxy/localhost' assumptions. For a MEDIUM verdict there is no mitigation SLA — go straight to the 365-day remediation window, but this review should happen in the next normal change cycle so you can separate noisy version hits from real risk.
  2. Enforce auth at the application layer — Replace IP-only backend protections with real authentication and authorization where possible. This removes the trust amplifier that makes the bug matter and is the most durable compensating control while you work through the patch within the 365-day remediation window.
  3. Normalize or drop suspicious hop-by-hop headers at the edge — Strip or reject client-supplied Connection values that name X-Forwarded-* headers on upstream load balancers, CDNs, or WAFs. This is a solid temporary guardrail for exposed reverse proxies even though there is no noisgate mitigation SLA for a MEDIUM finding.
  4. Log and alert on header abuse — Add detections for requests where Connection references X-Forwarded-For, X-Forwarded-Host, or X-Forwarded-Proto. This will not fix the bug, but it gives you high-signal hunting coverage for attempted exploitation while remediation proceeds.
What doesn't work
  • A WAF signature alone is not enough, because the dangerous condition is the backend's trust decision; signatures help, but edge normalization and app-side auth matter more.
  • Hiding the Apache version/banner does nothing; the exploit is behavioral, not banner-driven.
  • Relying on backend IP allowlists alone is exactly the design assumption this flaw can undermine when requests arrive through a vulnerable proxy.
06 · Verification

Crowdsourced verification payload.

Run this on the target Apache host with local shell access. Invoke it as sudo bash check_cve_2022_31813.sh /etc/httpd /etc/apache2; it needs privileges only to read Apache configs and execute apachectl/httpd module listing.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check_cve_2022_31813.sh
# Purpose: Assess likely exposure to CVE-2022-31813 on an Apache host.
# Output: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

set -u

CONFIG_HINTS=("$@")
if [ ${#CONFIG_HINTS[@]} -eq 0 ]; then
  CONFIG_HINTS=(/etc/httpd /etc/apache2 /usr/local/apache2/conf)
fi

APACHECTL=""
for c in apachectl apache2ctl; do
  if command -v "$c" >/dev/null 2>&1; then
    APACHECTL="$(command -v "$c")"
    break
  fi
done

HTTPD_BIN=""
for b in httpd apache2; do
  if command -v "$b" >/dev/null 2>&1; then
    HTTPD_BIN="$(command -v "$b")"
    break
  fi
done

if [ -z "$APACHECTL" ] && [ -z "$HTTPD_BIN" ]; then
  echo "UNKNOWN - Apache control binary not found"
  exit 2
fi

get_version() {
  local out=""
  if [ -n "$HTTPD_BIN" ]; then
    out="$($HTTPD_BIN -v 2>/dev/null || true)"
  fi
  if [ -z "$out" ] && [ -n "$APACHECTL" ]; then
    out="$($APACHECTL -v 2>/dev/null || true)"
  fi
  echo "$out" | sed -n 's/^Server version: .*\/\([0-9][0-9.]*\).*/\1/p' | head -n1
}

ver_lt() {
  # returns 0 if $1 < $2
  [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" != "$2" ] && return 1
  [ "$1" = "$2" ] && return 1
  return 0
}

VERSION="$(get_version)"
if [ -z "$VERSION" ]; then
  echo "UNKNOWN - Unable to determine Apache version"
  exit 2
fi

# Upstream fixed in 2.4.54, but distro backports may patch older-looking versions.
# If the package version is >= 2.4.54, treat as patched.
if ! ver_lt "$VERSION" "2.4.54"; then
  echo "PATCHED - Apache version $VERSION is >= 2.4.54"
  exit 0
fi

MODULES=""
if [ -n "$APACHECTL" ]; then
  MODULES="$($APACHECTL -M 2>/dev/null || true)"
fi
if [ -z "$MODULES" ] && [ -n "$HTTPD_BIN" ]; then
  MODULES="$($HTTPD_BIN -M 2>/dev/null || true)"
fi

if [ -z "$MODULES" ]; then
  echo "UNKNOWN - Apache version $VERSION is old, but loaded modules could not be inspected"
  exit 2
fi

if ! echo "$MODULES" | grep -Eqi 'proxy(_http|_fcgi|_ajp|_wstunnel)?_module|proxy_module'; then
  echo "UNKNOWN - Apache version $VERSION is old, but mod_proxy does not appear to be loaded"
  exit 2
fi

CONFIG_FILES=()
for p in "${CONFIG_HINTS[@]}"; do
  if [ -d "$p" ]; then
    while IFS= read -r -d '' f; do
      CONFIG_FILES+=("$f")
    done < <(find "$p" -type f \( -name '*.conf' -o -name 'httpd.conf' -o -name 'apache2.conf' -o -name '*.load' \) -print0 2>/dev/null)
  elif [ -f "$p" ]; then
    CONFIG_FILES+=("$p")
  fi
done

if [ ${#CONFIG_FILES[@]} -eq 0 ]; then
  echo "UNKNOWN - Apache version $VERSION is old and mod_proxy is loaded, but no configs were found"
  exit 2
fi

if grep -EHiq '(^|[^#])(ProxyPass|ProxyPassMatch|RewriteRule.+\[P\]|SetHandler\s+"?proxy:|BalancerMember)' "${CONFIG_FILES[@]}" 2>/dev/null; then
  echo "VULNERABLE - Apache version $VERSION is < 2.4.54, mod_proxy is loaded, and reverse-proxy directives were found"
  exit 1
fi

echo "UNKNOWN - Apache version $VERSION is old and mod_proxy is loaded, but no reverse-proxy directives were found"
exit 2
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning, do not mass-escalate every Nessus 193421 hit to emergency patching. First, split the population into true Apache reverse proxies versus plain web servers, then manually validate which reverse proxies front apps that enforce IP-based trust from X-Forwarded-* or proxy/localhost identity; those are your real risk cases. Because this is a MEDIUM reassessment and there is no noisgate mitigation SLA — go straight to the 365-day remediation window, your immediate action is targeted validation and edge/header hardening in the normal change cycle, followed by patching confirmed affected reverse proxies to 2.4.54+ or a distro backport within the noisgate remediation SLA of 365 days.

Sources

  1. Tenable plugin 193421
  2. Apache HTTP Server 2.4 vulnerabilities advisory
  3. NVD CVE-2022-31813
  4. CVE.org record
  5. Synacktiv technical write-up
  6. Ubuntu security tracker
  7. Debian security tracker
  8. Wiz vulnerability database entry
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.