← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
tenable:171351 · Disclosed 2020-03-02

Apache Tomcat SEoL

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

This is an old lock on an important door, not a burglar already inside

Tenable plugin 171351 fires when it detects Apache Tomcat 7.0.x on a host. That entire branch reached end of life on 2021-03-31, with 7.0.109 as the final release, so every 7.0.x build is now permanently outside normal security maintenance. The plugin is not tied to one CVE; it is flagging that future Tomcat flaws in the 7.x line will not receive vendor fixes and that older 7.x deployments often lag behind years of prior security fixes.

Tenable's CRITICAL / 10.0 label is too aggressive for patch-priority decisions because unsupported status is not itself a remotely exploitable vulnerability. Real-world impact depends on extra conditions: the host has to be reachable, the specific Tomcat instance has to expose an exploitable surface like Manager or AJP, or it has to still be on a pre-7.0.100 build vulnerable to something like Ghostcat. For a 10,000-host estate, this is better treated as material attack-surface debt that deserves migration planning and exposure triage, not as an immediate all-hands critical unless the Tomcat 7 instances are internet-facing.

"Tomcat 7 being unsupported is real risk, but this plugin is tech-debt exposure, not a proven one-click critical exploit."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Fingerprint the Tomcat 7 target

An attacker first needs to identify that the application server is Tomcat and ideally that it is still on the unsupported 7.x branch. Common tooling is Nmap http-title/http-headers, Shodan/Censys-style banner collection, or direct probes for /manager/html, /docs/, error pages, and Server: headers. The Tenable plugin itself only proves version lineage, not exploitability.
Conditions required:
  • The Tomcat service or a reverse-proxied application is reachable from the attacker position
  • Version clues are exposed via banners, error pages, Manager pages, or package inventory
Where this breaks in practice:
  • Reverse proxies often hide Tomcat banners
  • Many enterprises block direct access to Manager, AJP, and documentation apps
  • Internal-only app servers are invisible to unauthenticated internet attackers
Detection/coverage: Version discovery is easy for authenticated scanners like Nessus with local/package visibility; remote-only detection is much less reliable when proxies or custom headers hide Tomcat.
STEP 02

Map a usable exploit path

Unsupported status becomes operationally dangerous only when the attacker can pair it with a concrete weakness: a vulnerable sub-version, an exposed management interface, weak credentials, or an enabled AJP connector. Representative tooling includes hydra for Tomcat Manager password attacks and Metasploit auxiliary/admin/http/tomcat_ghostcat for CVE-2020-1938-style AJP abuse on older 7.x releases.
Conditions required:
  • The instance is not just Tomcat 7, but configured with a reachable attack surface such as Manager or AJP
  • If using a historical CVE, the host is on an actually affected 7.x build or vulnerable configuration
Where this breaks in practice:
  • Tomcat 7.0.100+ addressed Ghostcat defaults, so not all 7.x hosts still have that path
  • Manager access is often IP-restricted or disabled
  • AJP is frequently disabled or firewalled in modern deployments
Detection/coverage: Vuln scanners can catch many known Tomcat CVEs when versioning is visible, but they cannot infer every hardening control or every reverse-proxy rule.
STEP 03

Exploit the exposed feature, not the SEoL state

The attacker then abuses the specific surface they found: brute-forces Tomcat Manager, leverages an older known flaw, or uses file-read / include behavior to steal credentials and application secrets. This is where unsupported software matters: when the next Tomcat bug lands, 7.x will not get a vendor fix, so the environment stays vulnerable until the application is migrated.
Conditions required:
  • A reachable and exploitable feature exists
  • Credential hygiene, network controls, and EDR/WAF do not interrupt the chain
Where this breaks in practice:
  • Many Tomcat deployments sit behind SSO, VPN, WAF, or internal load balancers
  • Application-specific constraints often limit post-exploitation usefulness
  • Exploitability varies heavily by minor version and connector configuration
Detection/coverage: WAFs, reverse-proxy logs, Tomcat access logs, auth-failure telemetry, and EDR can all surface the follow-on exploit even though they do not 'fix' unsupported status.
STEP 04

Turn app compromise into broader access

If the attacker succeeds, impact is typically application-server level: webshell deployment, credential theft, source disclosure, or lateral movement using app secrets. The blast radius can be high for a business-critical Java app, but it is not guaranteed by the plugin alone; it depends on what that Tomcat instance actually hosts and how privileged the service account is.
Conditions required:
  • The compromised Tomcat process has access to sensitive apps, credentials, or adjacent services
  • Segmentation and secret management are weak enough to allow pivoting
Where this breaks in practice:
  • Least-privilege service accounts can contain the blast radius
  • Containerized or immutable deployments limit persistence options
  • Secrets stored outside the app server reduce follow-on value
Detection/coverage: Post-exploitation is usually visible to EDR, file-integrity monitoring, unusual child-process alerts, and outbound connection monitoring.
03 · Intelligence Metadata

The supporting signals.

