This is a bad lock on the staff-only door, not an open front gate
Plugin tenable:83764 maps to CVE-2014-7810, an Apache Tomcat Expression Language flaw fixed for the 7.x branch in 7.0.59 because 7.0.58 contained the fix but was never released. The bug lets a malicious web application abuse EL evaluation inside a privileged code path and bypass Tomcat's Java SecurityManager protections. For the vulnerable upstream line, Apache lists 7.0.0 through 7.0.57 as affected; the Nessus plugin flags < 7.0.59 for released-build hygiene.
paragraph 2: Vendor severity is technically defensible in a vacuum but too generous for most enterprise fleets. This is not an unauthenticated remote exploit against a normal Tomcat deployment; it generally matters only when you run untrusted third-party apps and enable SecurityManager isolation, which is a narrow shared-hosting or multi-tenant pattern. Tenable also says the plugin is version-only and did not verify exploitability on-host, which pushes this down hard in real patch queues.
4 steps from start to impact.
Gain app-deployment foothold with Tomcat Manager or CI/CD tooling
Tomcat Manager, compromised CI/CD credentials, a supply-chain hit on a WAR, or another prior compromise that already lets them publish application code. This is not the vulnerability doing initial access; it's the attacker arriving with the keys to the app shelf already in hand.- Ability to deploy or modify a web application on the target Tomcat
- Tomcat accepts code/content from a less-trusted tenant, partner, or already-compromised pipeline
- Most enterprises deploy only first-party apps to Tomcat
- Deployment paths are usually authenticated and restricted to admins or build systems
- This prerequisite already implies a serious prior compromise or trusted-tenant model
83764 does not test this step; it only checks the Tomcat version.Land on a host running Java SecurityManager
SecurityManager to sandbox webapps. Without that control boundary, there is nothing meaningful for CVE-2014-7810 to bypass. Apache's own advisory explicitly says the issue only affects installations that run web applications from untrusted sources.- Tomcat launched with
-securityor equivalent SecurityManager enablement - The deployment model relies on SecurityManager isolation between apps/tenants
- SecurityManager-backed isolation was never the dominant enterprise Tomcat pattern
- Many orgs run trusted in-house apps and never enable this mode
- Modern Java ecosystems have moved away from relying on SecurityManager
Trigger privileged EL evaluation with a malicious app
- A malicious app is deployed and executed
- The app can reach the vulnerable EL evaluation path
- Impact is bounded by the Tomcat process and hosting model, not a universal host takeover primitive
- This is mainly a cross-app isolation failure in shared or untrusted hosting setups
Pivot to cross-app impact, not instant internet-scale compromise
- Multiple apps or tenant boundaries exist on the same Tomcat instance
- Those boundaries materially depend on SecurityManager enforcement
- Single-purpose Tomcat nodes have little additional isolation to bypass
- If the attacker can already ship code to the server, your bigger problem is the deploy path compromise
SecurityManager is actually enabled — Review service definitions, startup scripts, and running process arguments for -security or -Djava.security.manager. If it is not enabled, the CVE's core bypass condition is absent; for a LOW verdict there is no SLA (treat as backlog hygiene).tomcat7 rather than upstream tarballs, verify the distro-fixed package version instead of chasing upstream 7.0.59 literally. For a LOW verdict there is no SLA (treat as backlog hygiene), but this avoids false-positive churn.- A WAF does not solve this well; the vulnerability is about privileged EL evaluation inside a maliciously deployed app, not a clean front-door HTTP payload you can reliably signature.
- Hiding the Tomcat version banner reduces scanner visibility but does nothing about the underlying deploy-path and sandbox conditions.
- Network segmentation alone is weak compensation if the attacker already has Manager access or a compromised build pipeline, which is the more realistic prerequisite.
The supporting signals.
| Primary issue | CVE-2014-7810 — Apache Tomcat EL SecurityManager bypass via privileged expression evaluation |
|---|---|
| In-the-wild status | No current KEV listing and I found no authoritative active-exploitation reporting tied to this CVE; Tenable also marks no known exploits available |
| Proof-of-concept availability | No mainstream public PoC surfaced in quick GitHub/Exploit-DB-style discovery, and Tenable explicitly says Exploit Ease: No known exploits are available |
| EPSS | Public mirrors currently show a non-zero but noisy EPSS signal for this old CVE; treat that as weak evidence because the real gating factor is the deployment model, not internet reachability |
| KEV status | Not listed in CISA's Known Exploited Vulnerabilities catalog as of the catalog source used here |
| CVSS interpretation | Vendor/NVD-style base scoring says network, low complexity, no auth, but that framing hides the decisive real-world prerequisite: the attacker typically needs a way to deploy a malicious webapp first |
| Affected versions | Apache Tomcat 7.0.0–7.0.57 are the upstream affected 7.x builds; Nessus uses < 7.0.59 because 7.0.58 was not released |
| Fixed versions | Upstream fix is delivered in released build 7.0.59 for Tomcat 7.x. Distro backports exist, including Debian tomcat7 7.0.28-4+deb7u3 / 7.0.56-3+deb8u1 and Ubuntu libtomcat7-java 7.0.56-2ubuntu0.1 for affected packages |
| Scanning / exposure reality | This flaw is not remotely fingerprintable by behavior; Tenable's plugin is version-only. Internet-wide product counts for Tomcat are therefore a poor proxy for exploitability of this specific CVE |
| Disclosure / credit | Apache publicly disclosed it on 2015-05-14 and credits the Apache Tomcat security team |
Sources.
Why this verdict
- Requires a prior foothold: the attacker typically needs a way to deploy or alter a webapp first, which implies compromised admin, CI/CD, or tenant access before this CVE matters
- Narrow exposure pattern: impact depends on Tomcat actually using
SecurityManagersandboxing for less-trusted apps, which is a minority enterprise pattern - Version-only detection: Nessus did not validate exploitability on-host; it flagged a version range, so population-level noise is expected
- No KEV / no solid exploitation evidence: no CISA KEV listing and no strong public proof of broad exploitation keep this out of urgent patch lanes
- Blast radius is contextual: the bug is mainly about bypassing app isolation on the same Tomcat instance, not clean unauthenticated server-wide code execution
Why not higher?
Because the headline CVSS framing masks a major prerequisite chain. If an attacker must already be able to publish a malicious app and the server must also rely on SecurityManager isolation, this is not a fleet-wide internet-exposed emergency for a normal enterprise. The reachable population is much smaller than the version count suggests.
Why not lower?
I am not putting this at IGNORE because some organizations really do run shared or delegated Tomcat estates, legacy hosting models, or third-party WAR deployments where SecurityManager was part of the safety boundary. In those environments this is a real isolation failure, just not one that deserves front-of-line treatment across a general enterprise fleet.
Crowdsourced verification payload.
Run this on the target Tomcat host as a user that can read the Tomcat install tree and inspect running processes; root is best, but read access plus ps visibility is usually enough. Invoke it as bash verify_cve_2014_7810.sh /opt/tomcat and it will output VULNERABLE, PATCHED, or UNKNOWN based on Tomcat 7.x version and whether SecurityManager appears enabled.
#!/usr/bin/env bash
# verify_cve_2014_7810.sh
# Checks Apache Tomcat 7.x for CVE-2014-7810 exposure conditions.
# Exit codes:
# 0 = PATCHED / not affected
# 1 = VULNERABLE
# 2 = UNKNOWN / insufficient evidence
set -u
TOMCAT_HOME="${1:-}"
if [[ -z "$TOMCAT_HOME" ]]; then
echo "UNKNOWN: usage: $0 /path/to/tomcat"
exit 2
fi
if [[ ! -d "$TOMCAT_HOME" ]]; then
echo "UNKNOWN: path not found: $TOMCAT_HOME"
exit 2
fi
version=""
# Method 1: bin/version.sh if present
if [[ -x "$TOMCAT_HOME/bin/version.sh" ]]; then
version=$("$TOMCAT_HOME/bin/version.sh" 2>/dev/null | awk -F': ' '/Server number/ {print $2; exit}')
fi
# Method 2: RELEASE-NOTES fallback
if [[ -z "$version" && -f "$TOMCAT_HOME/RELEASE-NOTES" ]]; then
version=$(grep -Eo 'Apache Tomcat Version [0-9]+\.[0-9]+\.[0-9]+' "$TOMCAT_HOME/RELEASE-NOTES" 2>/dev/null | head -n1 | awk '{print $4}')
fi
# Method 3: catalina.jar + ServerInfo fallback (requires java)
if [[ -z "$version" && -f "$TOMCAT_HOME/lib/catalina.jar" && -n "$(command -v java 2>/dev/null)" ]]; then
version=$(java -cp "$TOMCAT_HOME/lib/catalina.jar" org.apache.catalina.util.ServerInfo 2>/dev/null | awk -F'/| ' '/Server version/ {for (i=1;i<=NF;i++) if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+$/) {print $i; exit}}')
fi
if [[ -z "$version" ]]; then
echo "UNKNOWN: could not determine Tomcat version"
exit 2
fi
major=$(echo "$version" | cut -d. -f1)
minor=$(echo "$version" | cut -d. -f2)
patch=$(echo "$version" | cut -d. -f3)
if [[ "$major" != "7" ]]; then
echo "PATCHED: Tomcat version $version is not in the Tomcat 7.x line checked by this script"
exit 0
fi
# Only Apache Tomcat 7.0.0 through 7.0.57 are vulnerable upstream.
# Nessus flags < 7.0.59 because 7.0.58 was not released.
if [[ "$minor" -ne 0 ]]; then
echo "UNKNOWN: unexpected Tomcat 7.x version format: $version"
exit 2
fi
if (( patch >= 59 )); then
echo "PATCHED: Tomcat $version is at or above 7.0.59"
exit 0
fi
if (( patch == 58 )); then
echo "UNKNOWN: 7.0.58 was not a released upstream build; validate packaging/backport provenance"
exit 2
fi
# For 7.0.0 - 7.0.57, check whether SecurityManager appears enabled.
sm_enabled=0
# Process inspection
if ps -ef 2>/dev/null | grep -v grep | grep -E "[o]rg\.apache\.catalina\.startup\.Bootstrap|[t]omcat" | grep -Eq '(^| )-security( |$)|-Djava\.security\.manager'; then
sm_enabled=1
fi
# Config/script inspection
if grep -RqsE '(^|[[:space:]])-security([[:space:]]|$)|-Djava\.security\.manager' \
"$TOMCAT_HOME/bin" "$TOMCAT_HOME/conf" 2>/dev/null; then
sm_enabled=1
fi
if (( sm_enabled == 1 )); then
echo "VULNERABLE: Tomcat $version is in the affected range and SecurityManager appears enabled"
exit 1
fi
echo "UNKNOWN: Tomcat $version is in the affected version range, but SecurityManager was not confirmed; review service wrappers, systemd units, and startup environment manually"
exit 2