CVE-2026-35616

CVE-2026-35616 — Fortinet FortiClient EMS Improper Access Control Exploitation

Detects exploitation attempts targeting CVE-2026-35616, an improper access control vulnerability (CWE-284) in Fortinet FortiClient Enterprise Management Server (EMS). This vulnerability is listed in CISA's Known Exploited Vulnerabilities catalog, indicating active exploitation in the wild. Attackers may leverage this flaw to bypass access controls on the EMS server, potentially enabling unauthorized configuration changes, endpoint agent manipulation, or lateral movement through managed endpoints.

Vulnerability Intelligence

KEV — Known Exploited

Affected Software

Vendor
Fortinet
Product
FortiClient EMS

Weakness (CWE)

Timeline

Disclosed
April 6, 2026

CVSS

9.8
Critical (9.0–10)

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Write-up coming soon

What is CVE-2026-35616 CVE-2026-35616 — Fortinet FortiClient EMS Improper Access Control Exploitation?

CVE-2026-35616 — Fortinet FortiClient EMS Improper Access Control Exploitation (CVE-2026-35616) maps to the Initial Access and Persistence and Privilege Escalation and Lateral Movement tactics — the adversary is trying to get into your network in MITRE ATT&CK.

This page provides production-ready detection logic for CVE-2026-35616 — Fortinet FortiClient EMS Improper Access Control Exploitation, covering the data sources and telemetry it touches: CommonSecurityLog, DeviceEvents, AzureActivity. The queries below are rated critical severity at medium confidence, and ship for 7 SIEM platforms — KQL, SPL, Elastic, QRadar, Sumo, YARA-L, LogScale.

MITRE ATT&CK

Tactic
Initial Access Persistence Privilege Escalation Lateral Movement
Microsoft Sentinel / Defender
kusto
union
(
    CommonSecurityLog
    | where TimeGenerated > ago(7d)
    | where DeviceVendor =~ "Fortinet"
    | where DeviceProduct has_any ("FortiClient", "EMS", "FortiClient EMS")
    | where Activity has_any ("access denied", "authorization failure", "improper access", "privilege escalation", "unauthorized", "access control bypass")
    | project TimeGenerated, DeviceVendor, DeviceProduct, Activity, SourceIP, DestinationIP, DestinationPort, RequestURL, AdditionalExtensions, Message
),
(
    DeviceEvents
    | where TimeGenerated > ago(7d)
    | where InitiatingProcessFileName has_any ("FortiEMSAgent", "fcems", "fcemsvc")
    | where ActionType has_any ("ProcessCreated", "NetworkConnectionInspected", "RegistryValueSet")
    | project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, ActionType, RemoteIP, RemotePort, RegistryKey
),
(
    AzureActivity
    | where TimeGenerated > ago(7d)
    | where Properties has "FortiClient"
    | where ActivityStatus =~ "Failed"
    | project TimeGenerated, Caller, CallerIpAddress, OperationName, ResourceGroup, ActivityStatus, Properties
)
| sort by TimeGenerated desc

Hunts for CVE-2026-35616 exploitation signals across Fortinet CommonSecurityLog events, endpoint device events involving FortiClient EMS processes, and Azure activity anomalies. Surfaces access control failures, unauthorized requests, and abnormal process behaviour on EMS-managed hosts.

critical severity medium confidence

Data Sources

CommonSecurityLog DeviceEvents AzureActivity

Required Tables

CommonSecurityLog DeviceEvents AzureActivity

False Positives

  • Legitimate FortiClient EMS administrative operations generating access-denied log entries during policy re-evaluation
  • Routine endpoint health checks or agent updates that briefly trigger authorization warnings
  • Penetration testing or red team exercises against EMS infrastructure with prior written authorisation
  • Misconfigured EMS policies causing legitimate users to hit access control boundaries during normal operations

Sigma rule & cross-platform mapping

The detection logic for CVE-2026-35616 — Fortinet FortiClient EMS Improper Access Control Exploitation (CVE-2026-35616) above is provided in a vendor-neutral form so you can deploy it on any SIEM. The same logic is shipped here as native KQL (Microsoft Sentinel / Defender), SPL (Splunk), Elastic (Elastic Security (EQL)), QRadar (IBM QRadar (AQL)), Sumo (Sumo Logic CSE), YARA-L (Google Chronicle / SecOps), LogScale (CrowdStrike LogScale (CQL)) queries. In Sigma terms, this detection targets the following logsource:

logsource:
  product: azure

Browse the community-maintained Sigma rules for this technique:


Testing Methodology

