This is a bad lock on a side door, not a missing front wall
tenable:172186 is a bundle check for Apache HTTP Server versions earlier than 2.4.56, primarily covering CVE-2023-25690 and CVE-2023-27522. The worst issue, CVE-2023-25690, is not 'all Apache is instantly RCE'; it is request smuggling in specific mod_proxy deployments where RewriteRule or ProxyPassMatch captures attacker-controlled URL data and reinserts it into the proxied request. CVE-2023-27522 is narrower still: it needs mod_proxy_uwsgi and a backend that emits special characters in response headers.
Tenable's CRITICAL label inherits the 9.8 CVSS from CVE-2023-25690, but that overstates enterprise-wide urgency. Real exploitation requires an internet-reachable Apache reverse proxy, the right module mix, and a vulnerable rewrite/proxy pattern; that is a meaningful friction chain. This is still a serious edge-tier issue because it can punch through proxy trust boundaries and reach protected backend paths, but it is not a drop-everything universal Apache emergency.
4 steps from start to impact.
Find an Apache reverse proxy worth testing
Burp Suite, curl, or custom recon plus public PoCs such as dhmosfunk/CVE-2023-25690-POC.- Unauthenticated remote reachability to the Apache listener
- Apache version earlier than
2.4.56 - Host is actually used as a reverse proxy, not just a standalone web server
- Banner/version alone is insufficient; exploitability depends on configuration, not just package version
- Many Apache deployments never load the affected proxy path at all
- WAF/CDN/reverse-proxy chains may normalize or block malformed requests before Apache sees them
Trigger the smuggling condition
CVE-2023-25690, the attacker sends a crafted request-target designed to abuse a non-specific RewriteRule/ProxyPassMatch that reuses user input in the proxied request. Common operator tooling is Burp HTTP Request Smuggler, raw sockets, or the public GitHub/Packet Storm PoCs. For CVE-2023-27522, the attacker instead needs a mod_proxy_uwsgi path and a backend response header that can be weaponized.mod_proxyis enabled- A vulnerable rewrite/proxy rule uses variable substitution of attacker-controlled path data, or
mod_proxy_uwsgiis enabled - Malformed request syntax survives intermediary normalization
- This is the decisive narrowing factor: the bad rewrite pattern is not default Apache behavior
mod_proxy_uwsgiis a much smaller exposure population than generic Apache- Modern WAFs and strict proxy parsers can break payload delivery
Desynchronize front end and backend
- Backend trusts the front-end proxy boundary
- There is a protected internal path, cache, or routing decision to abuse
- Connection reuse/HTTP parsing behavior supports the desync
- Impact varies wildly by app design; some sites only expose low-value paths
- No backend trust boundary means the bug degrades to noisy but limited request corruption
- Connection handling differences can make lab PoCs fail in production
Land business impact through the backend
- A valuable backend path or privileged trust decision exists behind Apache
- The smuggled request reaches that path successfully
- This is not direct code execution from the advisory itself
- Blast radius is commonly limited to the proxied application or tenant behind that virtual host
- Well-segmented admin apps and secondary auth controls still blunt impact
The supporting signals.
| Primary issue driving the score | CVE-2023-25690 (HTTP request smuggling with mod_rewrite + mod_proxy) is the worst item in the bundle and the reason Tenable pegs the plugin to 9.8/Critical. |
|---|---|
| Secondary bundled issue | CVE-2023-27522 affects mod_proxy_uwsgi only and is materially narrower than the headline CVE. |
| In-the-wild status | I found public PoC/exploit code, but no CISA KEV listing and no authoritative source here showing broad active exploitation campaigns. Treat as *weaponized research available*, not *confirmed mass exploitation*. |
| PoC availability | Public PoC exists on GitHub: dhmosfunk/CVE-2023-25690-POC; Packet Storm also hosts an exploit write-up for CVE-2023-25690. |
| EPSS | For CVE-2023-25690, Tenable shows EPSS 0.67011 and Docker Scout shows roughly 98.5th percentile; for CVE-2023-27522, Tenable shows EPSS 0.00695 and Wiz shows about 70th percentile. Translation: the bundle is dominated by the first CVE, not the second. |
| KEV status | Not found in the CISA KEV Catalog for either bundled CVE at review time. |
| CVSS vector meaning | CVE-2023-25690 carries CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, which assumes full remote reachability and no deployment friction. That is technically clean but operationally optimistic because the vulnerable rewrite pattern is optional, not default. |
| Affected versions | Apache advisory says CVE-2023-25690 affects 2.4.0 through 2.4.55; CVE-2023-27522 affects 2.4.30 through 2.4.55. |
| Fixed versions and backports | Upstream fix is 2.4.56. Distros also backported fixes: Debian 10 LTS fixed both in 2.4.38-3+deb10u10; Gentoo marks >=2.4.56 as unaffected. |
| Scanning and exposure reality | Internet-wide Apache exposure is huge, but this specific bug is not fingerprintable from a banner alone because exploitability depends on loaded modules and rewrite/proxy rules. Tenable's plugin is version-only, so expect false urgency on hosts that never use the affected proxy paths. |
| Disclosure and reporter | Apache released 2.4.56 on 2023-03-07. CVE-2023-25690 credits Lars Krapf of Adobe; CVE-2023-27522 credits Dimas Fariski Setyawan Putra (nyxsorcerer). |
noisgate verdict.
The deciding factor is the configuration prerequisite: CVE-2023-25690 is only exploitable when Apache is acting as a reverse proxy with a vulnerable rewrite/proxy pattern that reinserts attacker-controlled URL data. That sharply reduces the reachable population versus the raw 9.8 label, but the bug still sits on the internet edge and can break trust boundaries in front of sensitive backends, which keeps it firmly in HIGH.
Why this verdict
- Downgrade for configuration friction: exploitable
CVE-2023-25690needsmod_proxyplus a specific unsafeRewriteRule/ProxyPassMatchpattern. That is a major step down from 'any Apache before 2.4.56 is trivially owned.' - Not direct RCE from the advisory: the practical outcomes are request smuggling, ACL bypass, unintended backend requests, and cache poisoning. Serious, yes; universal server takeover, no.
- Population narrowing compounds:
CVE-2023-27522needsmod_proxy_uwsgi, which is a much smaller deployment slice than generic Apache. The bundle's worst-case story does not represent the average exposed host. - Still high because edge trust boundaries matter: when Apache fronts internal apps, successful smuggling can bypass the exact controls defenders rely on at the perimeter. That blast radius amplifier keeps this above MEDIUM.
- PoC and exploit tooling exist: public GitHub and Packet Storm material lower attacker cost once the right target is found, so this is not just theoretical lab-grade math.
Why not higher?
There is no evidence in the sources reviewed that this is a universally exploitable, one-request compromise across all Apache servers below 2.4.56. The vulnerability hinges on optional modules and specific proxy rewrite patterns, and the impact is usually at the HTTP trust-boundary layer rather than immediate code execution on the host.
Why not lower?
The edge exposure matters. If you *do* have Apache reverse proxies fronting privileged internal routes, request smuggling can subvert access-control assumptions and reach high-value backend functions from the public internet, and public PoCs make target validation practical for attackers.
What to do — in priority order.
- Inventory Apache reverse proxies first — Within 30 days, identify every Apache host acting as a reverse proxy or application gateway, then separate them from plain web-serving hosts. This trims noise fast and focuses mitigation where the bug can actually be reached.
- Hunt unsafe rewrite patterns — Within 30 days, review configs for
RewriteRuleorProxyPassMatchthat capture broad user input and reinsert it into proxied URLs, especially with[P]. Those patterns are the real exploit hinge forCVE-2023-25690. - Disable unused proxy modules — Within 30 days, unload
mod_proxy_*modules you do not need, especiallymod_proxy_uwsgi. If the vulnerable module path is gone, the attack path collapses before patching is complete. - Constrain backend reachability — Within 30 days, enforce that Apache front ends can only reach approved backend paths and ports. This limits the value of a smuggled internal request if one slips through.
- Add request-smuggling detection at the edge — Within 30 days, tune WAF/NGFW/IDS rules for CRLF, desync, and malformed request-target patterns associated with HTTP smuggling. This will not replace patching, but it can cut exploit reliability while remediation is underway.
- Version-only triage doesn't tell you whether the host is exploitable; Tenable itself says this plugin relies on self-reported version and does not test the issue.
- EDR alone is weak here because the abuse lives in HTTP parsing differences, not malware execution on the Apache host.
- MFA doesn't help with the initial exploit path because the attacker is abusing front-end HTTP handling before any normal authentication workflow.
- TLS termination changes don't fix parser desynchronization; HTTPS can carry the exploit just fine if the vulnerable proxy path remains.
Crowdsourced verification payload.
Run this on the target Apache host as a local admin/root-equivalent so it can read server config and invoke apachectl/httpd. Example: sudo bash ./check_apache_2456_smuggling.sh. It inspects version, loaded modules, and common config roots, then prints VULNERABLE, PATCHED, or UNKNOWN.
#!/usr/bin/env bash
# check_apache_2456_smuggling.sh
# Purpose: Assess likely exposure to Apache httpd < 2.4.56 issues covered by Tenable plugin 172186
# Exit codes: 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN
set -u
APACHECTL=""
for c in apachectl apache2ctl httpd; do
if command -v "$c" >/dev/null 2>&1; then
APACHECTL="$(command -v "$c")"
break
fi
done
if [ -z "$APACHECTL" ]; then
echo "UNKNOWN: apachectl/apache2ctl/httpd not found"
exit 2
fi
VER_OUT="$($APACHECTL -v 2>/dev/null | head -n 1)"
VER="$(echo "$VER_OUT" | sed -n 's/.*Apache\/\([0-9][0-9.]*\).*/\1/p')"
if [ -z "$VER" ]; then
echo "UNKNOWN: could not determine Apache version"
exit 2
fi
ver_lt() {
# returns 0 if $1 < $2
[ "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" != "$2" ] && return 1
[ "$1" = "$2" ] && return 1
return 0
}
if ! ver_lt "$VER" "2.4.56"; then
echo "PATCHED: Apache version $VER is >= 2.4.56"
exit 0
fi
MODS="$($APACHECTL -M 2>/dev/null || true)"
HAS_PROXY=0
HAS_REWRITE=0
HAS_UWSGI=0
echo "$MODS" | grep -Eq 'proxy_module|proxy_http_module|proxy_fcgi_module|proxy_ajp_module|proxy_wstunnel_module' && HAS_PROXY=1
echo "$MODS" | grep -Eq 'rewrite_module' && HAS_REWRITE=1
echo "$MODS" | grep -Eq 'proxy_uwsgi_module' && HAS_UWSGI=1
CONF_ROOTS="/etc/httpd /etc/apache2 /usr/local/apache2/conf"
CONF_FILES=""
for d in $CONF_ROOTS; do
if [ -d "$d" ]; then
CONF_FILES="$CONF_FILES $(find "$d" -type f \( -name '*.conf' -o -name 'httpd.conf' -o -name 'apache2.conf' \) 2>/dev/null)"
fi
done
if [ -z "$CONF_FILES" ]; then
if [ "$HAS_UWSGI" -eq 1 ]; then
echo "VULNERABLE: Apache $VER < 2.4.56 and mod_proxy_uwsgi is loaded (config files not fully inspected)"
exit 1
fi
echo "UNKNOWN: Apache $VER < 2.4.56 but no readable config files found"
exit 2
fi
# Heuristic checks for risky config patterns tied to CVE-2023-25690
RISK_REWRITE=0
RISK_PROXYPASSMATCH=0
# RewriteRule with [P] and a backreference ($1 etc.)
if grep -RIEq '^[[:space:]]*RewriteRule[[:space:]].*\$[0-9].*\[[^]]*P[^]]*\]' $CONF_FILES 2>/dev/null; then
RISK_REWRITE=1
fi
# ProxyPassMatch with backreference in target
if grep -RIEq '^[[:space:]]*ProxyPassMatch[[:space:]].*\$[0-9]' $CONF_FILES 2>/dev/null; then
RISK_PROXYPASSMATCH=1
fi
if [ "$HAS_UWSGI" -eq 1 ]; then
echo "VULNERABLE: Apache $VER < 2.4.56 and mod_proxy_uwsgi is loaded (CVE-2023-27522 path present)"
exit 1
fi
if [ "$HAS_PROXY" -eq 1 ] && [ "$HAS_REWRITE" -eq 1 ] && { [ "$RISK_REWRITE" -eq 1 ] || [ "$RISK_PROXYPASSMATCH" -eq 1 ]; }; then
echo "VULNERABLE: Apache $VER < 2.4.56 with proxy+rewrite and likely unsafe RewriteRule/ProxyPassMatch pattern"
exit 1
fi
if [ "$HAS_PROXY" -eq 1 ] || [ "$HAS_REWRITE" -eq 1 ]; then
echo "UNKNOWN: Apache $VER < 2.4.56, but no obvious exploitable proxy rewrite pattern found by heuristic scan"
exit 2
fi
echo "UNKNOWN: Apache $VER < 2.4.56, but affected modules/patterns were not confirmed"
exit 2
If you remember one thing.
httpd < 2.4.56 hit as equal. First, isolate the subset of hosts that are actually acting as Apache reverse proxies and inspect them for unsafe RewriteRule/ProxyPassMatch usage or mod_proxy_uwsgi; that compensating-control triage belongs inside the noisgate mitigation SLA for HIGH findings, so complete it within 30 days. Then patch the confirmed-exposed fleet to 2.4.56 or a distro backport inside the noisgate remediation SLA of 180 days, with internet-facing reverse proxies and anything fronting internal admin apps at the top of the queue this quarter—not plain brochureware Apache boxes that only tripped a version-only scanner check.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.