What Tenable actually detectedPlugin 171351 is a Security End of Life finding, not a single-CVE exploit check. Tenable assigns its standard unsupported-software CVSS 10.0 label to all affected Tomcat 7.0.x installs.
In-the-wild statusNo evidence that plugin 171351 itself is an actively exploited issue because it is not a CVE. The real risk is that Tomcat is a routinely targeted platform and unsupported 7.x will miss any new fixes.
Proof-of-concept availabilityPublic PoCs exist for multiple Tomcat 7-era flaws, especially CVE-2020-1938 (*Ghostcat*). Metasploit includes auxiliary/admin/http/tomcat_ghostcat, and public GitHub PoCs were widely published after disclosure.
EPSSN/A for the SEoL plugin itself because EPSS is CVE-based. For context, Tenable currently shows CVE-2020-1938 with EPSS 0.94469, indicating historically strong exploitation interest in Tomcat 7-era issues.
KEV statusPlugin 171351 is not a KEV entry. But Tomcat 7 overlaps with KEV-listed flaws such as CVE-2020-1938, which CISA catalogs as known exploited.
CVSS vector meaningTenable uses CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H, which models a worst-case unauthenticated RCE. That does not describe the SEoL condition itself; it is a vendor scoring convention for unsupported software.
Affected versionsAll Apache Tomcat 7.0.x releases, including the final 7.0.109, are affected by the unsupported-status finding after 2021-03-31.
Fixed versionThere is no supported patched 7.0.x branch. The remedy is migration to a supported Tomcat line such as 8.5.x, 9.0.x, 10.1.x, or newer, subject to application compatibility.
Scanning / exposure dataGreyNoise reported a coordinated June 2025 campaign against internet-exposed Tomcat Manager interfaces involving roughly 400 unique IPs, showing that exposed Tomcat admin surfaces are actively hunted even when the attack is not tied to this plugin.
Timeline / reporterApache announced Tomcat 7 EOL on 2020-03-02, with support ending 2021-03-31. Tenable published plugin 171351 on 2023-02-10.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.6/10)

The decisive downgrade factor is that unsupported status is not a weaponized exploit path by itself; attackers still need another reachable weakness such as exposed Manager, exposed AJP, weak credentials, or a specific vulnerable sub-version. That sharply reduces urgency compared with true unauthenticated RCEs, even though Tomcat is common enough that unsupported instances should not be ignored.

HIGH Tenable's CRITICAL rating overstates the immediate exploitability of this SEoL plugin
MEDIUM Internet-facing Tomcat 7 instances materially raise real-world risk beyond the baseline MEDIUM call

Why this verdict

  • Down from vendor 10.0: Tenable is scoring a *state* (unsupported software), not proving an exploit primitive. There is no single unauthenticated remote action that turns 171351 into compromise on its own.
  • Attacker position matters: If Tomcat 7 is internal-only, the prerequisite already implies post-initial-access. Requiring internal network reachability is major downward pressure on severity.
  • Reachable population narrows fast: Real exploitation usually also needs exposed Manager, exposed AJP, or a specific lagging sub-version. Each prerequisite cuts the fraction of real enterprise deployments that are actually one request away from impact.
  • Modern controls should intercept the chain: NGFW segmentation, WAF/reverse proxies, VPN requirements, IP allowlists on Manager, MFA/SSO in front of admin surfaces, and EDR on the host all raise attacker cost substantially.
  • But not LOW: Tomcat is widely deployed on business-critical apps, and unsupported middleware accumulates silent risk. When the next Tomcat flaw drops, 7.x owners have no vendor patch path.

Why not higher?

To justify HIGH or CRITICAL, I would want direct evidence of active exploitation against this exact issue, or proof that the plugin maps to an unauthenticated exploit with broad default reachability. We do not have that here. 171351 is essentially an attack-surface debt finding that still depends on follow-on conditions.

Why not lower?

I would not drop this to LOW because unsupported Java middleware on production application servers is not harmless backlog dust. Tomcat 7 is old enough that orgs often carry inherited weak configs, and exposed Tomcat admin surfaces continue to attract scanning and brute-force activity. Even without a single active CVE, the residual risk is real.

05 · Compensating Control

What to do — in priority order.

  1. Inventory every Tomcat 7 instance — Find the exact hosts, apps, owners, and exposure paths first, because the risk swings massively between internal middleware and internet-facing portals. For a MEDIUM verdict there is no mitigation SLA; do this as part of normal vulnerability operations while planning remediation inside the 365-day window.
  2. Remove internet exposure — Put Tomcat 7 behind reverse proxies, VPN, or internal load balancers wherever business permits. This is the highest-value compensating control because it removes the unauthenticated remote path; for MEDIUM, there is no mitigation SLA — go straight to the 365-day remediation window, but exposed systems should be prioritized early.
  3. Disable or restrict Tomcat Manager and AJP — If manager, host-manager, or AJP are not strictly required, turn them off; if they are required, IP-allowlist them and require strong authentication. This shrinks the real exploit surface that makes old Tomcat builds dangerous while you work toward migration.
  4. Harden service accounts and secrets — Run Tomcat with least privilege, rotate stored credentials, and move secrets out of local config files where possible. This limits blast radius if a separate Tomcat flaw or credential attack later lands on the host.
  5. Turn on targeted detections — Alert on repeated requests to /manager, /host-manager, /docs, AJP traffic to 8009, suspicious JSP uploads, and unusual child processes from java. Detection won't solve unsupported status, but it catches the follow-on exploit paths attackers actually use.
