Leaving a master key under the welcome mat of the building that stores every other key
CVE-2026-20079 is a pre-authentication remote code execution vulnerability in Cisco Secure Firewall Management Center (FMC), the centralized management console that configures and monitors an organization's entire Cisco Secure Firewall (Firepower Threat Defense) fleet. At boot time, FMC creates a machine-level session entry in its sfsnort.sessions database using a static, predictable session identifier (csm_processes) and hardcoded internal credentials (report:snortrules). An unauthenticated remote attacker can present this fixed session cookie via crafted HTTP requests, upgrade it into a full UI session with CSRF token access, and chain through the validateLicense and upgradeReadinessCall CGI endpoints to write and execute arbitrary shell scripts as root. Affected versions span nearly the entire supported lineup: 6.4.0.13 through 7.0.x before 7.0.9, 7.1.x through 7.2.x before 7.2.11, 7.3.x through 7.4.x before 7.4.6, 7.6.x before 7.6.5, 7.7.x before 7.7.12, and 10.0.x before 10.0.1. Cloud-Delivered FMC, Cisco ASA, Cisco FTD appliances, and Security Cloud Control are not affected.
Cisco's vendor severity of CRITICAL / CVSS 10.0 is accurate and, if anything, undersells the operational blast radius. A CVSS:3.1 AV:N/AC:L/PR:N/UI:N/S:C perfectly describes the network attack vector, trivial complexity, zero privilege requirement, and changed scope (root on FMC allows reconfiguring downstream FTD devices). The one theoretical friction point — the csm_processes session can be cleared by dashboard interactions or periodic cleanup, narrowing the exploitation window to shortly after reboot or on idle appliances — has been proven irrelevant by real-world campaigns. Cisco Talos documented three separate threat-actor clusters (Sandworm / GRU Unit 74455, Qilin ransomware, and a credential-theft group) successfully exploiting this flaw at scale, compromising at least 178 devices out of ~3,000 targeted IPs. Public PoC code from VulnCheck and CyberAuth is freely available on GitHub. CISA added this to the KEV catalog on September 9, 2026 with a federal deadline of September 12 — a 3-day window reflecting the severity. The vendor score stands.
6 steps from start to impact.
Identify internet-exposed or internal FMC web interface
- Network reachability to FMC web interface on port 443
- Best practice isolates FMC on a dedicated management VLAN; only 300–700 instances are internet-facing
- Internal attackers need prior foothold to reach management segment
Present static csm_processes session cookie
CGISESSID=csm_processes. This matches the static machine-session entry that FMC wrote into sfsnort.sessions at boot time. Because the session ID is deterministic and identical across all FMC appliances and reboots, no brute-forcing or credential guessing is required. The attacker then authenticates using the hardcoded internal credentials report:snortrules to upgrade this machine session into a UI session.- The csm_processes session row must still exist in the database (not yet cleared by user interaction or cleanup)
- Session is cleared by any dashboard interaction, admin login, or periodic cleanup routine — window is post-reboot or on idle/unattended appliances
- Real-world exploitation proves this window is sufficient: 178 confirmed compromises
Acquire sf_action_id CSRF token
sf_action_id CSRF token from the FMC web application. This token is required to call restricted CGI endpoints. The token is returned in standard page responses and is trivially extracted.- Valid upgraded UI session from step 2
- None — automatic once session is upgraded
Write malicious script via validateLicense endpoint
sf_action_id and the sajaxintf.cgi endpoint's validateLicense action, the attacker writes a shell script to /var/tmp/license.tmp. The payload is delivered via JSON Unicode-escaped strings to evade basic input filtering. This is the arbitrary file write primitive that converts auth bypass into code execution. Tool: VulnCheck PoC / CyberAuth CVE-2026-20079 Python exploit.- CSRF token from step 3
- Write access to /var/tmp/ (default FMC configuration allows this)
- None — the CGI endpoint performs no additional authorization checks beyond the session
Trigger root execution via upgradeReadinessCall
pjb.cgi endpoint with the upgradeReadinessCall action, which internally invokes SF::System::Wrappers::RunCmd to execute /var/tmp/license.tmp as root. This completes the chain: the attacker now has an interactive root shell on the FMC appliance. From here, Sandworm deployed Cyclops Blink, Qilin staged ransomware, and UAT-12197 planted web shells.- Malicious script written in step 4
- pjb.cgi endpoint reachable (same web interface)
- None — pjb.cgi runs with root privileges by design
Pivot to managed firewall fleet and downstream network
- Root access on FMC (achieved in step 5)
- FMC managing one or more FTD devices (the entire purpose of FMC)
- None — this is the designed management path
/var/tmp/license.tmp, unexpected JAR files (cmd.jar) in Tomcat directories, Cyclops Blink binary hash 6f98add5d1a7729192b6ad8491d85c505c64836f7881742d6b93bd8e3d2fe461, reverse shell processes, unexpected cron entries, and connections to known C2 IPs (89.34.96.56, 208.123.119.215, 91.214.78.118). If IOCs are found, treat the FMC and all managed FTD appliances as compromised. Deploy within 3 days per noisgate mitigation SLA.CGISESSID=csm_processes from non-localhost sources, and POST requests to sajaxintf.cgi with validateLicense or pjb.cgi with upgradeReadinessCall actions. This provides detection-in-depth but does NOT prevent exploitation — it only alerts after the attempt. Deploy within 3 days.- Web Application Firewall (WAF) in front of FMC: The exploit uses legitimate HTTP request structures with a valid-looking session cookie and JSON-encoded payloads. Generic WAF rules will not detect or block the specific
csm_processessession fixation or the Unicode-escaped script injection without custom signatures. - Disabling the FMC web interface entirely: FMC's web interface is the primary management console for the product — disabling it removes the ability to manage the firewall fleet, which defeats the purpose of having FMC.
- Multi-factor authentication on FMC login: The vulnerability bypasses the authentication system entirely using a machine-level session; MFA on the user login flow is never reached and provides zero protection.
- Rotating admin passwords on FMC: The exploit uses the hardcoded
report:snortrulesinternal machine credentials, not any administrator account password. Password rotation of admin accounts does not affect this attack path.
The supporting signals.
| In-the-Wild Status | Actively exploited by three distinct clusters: UAT-11823 (Sandworm / GRU Unit 74455) deploying Cyclops Blink; UAT-11988 (Qilin ransomware) staging encryption campaigns; UAT-12197 (crimeware) planting web shells and credential harvesters. ~3,000 IPs targeted, 178 devices confirmed compromised. (Talos) |
|---|---|
| CISA KEV | Listed September 9, 2026 with federal remediation deadline of September 12, 2026 (3-day window). (CISA) |
| EPSS | 0.88472 (88th percentile) — indicates very high predicted exploitation probability within 30 days |
| PoC Availability | Multiple public PoCs: CyberAuth/CVE-2026-20079 (Python, multi-mode: fingerprint, check, exploit, interactive shell); VulnCheck clean-room implementation with full root-shell demo; Nuclei template available. Weaponization is trivial. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — 10.0. Network-reachable, no complexity, no auth, no interaction, changed scope (root on management plane pivots to downstream fleet). Every sub-metric is worst-case. |
| Affected Versions | On-premises FMC: 6.4.0.13–7.0.x (before 7.0.9), 7.1.x–7.2.x (before 7.2.11), 7.3.x–7.4.x (before 7.4.6), 7.6.x (before 7.6.5), 7.7.x (before 7.7.12), 10.0.x (before 10.0.1). Cloud-Delivered FMC, ASA, FTD, and SCC are not affected. |
| Fixed Versions | Hot-fix builds: 7.0.9.1-3, 7.2.11.1-4, 7.4.7.1-3, 7.6.5.1-2, 7.7.12.1-2, 10.0.1.1-2. Cisco states no workaround exists; patching is the only remediation. |
| Internet Exposure | Censys: ~300 exposed instances; FOFA: 600–700 exposed instances as of September 2026. FMC is not designed to be internet-facing; these represent misconfigurations. Internally-reachable FMC is the larger population. |
| Disclosure Timeline | March 4, 2026: Cisco advisory published. July 2026: companion CVE-2026-20316 confirmed exploited. August 2026: CVE-2026-20079 exploitation confirmed by Cisco PSIRT. September 9, 2026: CISA KEV listing. Patch fix ~25 lines of code (Apache header validation + Auth.pm session type check). |
| Reporting / Discovery | Discovered internally by Cisco; exploitation documented by Cisco Talos Intelligence Group. VulnCheck published independent technical analysis and clean-room PoC. CyberAuth published open-source Python exploit. |
Sources.
- NVD — CVE-2026-20079
- Cisco Talos — FMC Ongoing Exploitation
- VulnCheck — Cisco FMC Auth Bypass Technical Analysis
- BleepingComputer — Cisco Confirms CVE-2026-20079 Exploited
- CISA KEV Alert — September 9, 2026
- CyberAuth/CVE-2026-20079 PoC — GitHub
- Qualys ThreatPROTECT — Cisco FMC Advisory
- SecurityAffairs — Qilin Ransomware via Cisco FMC
Why this verdict
- Pre-auth remote root with trivial complexity: The entire chain — from first HTTP request to root shell — requires zero credentials, zero user interaction, and a single predictable session cookie. The ~25-line patch confirms the root cause was embarrassingly simple: a static session ID and hardcoded internal credentials baked into every FMC appliance.
- Session cleanup window is theoretical friction, not practical: While the
csm_processessession can be cleared by dashboard interactions, Talos documented 178 confirmed compromises across 3,000 targeted IPs from three independent threat-actor clusters. The window is clearly exploitable on real production appliances, especially those that reboot during maintenance windows and aren't immediately interacted with. - Active exploitation by nation-state and ransomware operators: Sandworm (GRU Unit 74455) deploying Cyclops Blink and Qilin ransomware operators leveraging this for encryption campaigns eliminates any argument for theoretical-only risk. This is not a CTF exercise — it is an active battlefield.
- Role multiplier: FMC is canonically a high-value network management plane component. Every FMC installation exists specifically to centrally manage a fleet of Cisco Secure Firewall (FTD) appliances. Root access on FMC gives the attacker push-button control over every managed firewall's ACLs, NAT rules, VPN configurations, and inspection policies. The blast radius is not one host — it is *fleet-scale*: disabling perimeter firewalls, opening tunnels, exfiltrating VPN credentials, and pivoting into the entire protected network. Conservatively 100% of FMC installations occupy this high-value role because that IS FMC's sole purpose. The verdict floor is CRITICAL per the deployment-role blast radius rule.
- Internet exposure confirms external attack surface: 300–700 FMC instances are internet-facing per Censys/FOFA. While this is a fraction of total deployments, it provides zero-click initial access with no prior foothold required. For internally-deployed FMC, any attacker with network adjacency to the management VLAN can exploit identically — and management VLANs are a standard lateral movement target.
- Public weaponized PoC and EPSS 88th percentile: Multiple working exploit tools on GitHub, Nuclei templates, and an EPSS score of 0.88 collectively indicate mass exploitation is not merely possible but ongoing and accelerating.
Why not higher?
CVSS 10.0 is already the maximum score. There is no higher severity to assign. The vendor rating is accurate and the real-world evidence confirms it.
Why not lower?
Every friction point that might theoretically reduce severity has been empirically disproven by active exploitation. The session cleanup window does not prevent exploitation at scale (178 confirmed compromises). FMC is not a workstation or a low-value target — it is *the* management plane for the firewall fleet, making every instance a crown-jewel asset. Downgrading below CRITICAL would require evidence that the session window blocks >99% of attempts or that FMC is routinely deployed in non-management roles, neither of which is true. KEV listing and active nation-state exploitation override any remaining friction arguments.
Crowdsourced verification payload.
Run this script on each FMC appliance as root (via SSH or console). It checks the installed FMC software version against known-vulnerable ranges and inspects the sessions database for the exploitable csm_processes entry. Example: sudo bash check_cve_2026_20079.sh
#!/usr/bin/env bash
# check_cve_2026_20079.sh — Cisco FMC CVE-2026-20079 vulnerability checker
# Run as root on the FMC appliance itself.
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
RESULT="UNKNOWN"
# Get FMC version
if [ -f /etc/sf/ims.conf ]; then
VERSION=$(grep 'SWVERSION=' /etc/sf/ims.conf 2>/dev/null | head -1 | cut -d'=' -f2 | tr -d '"' || true)
elif command -v sf_version &>/dev/null; then
VERSION=$(sf_version 2>/dev/null | grep -oP '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)
else
VERSION=""
fi
if [ -z "$VERSION" ]; then
echo "[!] Could not determine FMC software version."
echo "UNKNOWN"
exit 2
fi
echo "[*] Detected FMC version: $VERSION"
# Parse version components
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
# Check against known-vulnerable ranges
# Fixed: 7.0.9+, 7.2.11+, 7.4.6+, 7.6.5+, 7.7.12+, 10.0.1+
vuln=0
if [ "$MAJOR" -eq 6 ]; then
vuln=1 # All 6.x affected
elif [ "$MAJOR" -eq 7 ]; then
if [ "$MINOR" -eq 0 ] && [ "$PATCH" -lt 9 ]; then
vuln=1 # 7.0.x before 7.0.9
elif [ "$MINOR" -eq 1 ]; then
vuln=1 # 7.1.x all affected
elif [ "$MINOR" -eq 2 ] && [ "$PATCH" -lt 11 ]; then
vuln=1 # 7.2.x before 7.2.11
elif [ "$MINOR" -eq 3 ]; then
vuln=1 # 7.3.x all affected
elif [ "$MINOR" -eq 4 ] && [ "$PATCH" -lt 6 ]; then
vuln=1 # 7.4.x before 7.4.6
elif [ "$MINOR" -eq 6 ] && [ "$PATCH" -lt 5 ]; then
vuln=1 # 7.6.x before 7.6.5
elif [ "$MINOR" -eq 7 ] && [ "$PATCH" -lt 12 ]; then
vuln=1 # 7.7.x before 7.7.12
fi
elif [ "$MAJOR" -eq 10 ]; then
if [ "$MINOR" -eq 0 ] && [ "$PATCH" -lt 1 ]; then
vuln=1 # 10.0.0
fi
fi
# Check for the exploitable session in database
SESS_DB="/var/sf/peers/*/sfsnort.sessions"
session_present=0
for db in $SESS_DB; do
if [ -f "$db" ]; then
if sqlite3 "$db" "SELECT COUNT(*) FROM sessions WHERE session_id='csm_processes';" 2>/dev/null | grep -q '[1-9]'; then
session_present=1
echo "[!] ACTIVE csm_processes session found in: $db"
fi
fi
done
# Check for IOCs
ioc_found=0
if [ -f /var/tmp/license.tmp ]; then
echo "[!] IOC: /var/tmp/license.tmp exists — possible exploitation artifact"
ioc_found=1
fi
if find /opt/cisco/fp/tomcat -name 'cmd.jar' 2>/dev/null | grep -q .; then
echo "[!] IOC: cmd.jar found in Tomcat directory — possible web shell"
ioc_found=1
fi
# Check for patched Apache config (the fix adds X-Auth-User-Type header)
patched_apache=0
if grep -rq 'X-Auth-User-Type' /etc/httpd/conf* /etc/apache2/* 2>/dev/null; then
patched_apache=1
echo "[+] Apache header validation for X-Auth-User-Type detected (patch indicator)"
fi
# Determine result
if [ $vuln -eq 1 ] && [ $patched_apache -eq 0 ]; then
RESULT="VULNERABLE"
echo "[!!] Version $VERSION is in the vulnerable range and patch indicator not found."
if [ $session_present -eq 1 ]; then
echo "[!!] CRITICAL: Exploitable session is ACTIVE. Immediate patching required."
fi
if [ $ioc_found -eq 1 ]; then
echo "[!!] CRITICAL: Indicators of compromise detected. Initiate IR."
fi
elif [ $patched_apache -eq 1 ]; then
RESULT="PATCHED"
echo "[+] Patch indicators present. Version: $VERSION"
elif [ $vuln -eq 0 ]; then
RESULT="PATCHED"
echo "[+] Version $VERSION is at or above the fixed version."
else
RESULT="UNKNOWN"
echo "[?] Could not conclusively determine patch status."
fi
echo ""
echo "$RESULT"
case $RESULT in
PATCHED) exit 0 ;;
VULNERABLE) exit 1 ;;
*) exit 2 ;;
esac