This is a crossed phone line, not a house fire
The plugin title is misleading. tenable:159464 keys off CVE-2021-43980, which is an Apache Tomcat information disclosure race condition, not the actual Spring4Shell RCE (CVE-2022-22965). Apache lists affected Tomcat 9 versions as 9.0.0-M1 through 9.0.60, fixed in the 9.0.61 code line and shipped to users in 9.0.62; Debian and distro builds may be fixed through backports even when the package version string is older.
Apache labeled the Tomcat issue High because cross-client response leakage can expose one user's data to another. In practice, Tenable's Low call is closer to operational reality for enterprise patch triage: exploitation is described by Apache as extremely hard to trigger, impact is confidentiality-only, and there is no credible evidence that CVE-2021-43980 became an internet-scale exploit path. The dangerous thing here is mostly the title collision with Spring4Shell, which can trick teams into over-prioritizing the wrong CVE.
3 steps from start to impact.
Reach a vulnerable Tomcat listener
curl, wrk, ab, or a custom async race harness are enough to hammer request concurrency.- Tomcat 9 in the affected range is reachable over the network
- The service is handling live traffic or enough attacker-generated traffic to create concurrency pressure
- The scanner result is a real Tomcat version match, not a backported distro package
- Many enterprise Tomcat instances sit behind reverse proxies, load balancers, WAFs, or internal-only app tiers
- Banner/version detection can overstate exposure when a distro backport fixed the issue without changing the major Tomcat train
Win a narrow race in Http11Processor reuse
Http11Processor instance. Apache explicitly describes this as a long-standing bug that is extremely hard to trigger, which is the single biggest downward pressure on severity.- Specific timing under concurrency
- Affected Tomcat code path is actually in use
- Sustained request pressure without upstream controls damping the pattern
- This is not a deterministic one-request exploit
- Modern reverse proxies, request buffering, connection pooling, and uneven enterprise traffic patterns make reproducibility worse for attackers
Capture misdelivered response fragments
- Useful victim traffic is present at the same time
- The leaked response contains sensitive data the attacker can recognize and retain
- Leakage may be partial, inconsistent, and low-value
- Blast radius is bounded by concurrent session mix-up rather than host compromise
The supporting signals.
| What this plugin is really about | tenable:159464 references CVE-2021-43980. That is a Tomcat race-condition information disclosure bug, while real Spring4Shell is CVE-2022-22965. |
|---|---|
| In-the-wild status | No authoritative evidence found that CVE-2021-43980 is in CISA KEV or widely exploited in the wild. By contrast, CVE-2022-22965 *is* in the CISA KEV catalog. |
| Proof-of-concept availability | Tenable states no known exploits are available for CVE-2021-43980. I could not validate a credible, commonly used public exploit chain for this race condition. |
| EPSS | Tenable's CVE page currently shows EPSS 0.00087, which is consistent with a low-likelihood exploit signal. Treat that as supporting context, not the main reason for the verdict. |
| CVSS and what it means | NVD/CISA-ADP now show CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N — network reachable, but high attack complexity and confidentiality-only impact. |
| Affected Tomcat 9 range | Apache lists 9.0.0-M1 through 9.0.60 as affected. The bug became visible after blocking I/O changes were backported, and the fix shipped to users in 9.0.62 after the 9.0.61 release candidate did not ship. |
| Fixed versions | For vanilla upstream Tomcat 9, move to 9.0.62+. For distros, trust the backport advisory instead of the upstream-looking version string; Debian fixed buster in 9.0.31-1~deb10u7 and bullseye in 9.0.43-2~deb11u4. |
| Exposure and scanning reality | Internet scanning can find Tomcat banners, but it cannot prove this bug is practically exploitable. The plugin is fundamentally version-based and does not verify the runtime race condition. |
| Disclosure timeline | Apache fixed the issue in the April 1, 2022 Tomcat 9 security release, while the CVE record was published on 2022-09-28. |
| Reporting credit | Apache credits Adam Thomas, Richard Hernandez, and Ryan Schmitt for reporting the issue. |
noisgate verdict.
The decisive factor is attack reliability: this is a network bug that Apache itself describes as extremely hard to trigger, and the payoff is data crossover rather than host takeover. In a 10,000-host estate, that makes it a real defect worth fixing, but not a front-of-queue emergency unless a sensitive public app is both exposed and confirmed vulnerable.
Why this verdict
- Not Spring4Shell: the title reuses the
9.0.62fix milestone that also appeared in Spring4Shell guidance, but the CVE here is a different bug with much lower operational risk - High-complexity race: the core exploit prerequisite is precise concurrency timing, which compounds downward pressure on severity even before you ask whether the service is exposed
- Confidentiality-only blast radius: successful exploitation leaks responses between clients; it does not directly yield code execution, persistence, or domain-wide lateral movement
- No strong exploitation evidence: no KEV entry or credible mainstream exploit use was found for
CVE-2021-43980, unlike the actual Spring4Shell ecosystem panic and KEV listing aroundCVE-2022-22965 - Exposure is narrower in real estates: many Tomcat servers are internal, reverse-proxied, or distro-backported, which further shrinks the reachable population
Why not higher?
If this were the actual Spring4Shell RCE path, or if there were reliable public exploitation and host-compromise outcomes, this would move up fast. But CVE-2021-43980 is a hard-to-hit race with confidentiality-only impact, so the classic internet-facing-RCE logic does not apply.
Why not lower?
This is still a remotely reachable server-side flaw that can cross session boundaries and leak one user's data to another, which matters for customer-facing or regulated apps. If you know you run affected upstream Tomcat on exposed systems, it deserves cleanup rather than a pure ignore decision.
What to do — in priority order.
- Validate the finding against package provenance — Check whether the Tomcat instance is an upstream install or a distro package with backported fixes. Do this during normal triage because LOW has no SLA; a backported Debian/Ubuntu package can be fixed even when the visible Tomcat train looks older.
- Prioritize internet-facing multi-user Tomcat first — If you do patch this issue, start with public applications where concurrent user traffic could make cross-client response leakage meaningful. For a LOW verdict there is no mitigation SLA and no remediation SLA beyond backlog hygiene, so fold it into the next normal Tomcat maintenance cycle unless business sensitivity justifies acceleration.
- Review for reverse-proxy containment — Confirm exposed Tomcat nodes are behind your standard reverse proxy, LB, and TLS edge controls. This does not fix the bug, but it reduces raw direct reachability and should be maintained as part of standard platform hygiene with no specific LOW-deadline SLA.
- Watch for session-mix anomalies — Ask app owners whether they have seen users receiving the wrong page, partial response, or another user's session content. That operational check is cheap and useful because successful exploitation would look like application weirdness, not malware execution.
- A WAF signature does not solve this well because there is no stable exploit payload to pattern-match; the problem is timing and connection handling.
- MFA is irrelevant here because the issue is not account takeover or authentication bypass.
- EDR will not prevent the core failure mode because there is no code execution stage to intercept.
Crowdsourced verification payload.
Run this on the target Tomcat host as the Tomcat service account or any user who can read the installation directory. Invoke it as bash check_tomcat_cve_2021_43980.sh /opt/tomcat or let it autodetect common locations; root is not required unless the install path is locked down.
#!/usr/bin/env bash
# check_tomcat_cve_2021_43980.sh
# Detect likely exposure to CVE-2021-43980 on Apache Tomcat 9.
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
TARGET_DIR="${1:-}"
VERSION=""
SOURCE=""
find_version() {
local base="$1"
if [ -f "$base/bin/catalina.sh" ]; then
VERSION=$("$base/bin/catalina.sh" version 2>/dev/null | awk -F': ' '/Server number/ {print $2; exit}')
if [ -n "$VERSION" ]; then
SOURCE="$base/bin/catalina.sh"
return 0
fi
fi
if [ -f "$base/lib/catalina.jar" ] && command -v unzip >/dev/null 2>&1; then
VERSION=$(unzip -p "$base/lib/catalina.jar" org/apache/catalina/util/ServerInfo.properties 2>/dev/null | awk -F'=' '/server.number/ {print $2; exit}')
if [ -n "$VERSION" ]; then
SOURCE="$base/lib/catalina.jar"
return 0
fi
fi
return 1
}
try_pkg_mgr() {
if command -v dpkg-query >/dev/null 2>&1; then
local pkgv
pkgv=$(dpkg-query -W -f='${Version}\n' tomcat9 2>/dev/null || true)
if [ -n "$pkgv" ]; then
echo "UNKNOWN: Debian/Ubuntu package tomcat9 version $pkgv detected. Distro backports may already include the fix; verify against vendor advisory."
exit 2
fi
fi
if command -v rpm >/dev/null 2>&1; then
local pkgv
pkgv=$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' tomcat tomcat9 2>/dev/null | head -n1 || true)
if [ -n "$pkgv" ] && [ "$pkgv" != "package tomcat is not installed" ]; then
echo "UNKNOWN: RPM Tomcat package $pkgv detected. Vendor backports may already include the fix; verify against your distro advisory."
exit 2
fi
fi
}
check_upstream_9x() {
local ver="$1"
# Accept forms like 9.0.60 or 9.0.62-SNAPSHOT
local clean major minor patch
clean=$(echo "$ver" | sed 's/[^0-9.].*$//')
IFS='.' read -r major minor patch <<< "$clean"
if [ -z "${major:-}" ] || [ -z "${minor:-}" ] || [ -z "${patch:-}" ]; then
echo "UNKNOWN: Could not parse Tomcat version '$ver'"
exit 2
fi
if [ "$major" -ne 9 ]; then
echo "UNKNOWN: This check is for Tomcat 9; detected version '$ver'"
exit 2
fi
if [ "$minor" -ne 0 ]; then
echo "UNKNOWN: Unexpected Tomcat 9 version format '$ver'"
exit 2
fi
if [ "$patch" -le 60 ]; then
echo "VULNERABLE: Upstream Tomcat $ver is in the affected 9.0.0-M1 to 9.0.60 range for CVE-2021-43980"
exit 1
fi
if [ "$patch" -ge 62 ]; then
echo "PATCHED: Upstream Tomcat $ver is at or above 9.0.62"
exit 0
fi
if [ "$patch" -eq 61 ]; then
echo "UNKNOWN: 9.0.61 was a non-shipping release candidate line; verify build provenance manually"
exit 2
fi
echo "UNKNOWN: Unhandled version case '$ver'"
exit 2
}
if [ -n "$TARGET_DIR" ]; then
if find_version "$TARGET_DIR"; then
echo "Detected version $VERSION from $SOURCE"
check_upstream_9x "$VERSION"
else
echo "UNKNOWN: Could not determine Tomcat version from $TARGET_DIR"
exit 2
fi
fi
for d in /opt/tomcat /usr/share/tomcat /usr/share/tomcat9 /usr/local/tomcat /var/lib/tomcat9; do
if [ -d "$d" ] && find_version "$d"; then
echo "Detected version $VERSION from $SOURCE"
check_upstream_9x "$VERSION"
fi
done
try_pkg_mgr
echo "UNKNOWN: No Tomcat installation found or version could not be determined"
exit 2
If you remember one thing.
Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.