Leaving the master keyring on the front porch with a neon sign saying 'HELP YOURSELF'
CVE-2024-47575, dubbed FortiJump, is a missing-authentication vulnerability in the fgfmd daemon — the service that handles the FortiGate-to-FortiManager (FGFM) protocol on TCP port 541. An unauthenticated remote attacker can send specially crafted requests to this service and achieve arbitrary code execution as root. Affected versions span nearly the entire supported lineup: FortiManager 6.2.0–6.2.12, 6.4.0–6.4.14, 7.0.0–7.0.12, 7.2.0–7.2.7, 7.4.0–7.4.4, and 7.6.0, plus FortiManager Cloud 7.0.1–7.0.12, 7.2.1–7.2.7, and 7.4.1–7.4.4. Exploitation was observed in the wild as early as June 27, 2024 — nearly four months before public disclosure on October 23, 2024.
Fortinet's vendor severity of CRITICAL / 9.8 is fully warranted and, if anything, understates the operational blast radius. The CVSS vector (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) accurately reflects the zero-click, unauth, network-reachable, root-level impact. FortiManager is not a workstation or a commodity server — it is the central nervous system of a Fortinet deployment. Compromise yields the IP addresses, configuration files, firewall policies, VPN secrets, and FortiOS256-hashed credentials of every managed FortiGate. In the UNC5820 campaign tracked by Mandiant, attackers automated mass exfiltration of exactly this data from 50+ FortiManager instances across multiple industries. The vendor score matches reality.
5 steps from start to impact.
Reach the FGFM listener
- Network path to FortiManager on TCP/541
- Well-segmented environments restrict 541 to known FortiGate IPs only
- Some deployments use custom certificates that raise the bar for spoofing the FGFM handshake
Exploit missing authentication in fgfmd
fgfmd daemon lacks authentication for the critical management function, no credentials, tokens, or certificates are required. The public watchTowr PoC (CVE-2024-47575.py by Sina Kheirkhah) provides both check and exploit modes. A nuclei template is also available in projectdiscovery/nuclei-templates.- Vulnerable FortiManager version (virtually all pre-patch versions)
- The
fgfm-deny-unknown enableworkaround blocks connections from unregistered serial numbers — but only available on 7.0.12+, 7.2.5+, 7.4.3+ - Custom certificate enforcement (7.2.2+) prevents unauthenticated FGFM sessions
Unregistered device localhost add succeeded entries. Check for rogue serial numbers (e.g., FMG-VMTM23017412) in /fds/data/unreg_devices.txt.Achieve root-level code execution
fgfmd, executing attacker-supplied commands as root on the FortiManager appliance. This gives full control of the management plane — file system access, database queries, and the ability to modify managed device configurations.- Successful exploitation from Step 2
- None — exploitation is reliable and version-independent once the request reaches fgfmd
fgfmd. File integrity monitoring on /tmp/.tm and /var/tmp/.tm — known UNC5820 staging paths.Exfiltrate managed device configurations
/tmp/.tm. This data enables lateral movement to every managed FortiGate.- Root shell on FortiManager
- None — the data is stored locally on the FortiManager by design
/tmp/ or /var/tmp/. SIEM alerts on large outbound transfers from FortiManager management interfaces.Pivot to managed FortiGate fleet
- Exfiltrated credentials from Step 4
- Network access to managed FortiGates (typically guaranteed from FortiManager's network position)
- If FortiGate admin passwords differ from managed configs (rare in centralized management)
- If FortiGate management interfaces are further segmented from FortiManager
config system global → set fgfm-deny-unknown enable → end. This prevents unregistered devices from connecting via FGFM, blocking the primary exploitation vector. Deploy within the noisgate mitigation SLA of 3 days (CRITICAL). Note: this breaks auto-registration of new FortiGates — pre-add serial numbers to the device list before enabling./fds/data/unreg_devices.txt for rogue serial numbers (e.g., FMG-VMTM23017412, FMG-VMTM19008093), look for archive files at /tmp/.tm or /var/tmp/.tm, review logs for 'Unregistered device localhost add succeeded' entries, and check for inbound connections from known UNC5820 IPs (45.32.41.202, 104.238.141.143, 158.247.199.37, 80.66.196.199). If compromise indicators are found, treat managed FortiGate credentials as breached and rotate immediately.- WAF/IPS in front of FortiManager — FGFM is a proprietary binary protocol on TCP/541, not HTTP. Standard web application firewalls cannot inspect or filter this traffic. Network IPS signatures may exist but rely on pattern matching against a protocol most IPS engines do not deeply parse.
- FortiManager admin password rotation — The vulnerability bypasses authentication entirely; changing admin passwords has zero effect on exploitation. The attacker never authenticates.
- Disabling the web GUI — The vulnerability is in the
fgfmddaemon (FGFM protocol on TCP/541), not the web management interface. Disabling HTTPS management access does not affect the FGFM listener. - Network segmentation alone without ACLs on 541 — Placing FortiManager on a management VLAN helps but does not block exploitation if FortiGates (or any compromised host on that VLAN) can reach port 541. The FGFM port must be explicitly ACL'd to known FortiGate sources.
The supporting signals.
| In-the-Wild Exploitation | Confirmed active since June 27, 2024. Mandiant tracked threat cluster UNC5820 exploiting 50+ FortiManager instances across multiple industries. Automated exfiltration of managed device configs, credentials, and FortiGate IPs observed. Mandiant/Google Cloud blog |
|---|---|
| CISA KEV Status | Added October 23, 2024. Federal agencies required to patch by November 13, 2024. CISA alert |
| EPSS Score | 0.94766 (top ~5% of all CVEs) — extremely high probability of exploitation activity. |
| Proof-of-Concept Availability | Public, weaponized. watchtowrlabs/Fortijump-Exploit-CVE-2024-47575 by Sina Kheirkhah of watchTowr — full RCE exploit with check and exploit modes. Nuclei template available at projectdiscovery/nuclei-templates (PR #11355). Additional PoC references on pocindex.io. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — Network-reachable, zero complexity, no authentication, no user interaction. Maximum impact across confidentiality, integrity, and availability. |
| Affected Versions | FortiManager 7.6.0, 7.4.0–7.4.4, 7.2.0–7.2.7, 7.0.0–7.0.12, 6.4.0–6.4.14, 6.2.0–6.2.12. FortiManager Cloud 7.4.1–7.4.4, 7.2.1–7.2.7, 7.0.1–7.0.12, 6.4 (all). |
| Fixed Versions | FortiManager 7.6.1, 7.4.5, 7.2.8, 7.0.13, 6.4.15, 6.2.13. FortiManager Cloud 7.4.5, 7.2.8, 7.0.13. |
| Exposure / Attack Surface | Shodan: ~60,000 internet-facing FortiManager devices (13K+ in US, 5.8K+ in China, ~3K in Brazil). Censys: 4,081 exposed admin portals, ~86% on default FGFM port (TCP/541). ~30% of exposed instances concentrated in the US. |
| Disclosure Timeline | Exploitation observed: June 27, 2024. Fortinet private notification to customers: October 13, 2024. Public advisory (FG-IR-24-423): October 23, 2024. CISA KEV addition: October 23, 2024. |
| Reporting Researcher | Reported by Fortinet internally; exploitation discovered by Mandiant (Google Cloud) during incident response. Public PoC by Sina Kheirkhah (watchTowr Labs). |
Sources.
- Fortinet PSIRT Advisory FG-IR-24-423
- Mandiant/Google Cloud — FortiManager Zero-Day Exploitation (UNC5820)
- CISA KEV Entry — CVE-2024-47575
- watchTowr Labs — FortiJump PoC and Technical Analysis
- watchTowr FortiJump Exploit (GitHub)
- Censys Advisory — FortiManager Exposure Analysis
- Rapid7 Analysis — CVE-2024-47575
- Nuclei Template — CVE-2024-47575
Why this verdict
- Trivial exploitation, zero friction: The attack requires only network access to TCP/541 and a single crafted request. No authentication, no user interaction, no race conditions, no chaining. The public watchTowr PoC is point-and-shoot. This is as close to zero-click RCE as network vulnerabilities get.
- Confirmed mass exploitation with nation-state-grade operational security: UNC5820 exploited this for four months before disclosure across 50+ organizations. The EPSS score of 0.94766 and KEV listing confirm this is not theoretical — it is actively weaponized at scale.
- Role multiplier: FortiManager is canonically a high-value network management platform. 100% of FortiManager installations exist to manage FortiGate firewalls — it is a fleet-management appliance *by definition*. Compromise yields root on the appliance that stores credentials, configs, VPN secrets, and firewall policies for every managed FortiGate. The blast radius is not host-level — it is fleet-level perimeter control. A single FortiManager compromise cascades to every managed FortiGate, which are themselves perimeter/network-edge appliances. This is a supply-chain-scale outcome on a component where ≥95% of installs occupy the high-value role. The verdict floor is CRITICAL.
- Massive internet-facing exposure: Unlike many management-plane vulnerabilities that require internal access, ~60,000 FortiManager instances are directly internet-reachable. Even restricting to the Censys figure of 4,081 exposed admin portals, the externally reachable population is substantial. Internal-only deployments are still reachable from any compromised host with a route to the management VLAN — which is the expected position of a FortiGate itself.
- No compensating control enabled by default: The
fgfm-deny-unknownworkaround is not enabled by default and is only available on newer versions (7.0.12+, 7.2.5+, 7.4.3+). Custom certificate enforcement is opt-in and rarely deployed. The default-vulnerable population is the entire installed base.
Why not higher?
A 9.8 is effectively the maximum CVSS score for a network vulnerability without Scope change. The only theoretical increase would be to 10.0 with Changed scope, but the FGFM protocol exploitation is scoped to the FortiManager host itself (post-exploitation pivot to FortiGates is a separate action, not a direct consequence of the vulnerability primitive). The 9.8 is the correct ceiling.
Why not lower?
Every downgrade argument fails here. The 'requires internal network' friction does not apply — 60,000 instances are internet-facing. The 'requires specific configuration' argument does not apply — the default configuration is vulnerable. The 'limited blast radius' argument does not apply — FortiManager is by definition the fleet-management console for all managed FortiGate perimeter appliances. There is zero authentication, zero complexity, and confirmed mass exploitation by a tracked threat actor. Downgrading below CRITICAL would require evidence that the vulnerable population is negligible or that the exploitation path is unreliable, neither of which is true.
Crowdsourced verification payload.
Run this script on each FortiManager appliance via SSH as root (or via the FortiManager CLI shell). It checks the running firmware version against known-vulnerable ranges. Invoke with: bash check_fortijump.sh
#!/bin/bash
# check_fortijump.sh — CVE-2024-47575 (FortiJump) version check for FortiManager
# Run on the FortiManager appliance as root via SSH or CLI shell.
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
VERSION_STRING=$(get_system_status 2>/dev/null | grep -i 'Version:' | head -1)
if [ -z "$VERSION_STRING" ]; then
# Try alternative method
VERSION_STRING=$(diagnose sys status 2>/dev/null | grep -i 'Version:' | head -1)
fi
if [ -z "$VERSION_STRING" ]; then
# Try reading from /etc/version or build info
if [ -f /etc/version ]; then
VERSION_STRING=$(cat /etc/version)
fi
fi
if [ -z "$VERSION_STRING" ]; then
echo "UNKNOWN — Could not determine FortiManager version."
echo "Manually check: run 'get system status' in the FortiManager CLI."
exit 2
fi
echo "Detected version string: $VERSION_STRING"
# Extract major.minor.patch
VER=$(echo "$VERSION_STRING" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
if [ -z "$VER" ]; then
echo "UNKNOWN — Could not parse version number from: $VERSION_STRING"
exit 2
fi
MAJOR=$(echo "$VER" | cut -d. -f1)
MINOR=$(echo "$VER" | cut -d. -f2)
PATCH=$(echo "$VER" | cut -d. -f3)
echo "Parsed version: $MAJOR.$MINOR.$PATCH"
# Fixed versions: 7.6.1, 7.4.5, 7.2.8, 7.0.13, 6.4.15, 6.2.13
VULNERABLE=0
if [ "$MAJOR" -eq 7 ] && [ "$MINOR" -eq 6 ]; then
[ "$PATCH" -lt 1 ] && VULNERABLE=1
elif [ "$MAJOR" -eq 7 ] && [ "$MINOR" -eq 4 ]; then
[ "$PATCH" -lt 5 ] && VULNERABLE=1
elif [ "$MAJOR" -eq 7 ] && [ "$MINOR" -eq 2 ]; then
[ "$PATCH" -lt 8 ] && VULNERABLE=1
elif [ "$MAJOR" -eq 7 ] && [ "$MINOR" -eq 0 ]; then
[ "$PATCH" -lt 13 ] && VULNERABLE=1
elif [ "$MAJOR" -eq 6 ] && [ "$MINOR" -eq 4 ]; then
[ "$PATCH" -lt 15 ] && VULNERABLE=1
elif [ "$MAJOR" -eq 6 ] && [ "$MINOR" -eq 2 ]; then
[ "$PATCH" -lt 13 ] && VULNERABLE=1
elif [ "$MAJOR" -eq 6 ] && [ "$MINOR" -eq 0 ]; then
# 6.0.x — all versions vulnerable, no fix available
VULNERABLE=1
elif [ "$MAJOR" -lt 6 ]; then
# Older than 6.x — likely EOL and vulnerable
VULNERABLE=1
fi
# Check for fgfm-deny-unknown workaround
WORKAROUND="not checked"
DENY_UNKNOWN=$(config system global 2>/dev/null <<EOF
get
EOF
)
if echo "$DENY_UNKNOWN" | grep -q 'fgfm-deny-unknown.*enable'; then
WORKAROUND="ENABLED (fgfm-deny-unknown)"
else
WORKAROUND="NOT ENABLED"
fi
if [ "$VULNERABLE" -eq 1 ]; then
echo "VULNERABLE — FortiManager $MAJOR.$MINOR.$PATCH is affected by CVE-2024-47575 (FortiJump)."
echo "Workaround status: $WORKAROUND"
echo "ACTION: Upgrade immediately. Fixed versions: 7.6.1, 7.4.5, 7.2.8, 7.0.13, 6.4.15, 6.2.13."
echo "Check IoCs: /tmp/.tm, /var/tmp/.tm, /fds/data/unreg_devices.txt"
exit 1
else
echo "PATCHED — FortiManager $MAJOR.$MINOR.$PATCH is not affected by CVE-2024-47575."
exit 0
fi