Validate this detection against 4 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.

  1. Test 1FortiClient EMS Unauthenticated API Endpoint Probe

    Expected signal: Web server access log entries on EMS showing HTTP requests to API paths from an unknown source IP, with response codes logged. Network flow records show connections from test host to EMS port 8013.

  2. Test 2FortiClient EMS Privilege Escalation via Access Control Bypass (Simulated)

    Expected signal: EMS audit log entries recording the low-privilege user's access attempts to admin-tier endpoints. Windows Security Event Log 4648 if token acquisition involved explicit credential use.

  3. Test 3FortiClient EMS Management Port Reconnaissance from External Network Segment

    Expected signal: Network IDS/IPS alerts for port scan activity targeting EMS management ports. Firewall deny logs if EMS ports are restricted. NetFlow records showing probe connections from test segment to EMS IP.

  4. Test 4FortiClient Agent Mass Policy Modification via Compromised EMS

    Expected signal: EMS audit log entry recording policy creation event with the admin token's associated username. API access log entry for POST to /api/v1/policies. Managed endpoint logs showing receipt of new policy push if EMS propagates it.


Response Playbook

Triage

  1. Identify the FortiClient EMS server version(s) in your environment and cross-reference against Fortinet's PSIRT advisory FG-IR-26-099 to confirm whether installed versions are within the affected range.
  2. Review FortiClient EMS server logs (typically under /var/log/ems/ or the EMS web console audit log) for anomalous access patterns: repeated authentication failures, unexpected API calls, or access from unknown source IPs within the last 72 hours.
  3. Correlate EMS log anomalies with network flow data to identify any unusual inbound connections to EMS management ports (default 8013, 8014, 443) from IPs not in your approved management allowlist.
  4. Check the EMS console for any unauthorised policy changes, new endpoint group memberships, rogue endpoint registrations, or configuration modifications that cannot be attributed to known administrators.
  5. Assess whether the EMS server is internet-exposed or reachable from untrusted network segments — exposure significantly elevates risk given KEV status.

Containment

  1. If exploitation is confirmed or strongly suspected, immediately isolate the FortiClient EMS server from the network (remove from DMZ or restrict via firewall ACL to management-only CIDRs) to prevent further attacker interaction with managed endpoints.
  2. Revoke and rotate all EMS administrator credentials, API tokens, and service account passwords. Audit all EMS admin accounts for unauthorised additions and disable any unrecognised accounts immediately.
  3. Apply Fortinet's official patch or workaround from FG-IR-26-099 on an emergency basis, following your organisation's emergency change process. Confirm patch integrity via Fortinet's published hash before deployment.

Evidence Collection

  1. Preserve EMS server audit logs, application logs, and web server access logs to an immutable, analyst-controlled location before any remediation that could overwrite them. Include at minimum the 7 days prior to detection.
  2. Capture a memory image and disk snapshot of the FortiClient EMS server if active compromise is suspected, to support forensic investigation of any persistence mechanisms, webshells, or dropped binaries.
  3. Export network flow records (NetFlow/IPFIX) and firewall connection logs for the EMS server's IP for the same 7-day window to reconstruct attacker reconnaissance and lateral movement paths.

Escalation Criteria

  • ! Escalate to incident response leadership immediately if evidence of post-exploitation activity is found: e.g., new admin accounts on EMS, modified endpoint policies deploying malicious scripts, or C2 traffic originating from EMS-managed endpoints.
  • ! Escalate and invoke crisis communications if the FortiClient EMS server manages endpoints across multiple business units or client environments, given the potential for the vulnerability to be used as a pivot point for wide-scale lateral movement or ransomware deployment.

Investigation Guide

Forensic Artifacts

  • > FortiClient EMS audit log entries (EMS web console → Logs → Audit) showing access events from unexpected source IPs or usernames around the time of suspected exploitation
  • > Web server access logs on the EMS host (Apache/nginx) showing unusual HTTP methods, paths, or status codes — particularly 200 responses to paths that should require elevated privileges
  • > Windows Event Log (if EMS runs on Windows Server): Event ID 4625 (failed logon), 4648 (explicit credential logon), and 4720 (new account created) on the EMS host
  • > Network capture or flow records showing connections to EMS management ports (8013, 8014) from IPs outside the management allowlist
  • > File system changes on EMS server — new files in web root, scheduled tasks, registry run keys, or services created after the exploitation window

Tuning Guidance

Start by establishing a baseline of legitimate EMS management source IPs and admin usernames, then scope detection to flag events from sources outside that baseline. EMS environments with frequent policy pushes or large endpoint fleets will generate higher volumes of access events — set minimum event-count thresholds (e.g., >=3 failures per 15 minutes from a single source) to reduce noise. If your EMS is only accessible from a dedicated jump host or management VLAN, add a NOT condition excluding those known-good CIDRs. Tune severity field values in EMS logs to match your vendor version's log schema — field names and values may differ between EMS versions. Disable or suppress detections during approved maintenance windows where bulk agent reconnects are expected.


Hunting Queries

30-day retrohunt for persistent low-volume access control failures from single source IPs against FortiClient EMS, which may indicate slow-and-low exploitation attempts or adversary reconnaissance ahead of a more aggressive exploitation phase.

