The malware jury has been bribed — an attacker with an HTTP client can whisper `; id` to your sandbox and become root
CVE-2026-25089 is an unauthenticated OS command injection (CWE-78) in the FortiSandbox web UI, reportedly in the *start VNC* handler. An attacker sends a crafted HTTP request whose parameter is passed through to a shell, and semicolons, pipes, or $() substitution give them arbitrary command execution as the web UI service — typically root. Affected: FortiSandbox 4.4.0–4.4.8, 5.0.0–5.0.5, and the FortiSandbox Cloud/PaaS 5.0.4–5.0.5 variants. Fixed in 4.4.9 and 5.0.6.
The vendor's CVSS 9.8 label is accurate and, if anything, understated for this deployment role. FortiSandbox is the detonation-and-verdict engine that FortiGate, FortiMail, FortiWeb, and FortiClient consult to decide whether a file is malicious. RCE here is not just a host takeover — it is *poisoning the truth source* the rest of the Fortinet stack trusts. With a public PoC, an EPSS in the 96th percentile, and Defused reporting active exploitation in the wild, we keep this at CRITICAL and add urgency, not friction.
4 steps from start to impact.
Locate exposed FortiSandbox web UI
Server headers and login page fingerprints. Shodan and Censys queries like http.title:"FortiSandbox" return the reachable population. Internet exposure is uncommon by design but non-zero, and internal-network attackers reach it trivially post-initial-access.- Network reachability to FortiSandbox management interface
- TLS/HTTP access to the web UI
- Best-practice deployments restrict the admin UI to a management VLAN
- Fortinet documentation recommends
trusted hostsACLs
FortiSandbox fingerprint queries; Fortinet Security Rating flags externally exposed management interfaces.Send crafted request to the vulnerable VNC handler
;, |, or $(...) embedded in a parameter that reaches a system()/exec call. No credentials, no session, no CSRF token. The public PoC at github.com/0xBlackash/CVE-2026-25089 demonstrates the request shape.- Vulnerable version (≤4.4.8 or ≤5.0.5)
- Unpatched web UI reachable
- WAF in front of the sandbox may block obvious
;idpayloads — trivially bypassed with encoding
FortiSandbox.Command.Injection released with PSIRT advisory; look for POSTs containing shell metacharacters to the VNC endpoint in web access logs.Achieve RCE as root/web-service user
- Outbound connectivity for reverse shell, or writable location for a webshell
- Egress filtering on management network can slow but not stop C2 (DNS/HTTPS tunneling still works)
Poison the verdict pipeline / pivot
- FortiSandbox integrated with FortiGate/FortiMail/FortiClient (default architecture)
- None material — this is the intended integration
The supporting signals.
| In-the-wild status | Active exploitation reported by *Defused* late-June / early-July 2026 across the FortiSandbox CVE cluster (25089, 39813, 39808). Not yet CISA KEV — expect listing imminently. |
|---|---|
| Proof of concept | Public PoC at github.com/0xBlackash/CVE-2026-25089. Reproduction is a single crafted HTTP request. |
| EPSS | 0.23393 — roughly the 96th–97th percentile. Very high forecast probability of exploitation within 30 days. |
| KEV status | Not listed as of 2026-07-17. Given active-exploitation reporting, treat *as-if* KEV. |
| 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 interaction, full CIA impact. Vendor score 9.8. |
| Affected versions | FortiSandbox 4.4.0–4.4.8, 5.0.0–5.0.5; FortiSandbox Cloud & PaaS 5.0.4–5.0.5. |
| Fixed versions | FortiSandbox 4.4.9 and 5.0.6 (and later). Cloud/PaaS auto-upgraded by Fortinet; on-prem is customer-responsibility. |
| Exposure data | Shodan http.title:"FortiSandbox" typically returns low hundreds of internet-exposed admin UIs — small population, but every one is a critical-role target. Vastly larger install base sits on internal management networks reachable post-initial-access. |
| Disclosure | Fortinet PSIRT advisory published 2026-06-09 as part of the June PSIRT bundle. |
| Root cause | CWE-78 OS command injection in the *start VNC* web UI feature; user input passed to shell without neutralization. |
noisgate verdict.
The single decisive factor is the role multiplier: FortiSandbox is the malware-adjudication engine trusted by the rest of the Fortinet stack, so unauthenticated root RCE ends in supply-chain-style verdict poisoning across every FortiGate/FortiMail/FortiClient that queries it. Active exploitation, an unauthenticated network vector, and a public PoC remove every friction argument that could pull this below CRITICAL.
Why this verdict
- Role multiplier — supply-chain-scale blast radius: FortiSandbox verdicts feed FortiGate/FortiMail/FortiClient policy decisions. Root on the sandbox lets the attacker mark their own payloads as *clean* fleet-wide. That is a supply-chain outcome inside a security-tool tier — floor is CRITICAL by the noisgate role catalog (kernel-mode / security-plane component).
- Unauthenticated + low complexity + public PoC:
AV:N/AC:L/PR:N/UI:Nwith a working exploit on GitHub means weaponization cost is effectively zero. No friction points on the initial-access side. - Active exploitation confirmed: Defused telemetry ties the FortiSandbox CVE cluster (25089/39813/39808) to in-the-wild abuse in June–July 2026. That converts the theoretical EPSS 96th-percentile risk into observed reality.
- Friction audit is thin: the only real narrowing is *is the admin UI reachable?* — best practice says no, but every red team engagement finds this UI on a flat management VLAN reachable from the user LAN. Even internal-only reachability keeps this a CRITICAL for any org where a phish gets an attacker onto the corporate network.
Why not higher?
9.6 is already at the top of the CRITICAL band. It is not a 10.0 because the internet-facing population is small (per Shodan) — most compromises will require prior corporate-network access, which sets a modest floor on attacker effort. The vendor 9.8 remains defensible; we shave 0.2 for that exposure realism.
Why not lower?
Downgrading to HIGH would require ignoring the role multiplier — FortiSandbox is a canonical security-plane component (like an EDR management server or a SIEM), and the noisgate role-multiplier rule floors it at CRITICAL when the chain ends in fleet-scale trust poisoning. Active exploitation and a public PoC independently block any friction-based downgrade.
What to do — in priority order.
- Restrict FortiSandbox web UI to a management jump host — TODAY — Use FortiSandbox
set trusted-hostson the admin account and an upstream firewall rule so the web UI is reachable only from a hardened bastion. Per the noisgate mitigation SLA for CRITICAL, this must be in place within ≤3 days; given active exploitation, do it within hours. - Block or rate-limit the VNC/start endpoint at the upstream WAF — If a Fortinet or third-party WAF fronts the UI, drop POSTs containing shell metacharacters (
;,|, backticks,$() to the VNC handler URI. Stopgap only — apply immediately, remove once the appliance is on 4.4.9 / 5.0.6. - Hunt for existing compromise before patching — Compare recent FortiSandbox verdict hit-ratio against a 90-day baseline; investigate any statistically anomalous *clean* verdicts. Review web access logs (
/log/httpd) for POSTs to the VNC endpoint with shell metacharacters since 2026-06-09. Do this before the patch reboots the appliance and rotates logs. - Rotate every credential the sandbox holds — FortiSandbox stores API keys and admin creds for peered FortiGate/FortiMail/FortiClient EMS instances. Assume-compromise: rotate those and any SMB share credentials used for sample submission within the 3-day mitigation window.
- Upgrade to FortiSandbox 4.4.9 or 5.0.6 — The remediation. Per the noisgate remediation SLA for CRITICAL, complete within ≤90 days — but given exploitation, target inside 7 days. Cloud/PaaS customers should confirm Fortinet has rolled the fix on their tenant.
- Fortinet FortiGate IPS in front of the sandbox — many deployments have the sandbox on a private subnet with no IPS on that path; verify signature coverage explicitly.
- Disabling the admin account or forcing MFA — the bug is unauthenticated, credentials are irrelevant.
- Network segmentation alone — segmentation slows lateral attackers but the same internal red team that gets to your VMware vCenter can also reach the sandbox UI on the mgmt VLAN.
- Waiting for CISA KEV listing — active exploitation is already documented; do not gate action on the KEV bureaucracy.
Crowdsourced verification payload.
Run this on an auditor workstation with reachability to the FortiSandbox management IP. Invoke as ./check_fsa_25089.sh <fsa-host> (e.g., ./check_fsa_25089.sh fsa01.corp.local). No credentials required — it pulls the version banner from the login page and matches it against the vulnerable ranges. Requires curl and awk.
#!/usr/bin/env bash
# noisgate verifier for CVE-2026-25089 (FortiSandbox unauth RCE)
# Exit: 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN
set -u
TARGET="${1:-}"
if [[ -z "$TARGET" ]]; then
echo "usage: $0 <fortisandbox-host-or-ip>"; exit 2
fi
# Grab the login page; FortiSandbox exposes its build in the HTML title / meta
RESP=$(curl -sk --max-time 10 "https://${TARGET}/login" 2>/dev/null)
if [[ -z "$RESP" ]]; then
echo "UNKNOWN: no HTTPS response from ${TARGET}"; exit 2
fi
# Version fingerprint: FortiSandbox exposes it in the page as "FortiSandbox X.Y.Z"
VER=$(printf '%s' "$RESP" | grep -oE 'FortiSandbox[[:space:]]+[0-9]+\.[0-9]+\.[0-9]+' | head -1 | awk '{print $2}')
if [[ -z "$VER" ]]; then
echo "UNKNOWN: could not fingerprint FortiSandbox version on ${TARGET}"; exit 2
fi
IFS=. read -r MAJ MIN PAT <<< "$VER"
echo "Detected FortiSandbox version: ${VER}"
# Vulnerable: 4.4.0-4.4.8, 5.0.0-5.0.5
vuln=0
if [[ "$MAJ" == "4" && "$MIN" == "4" && "$PAT" -le 8 ]]; then vuln=1; fi
if [[ "$MAJ" == "5" && "$MIN" == "0" && "$PAT" -le 5 ]]; then vuln=1; fi
# Anything older than 4.4 in supported life is also affected per advisory
if [[ "$MAJ" -lt 4 ]] || { [[ "$MAJ" == "4" ]] && [[ "$MIN" -lt 4 ]]; }; then vuln=1; fi
if [[ "$vuln" == "1" ]]; then
echo "VULNERABLE: ${VER} is in the CVE-2026-25089 affected range. Patch to 4.4.9 or 5.0.6."
exit 1
fi
echo "PATCHED: ${VER} is at or above the fixed release."
exit 0
If you remember one thing.
Sources
- Fortinet PSIRT — FG-IR-25-XXX FortiSandbox advisory
- Arctic Wolf — CVE-2026-25089 briefing
- SecPod — Breaking down CVE-2026-25089
- Help Net Security — FortiSandbox vulns under active exploitation
- Threat-Modeling.com — FortiSandbox CVE-2026-25089/26083 analysis
- Cybersecurity News — FortiSandbox vulnerability exploited
- Tenable — CVE-2026-25089 entry
- Public PoC — 0xBlackash/CVE-2026-25089
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.