Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-35616 — Detection toolkit for CVE-2026-35616, a pre-authentication API bypass in FortiClient EMS. Includes Python scanner and Nmap NSE script for identifying vulnerable versions and providing remediation guidance. | Kitploit
Tools/GitHubGitHub/keraattin/cve-2026-35616
Vulnerability ScannersVulnerability AnalysisExploitationInformation GatheringWeb SecurityNetwork SecurityPenetration TestingAuthentication
GitHubkeraattin/cve-2026-35616

CVE-2026-35616

Detection toolkit for CVE-2026-35616, a pre-authentication API bypass in FortiClient EMS. Includes Python scanner and Nmap NSE script for identifying vulnerable versions and providing remediation guidance.

12175 months agoNot yet reviewed
View Repository

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-35616 - FortiClient EMS Pre-Authentication API Bypass to RCE

CVE-2026-35616 CVSS 9.1 CISA KEV CWE-284

TL;DR

A critical authentication bypass in Fortinet FortiClient EMS 7.4.5 and 7.4.6 allows a completely unauthenticated, remote attacker to bypass API authentication by spoofing a single HTTP header (X-SSL-CLIENT-VERIFY). The flaw exists because the Django middleware trusts client certificate metadata from user-controlled headers, not just from the trusted reverse proxy. This gives attackers full administrative API access - and from there, arbitrary code execution on managed endpoints across the enterprise.

Actively exploited since March 31, 2026. Added to CISA KEV on April 6, 2026.


Table of Contents

  • Quick Facts
  • What is FortiClient EMS?
  • Vulnerability Deep Dive
    • The Architecture
    • Where It Breaks
    • The Attack Flow
  • Impact Analysis
  • Affected Versions
  • Exploitation Timeline
  • Detection
    • Python Scanner
    • Nmap NSE Script
    • Manual Verification
  • Indicators of Compromise
  • Remediation
  • References
  • Author

Quick Facts

FieldDetail
CVE IDCVE-2026-35616
VendorFortinet
ProductFortiClient Enterprise Management Server (EMS)
Affected Versions7.4.5, 7.4.6
Not Affected7.2.x branch, 7.4.4 and earlier
CVSS v3.19.1 (Critical)
CWECWE-284 - Improper Access Control
Attack VectorNetwork
AuthenticationNone required
User InteractionNone
Exploit MaturityExploited in the wild
CISA KEVAdded April 6, 2026 (deadline: April 9, 2026)
PatchHotfix available; full fix in 7.4.7
Credited ToSimo Kohonen (Defused Cyber), Nguyen Duc Anh

What is FortiClient EMS?

FortiClient Enterprise Management Server (EMS) is Fortinet's centralized endpoint management platform. It serves as the command-and-control layer for deploying, configuring, and monitoring FortiClient agents across an organization. Think of it as the brain that governs every endpoint in a Fortinet-managed environment:

  • Pushes security policies and VPN profiles to endpoints
  • Manages endpoint compliance and posture checks
  • Distributes software updates and patches
  • Integrates with FortiGate firewalls for Zero Trust Network Access (ZTNA)
  • Stores and manages endpoint telemetry, certificates, and credentials

When an attacker gains administrative access to EMS, they essentially own the keys to every managed endpoint in the organization.


Vulnerability Deep Dive

The Architecture

FortiClient EMS uses a fairly standard web application stack behind the scenes:

+----------------+          +----------------+          +----------------+
|   Browser /    |  HTTPS   |    Apache      |   WSGI   |    Django      |
|   API Client   | -------> |   (mod_ssl)    | -------> |    Backend     |
+----------------+          +----------------+          +----------------+

When mutual TLS (mTLS) is configured, Apache's mod_ssl handles the client certificate verification. After validating the certificate, Apache passes the verification result downstream to Django through trusted WSGI environment variables:

  • SSL_CLIENT_VERIFY - The verification status (SUCCESS, NONE, FAILED)
  • SSL_CLIENT_S_DN - The Subject Distinguished Name from the certificate
  • SSL_CLIENT_SERIAL - The certificate serial number

This is the standard and secure pattern. The problem is in how the Django middleware reads this data.

Where It Breaks

In FortiClient EMS 7.4.5 and 7.4.6, the Django authentication middleware was modified to also accept this same information from HTTP request headers:

  • X-SSL-CLIENT-VERIFY
  • X-SSL-CLIENT-S-DN
  • X-SSL-CLIENT-SERIAL

This was likely added to support reverse proxy deployments where Apache isn't the TLS termination point. However, the middleware doesn't distinguish between these two sources. It checks the WSGI variables first, but if they're absent (no mTLS configured, or a direct connection), it falls back to the HTTP headers - which any client can set.

Here's the conceptual breakdown:

SECURE PATH (intended):
  Apache mod_ssl validates cert --> sets WSGI env vars --> Django reads env vars  [OK]

INSECURE PATH (the vulnerability):
  Attacker sets HTTP headers directly --> Django reads headers --> Trusts them  [FAIL]

The middleware effectively trusts the client to self-attest their own certificate verification status. That's like a bouncer asking someone "Hey, did the other bouncer already check your ID?" and letting them in when they say "yes."

The Attack Flow

Step 1: Attacker sends a POST request to an EMS API endpoint
        with these headers:
        
        X-SSL-CLIENT-VERIFY: SUCCESS
        X-SSL-CLIENT-S-DN: CN=admin
        X-SSL-CLIENT-SERIAL: 0000000000000001

Step 2: Django middleware checks for WSGI env vars → not present
        Falls back to HTTP headers → finds X-SSL-CLIENT-VERIFY: SUCCESS

Step 3: Middleware treats request as authenticated with admin identity

Step 4: Attacker has full administrative API access

Step 5: From the admin API, attacker can:
        - Push malicious policies to all managed endpoints
        - Extract stored credentials and certificates
        - Deploy payloads via software distribution
        - Modify ZTNA configurations
        - Pivot into the broader network

The entire attack requires a single HTTP request. No brute-forcing, no credential stuffing, no social engineering. Just one forged header.


Impact Analysis

The severity here goes beyond the server itself. FortiClient EMS is a force multiplier - compromising it gives an attacker leverage over every managed endpoint:

Immediate Impact:

  • Full administrative control over the EMS console
  • Access to all stored endpoint configurations, credentials, and certificates
  • Ability to read/modify/delete endpoint policies
  • Access to VPN configurations and ZTNA settings

Downstream Impact (via managed endpoints):

  • Malware deployment to all managed devices via software distribution
  • Credential harvesting from endpoint telemetry
  • Disable or weaken security controls on all managed endpoints
  • Lateral movement via VPN/ZTNA configuration manipulation
  • Persistent backdoor access through policy-based payload delivery

Enterprise Risk:

  • In a typical enterprise deployment, EMS manages hundreds to thousands of endpoints
  • A single exploited EMS instance can lead to organization-wide compromise
  • FortiClient EMS is often positioned in a trusted network zone with broad access

Affected Versions

VersionStatus
FortiClient EMS 7.4.6Vulnerable
FortiClient EMS 7.4.5Vulnerable
FortiClient EMS 7.4.4 and earlierNot affected
FortiClient EMS 7.2.xNot affected

Exploitation Timeline

Download Tool