PatchDay Alert

Editorial coverage · CVE-2024-55591

The token didn't matter. The origin assumption did.

FortiOS authenticated requests to `/ws/cli/` based on the request appearing to come from localhost, then trusted any value supplied as `local_access_token`. The attacker did not need to guess a secret; the attacker needed to send the request through a WebSocket proxy the architecture itself believed was a localhost caller. Two months of zero-day exploitation, super-admin CLI as the outcome, and a trust assumption that the runtime could not verify.

Editorial CVE · 3 min read By The Field Notes Desk · Field Notes

What we say

The token was the part that looked like the secret. It was not.

FortiOS’s REST API tier authenticated CLI requests by inferring that the caller was already privileged when the request appeared to come from localhost. The Node.js WebSocket module at /ws/cli/ sat in front of that REST tier and accepted any value as local_access_token because the validating tier downstream was not the layer that checked the token — it was the layer that checked the apparent origin. The WebSocket front-end’s job was to proxy external requests into the management plane. The proxying step was the step that translated an external caller into a request the REST tier read as localhost. The attacker did not need to guess a secret; the attacker needed to send the request through the front door the architecture had built to make remote management work.

This is not a string-comparison bug. It is a category of design assumption that recurs in network-edge equipment: the runtime cannot verify the property the authentication design treats as load-bearing. SAP NetWeaver’s CVE-2025-31324 carried the same shape on the Visual Composer servlet — the deployment endpoint trusted that requests were coming from authenticated developers because the developer tier was behind the portal, and the portal was the boundary the runtime believed it was inside. SharePoint’s CVE-2025-49706 carried the same shape on the ToolPane endpoint — the auth check trusted a Referer header the protocol layer cannot itself verify. CVSS scores each of these in isolation against confidentiality, integrity, and availability impact. None of those columns names the property the runtime cannot enforce. On a perimeter SSL-VPN concentrator, that property is the entire security model.

The Arctic Wolf campaign analysis traced the operational shape of the bypass post-foothold: scan, login as super-admin via the WebSocket bypass, create local accounts and SSL-VPN portal users, harvest credentials, then pivot. Forescout tied the same chain to Mora_001 and the SuperBlack ransomware build. Console Chaos and SuperBlack are the exploitation labels; the underlying pattern is that on a FortiGate the management plane was reachable from the same network the SSL-VPN terminated on, and the front-end translating external requests into internal ones did not preserve the distinction the authentication layer relied on.

The narrow remediation is the one Fortinet’s advisory describes: upgrade to 7.0.17, 7.2.11, 7.4.7, or 7.6.2, then hunt for the documented IOCs (new local admin accounts, SSL-VPN portal-user changes that do not reconcile against change tickets, the symlink persistence mechanism Fortinet later addressed under CVE-2024-21762’s post- exploitation advisory). The single upgrade on the 7.0.x branch closes this CVE, CVE-2025-24472, and the symlink backdoor in one step — which is the rare case where applying the patch is also the cleanup, and only because researcher pressure forced disclosure of the persistence mechanism alongside the bug. The companion field note covers the five-CVE-in-twenty-eight-months pattern in full, including the silent-patching disclosure failures and the persistence problem that survives the upgrade itself.

The wider lesson is that the perimeter appliance class shares the trust-origin assumption FortiOS made here. Ivanti Connect Secure’s CVE-2024-21887 chained an auth-bypass with a command-injection on the same logic. PAN-OS’s CVE-2024-3400 reached a CVSS 10.0 because the GlobalProtect portal trusted a session-cookie path the portal itself controlled. Cisco ASA’s recurring web-VPN CVEs sit on the same family. The score column rates the bug; it does not rate the trust assumption the bug invalidates. Until the advisory ecosystem starts naming the assumption alongside the CVSS vector, the next perimeter bug will read the same way as this one.

What NVD says

CWE-288 — authentication bypass using an alternate path or channel. CVSS 3.1 base 9.8 Critical, vector AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H. Authentication bypass in the Node.js WebSocket module of FortiOS 7.0.0–7.0.16 and FortiProxy 7.0.0–7.0.19 / 7.2.0–7.2.12, allowing a remote unauthenticated attacker to obtain super-admin privileges via crafted requests to the management interface. NVD names the bug class and the affected versions. The record carries no field for the design assumption under the CWE — that authentication trusted an apparent request origin the protocol layer cannot itself verify. The score is the same whether the bug is a missed string compare or a structural identity-origin failure; the operational difference is most of the story.

NVD entry →

What the vendor says

Fortinet's PSIRT advisory FG-IR-24-535 was published January 14, 2025 and shares a single page with CVE-2025-24472. The fixed releases are FortiOS 7.0.17, 7.2.11, 7.4.7, and 7.6.2, plus FortiProxy 7.0.20 and 7.2.13. Fortinet's text describes the vulnerability as 'authentication bypass using an alternate path' and lists indicators-of-compromise. It does not name the design assumption: that the REST API tier inferred caller identity from request origin, and that the WebSocket front-end was capable of presenting external requests as localhost-originated. Arctic Wolf and Forescout documented zero-day exploitation beginning mid-November 2024 — two months before the advisory shipped. CVE-2025-24472, patched in the same release, was not publicly disclosed until February 11; the silent-patching pattern is the longer pattern the companion field note covers in full.

Compliance impact

PCI DSS
Requirement 1 of PCI DSS v4.0 governs network security controls — the firewall and SSL-VPN that segment the cardholder data environment are the controls Requirement 1.4 names. A pre-authentication super-admin bypass on the management plane of a FortiGate scoped into the CDE means an attacker can write rules, disable logging, and add accounts on the device that defines the segmentation boundary. Requirement 10.7 obliges restoration of audit-trail integrity after a compromise; the Arctic Wolf 'Console Chaos' campaign documented credential harvesting and account creation as standard post-bypass steps. A QSA reading the November 2024 to January 2025 exposure window against a FortiGate inside CDE scope will ask for the device's full configuration-change history reconciled against authorized change tickets, plus log evidence the device was not compromised before the audit window began.
FEDRAMP
FedRAMP cloud authorizations bind SI-2 (flaw remediation) and CA-7 (continuous monitoring) to known-exploited vulnerabilities through BOD 22-01 and the KEV catalog. CISA added CVE-2024-55591 to KEV on January 14, 2025 with a federal due date of January 21 — a seven-day window from advisory publication. FedRAMP-authorized cloud providers running FortiGate as an in-boundary network device must show the patch applied or a temporary plan of action and milestones (POA&M) entry inside that window. The challenge for FedRAMP'd operators is the same as for FCEB agencies: SSL-VPN concentrators that mediate administrator access to the production environment are not single-host upgrades — they sit underneath remote-access workflows, MFA integrations, and split-tunneling rules that change behavior across a version step. The audit narrative the 3PAO will want is the change-record showing the boundary device was patched and the IOCs were hunted across the management plane during the period the device was internet-reachable on a vulnerable build.

Sources

Every source on this list has been read by the editorial team. We do not cite something we have not opened.

Deeper read

Coverage in PatchDay Alert

One email, every weekday morning.

You're in. Check your inbox.

Get the digest

Free. Weekday mornings. Plain English CVE triage.

Check your inbox to confirm.