Hunting — KQL
kql
CommonSecurityLog
| where TimeGenerated > ago(30d)
| where DeviceVendor =~ "Fortinet"
| where DeviceProduct has_any ("EMS", "FortiClient")
| summarize EventCount=count(), UniqueSources=dcount(SourceIP), FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated) by SourceIP, Activity
| where EventCount > 5 and UniqueSources < 3
| order by EventCount desc
Hunting — SPL
spl
index=* sourcetype="fortinet:ems" earliest=-30d
| stats count AS hit_count, dc(src_ip) AS unique_sources, min(_time) AS first_seen, max(_time) AS last_seen BY src_ip, action
| where hit_count > 5 AND unique_sources < 3
| sort - hit_count

Atomic Red Team Tests

Test 1 FortiClient EMS Unauthenticated API Endpoint Probe
linux

Simulates an attacker probing FortiClient EMS API endpoints without valid credentials to identify endpoints affected by the improper access control vulnerability. Lab use only — requires a test EMS instance.

Command

bash
TARGET_EMS="http://ems-lab.local:8013"; for ENDPOINT in /api/v1/endpoints /api/v1/policies /api/v1/users /api/v1/config; do echo "[*] Probing $ENDPOINT"; curl -sk -o /dev/null -w "%{http_code} $ENDPOINT\n" "${TARGET_EMS}${ENDPOINT}"; done

Cleanup

bash
No cleanup required — read-only probe with no side effects on the target.

Expected Telemetry

Web server access log entries on EMS showing HTTP requests to API paths from an unknown source IP, with response codes logged. Network flow records show connections from test host to EMS port 8013.

Expected Detection

CommonSecurityLog or EMS audit log entries showing repeated API access attempts from an unknown source IP, triggering the access failure pattern rules.

Test 2 FortiClient EMS Privilege Escalation via Access Control Bypass (Simulated)
windows

Simulates an authenticated low-privileged user attempting to access administrative EMS API endpoints that should be restricted to admin roles, testing whether access control enforcement is effective.

Command

powershell
$EMS_URL = 'https://ems-lab.local'; $LowPrivToken = 'REPLACE_WITH_LOWPRIV_TOKEN'; $AdminEndpoints = @('/api/v1/admin/config', '/api/v1/admin/users', '/api/v1/admin/policies/global'); foreach ($ep in $AdminEndpoints) { $resp = Invoke-WebRequest -Uri "$EMS_URL$ep" -Headers @{Authorization="Bearer $LowPrivToken"} -SkipCertificateCheck -ErrorAction SilentlyContinue; Write-Output "$ep -> $($resp.StatusCode)" }

Cleanup

powershell
Remove test user token from EMS after testing. No persistent changes made to EMS configuration.

Expected Telemetry

EMS audit log entries recording the low-privilege user's access attempts to admin-tier endpoints. Windows Security Event Log 4648 if token acquisition involved explicit credential use.

Expected Detection

EMS access denial events for the test user's requests to admin endpoints, surfaced by Splunk or Sentinel queries filtering on authorization failure patterns.

Test 3 FortiClient EMS Management Port Reconnaissance from External Network Segment
linux

Simulates adversary network reconnaissance against FortiClient EMS management ports from a network segment that should not have access, testing both network controls and detection coverage.

Command

bash
TARGET="ems-lab.local"; nmap -sV -p 443,8013,8014,10443 --script http-title,http-headers "$TARGET" -oN /tmp/ems_recon_$(date +%Y%m%d_%H%M%S).txt; echo '[*] Scan complete. Results saved.'

Cleanup

bash
rm -f /tmp/ems_recon_*.txt

Expected Telemetry

Network IDS/IPS alerts for port scan activity targeting EMS management ports. Firewall deny logs if EMS ports are restricted. NetFlow records showing probe connections from test segment to EMS IP.

Expected Detection

Network-layer detection rules alerting on port scanning of known EMS management ports from unauthorised network segments. Chronicle or QRadar correlation rules for reconnaissance-followed-by-access-failure patterns.

Test 4 FortiClient Agent Mass Policy Modification via Compromised EMS
linux

Simulates post-exploitation scenario where an attacker with access to EMS attempts to push a modified policy to all managed endpoints, which could be used to deploy malicious configurations or disable security controls at scale.

Command

bash
EMS_URL='https://ems-lab.local'; ADMIN_TOKEN='REPLACE_WITH_ADMIN_TOKEN'; curl -sk -X POST "$EMS_URL/api/v1/policies" -H "Authorization: Bearer $ADMIN_TOKEN" -H 'Content-Type: application/json' -d '{"name": "ATOMIC_TEST_POLICY", "description": "Test policy - delete after atomic test", "endpoints": "all"}' | python3 -m json.tool

Cleanup

bash
Manually delete the ATOMIC_TEST_POLICY from EMS console under Endpoint Policy > Policy Management after test completion.

Expected Telemetry

EMS audit log entry recording policy creation event with the admin token's associated username. API access log entry for POST to /api/v1/policies. Managed endpoint logs showing receipt of new policy push if EMS propagates it.

Expected Detection

EMS audit log monitoring rule detecting unexpected policy creation outside of approved change windows, or policy creation by an account not in the authorised policy-admin group.

Related Detections