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
RewriteRule or ProxyPassMatch that capture broad user input and reinsert it into proxied URLs, especially with [P]. Those patterns are the real exploit hinge for CVE-2023-25690.mod_proxy_* modules you do not need, especially mod_proxy_uwsgi. If the vulnerable module path is gone, the attack path collapses before patching is complete.- 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.
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). |
Sources.
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.
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