What doesn't work
  • A WAF alone does not fix unsupported software and may miss non-HTTP surfaces like AJP or authenticated abuse of Manager.
  • Simply hiding version banners reduces fingerprinting noise but does nothing if admin endpoints, old connectors, or vulnerable configs remain reachable.
  • Routine AV on the server is not a substitute for lifecycle management; it will not prevent exploitation of a future Tomcat 7 flaw or stop credential theft from the app itself.
06 · Verification

Crowdsourced verification payload.

Run this from an auditor workstation, CI job, or directly on the target host with Python 3. Invoke it as python3 check_tomcat7_seol.py /opt/tomcat or point it at catalina.jar directly, for example python3 check_tomcat7_seol.py /opt/tomcat/lib/catalina.jar. No admin rights are required if you can read the Tomcat installation path.

noisgate-verify.py
PYTHONREAD-ONLYSAFE
#!/usr/bin/env python3
# check_tomcat7_seol.py
# Exit codes:
#   0 = PATCHED
#   1 = VULNERABLE (Tomcat 7.0.x / unsupported)
#   2 = UNKNOWN (could not determine version)

import os
import re
import sys
import zipfile
from pathlib import Path

VERSION_RE = re.compile(r'(\d+\.\d+\.\d+)')


def extract_version_from_text(text: str):
    if not text:
        return None
    m = VERSION_RE.search(text)
    return m.group(1) if m else None


def read_manifest_version(jar_path: Path):
    try:
        with zipfile.ZipFile(jar_path, 'r') as zf:
            candidates = [
                'META-INF/MANIFEST.MF',
                'org/apache/catalina/util/ServerInfo.properties',
            ]
            for name in candidates:
                try:
                    data = zf.read(name).decode('utf-8', errors='ignore')
                    v = extract_version_from_text(data)
                    if v:
                        return v
                except KeyError:
                    continue
    except Exception:
        return None
    return None


def find_version(base: Path):
    if base.is_file() and base.name.lower() == 'catalina.jar':
        return read_manifest_version(base)

    jar_candidates = [
        base / 'lib' / 'catalina.jar',
        base / 'server' / 'lib' / 'catalina.jar',
    ]
    for jar in jar_candidates:
        if jar.exists():
            v = read_manifest_version(jar)
            if v:
                return v

    text_candidates = [
        base / 'RELEASE-NOTES',
        base / 'RUNNING.txt',
        base / 'webapps' / 'docs' / 'changelog.html',
    ]
    for f in text_candidates:
        if f.exists() and f.is_file():
            try:
                data = f.read_text(encoding='utf-8', errors='ignore')
                v = extract_version_from_text(data)
                if v:
                    return v
            except Exception:
                pass

    return None


def main():
    if len(sys.argv) != 2:
        print('UNKNOWN - usage: python3 check_tomcat7_seol.py <tomcat_home|path_to_catalina.jar>')
        sys.exit(2)

    target = Path(sys.argv[1]).expanduser().resolve()
    if not target.exists():
        print(f'UNKNOWN - path does not exist: {target}')
        sys.exit(2)

    version = find_version(target)
    if not version:
        print('UNKNOWN - could not determine Tomcat version from installation files')
        sys.exit(2)

    if version.startswith('7.0.'):
        print(f'VULNERABLE - Apache Tomcat {version} is in the unsupported 7.0.x branch')
        sys.exit(1)

    print(f'PATCHED - Apache Tomcat {version} is not in the unsupported 7.0.x branch')
    sys.exit(0)


if __name__ == '__main__':
    main()
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning, do not treat this like a live CVSS 10 fire drill; treat it like middleware debt with real downside. Use the next business cycle to identify every Tomcat 7 owner, tag which instances are internet-facing, and fast-track exposure reduction on any host with Manager or AJP reachable; for this MEDIUM call there is noisgate mitigation SLAno mitigation SLA — go straight to the 365-day remediation window — but internet-exposed exceptions should be accelerated by policy. Then put the actual platform migration into the noisgate remediation SLA of ≤365 days, with externally exposed and business-critical apps moved first.

Sources

  1. Tenable Nessus Plugin 171351
  2. Apache Tomcat 7.0.x End of Life Notice
  3. Apache Tomcat 7.x Vulnerabilities Page
  4. Apache Tomcat 7.0.109 Changelog
  5. NVD CVE-2020-1938
  6. CISA Known Exploited Vulnerabilities Catalog
  7. GreyNoise: Coordinated Brute Force Activity Targeting Apache Tomcat Manager
  8. Tenable Ghostcat Analysis
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.