
CVE-2026-35616の非破壊スキャナ。FortiClient EMSの事前認証APIバイパスです。SSLヘッダーを偽装した場合としない場合のHTTP応答を比較して脆弱性を検出し、Python標準ライブラリのみを使用します。
FortiClient EMS サーバーが CVE-2026-35616 に対して脆弱かどうかを、サービスを中断させることなく安全に検出します。Bishop Fox ブログの完全な解説記事もご覧ください。
CVE-2026-35616 は FortiClient EMS 7.4.5 および 7.4.6 における事前認証 API バイパスであり、リモートの認証されていない攻撃者が HTTP ヘッダースプーフィングを通じて証明書ベースの認証をバイパスできるようにします。Django アプリケーションは、ユーザーが制御可能な HTTP ヘッダー(X-SSL-CLIENT-VERIFY、X-SSL-CLIENT-CERT)を Apache mod_ssl の WSGI 環境変数と同等のものとして信頼し、Apache 構成はそれらを決して除去しません。これに、Distinguished Name の文字列一致のみを実行する(暗号署名の検証を行わない)証明書チェーン検証が組み合わさることで、攻撃者は証明書を偽造し、認証済み API アクセスを取得できます。Fortinet は実環境での悪用を確認しています。
このツールは、以下の方法で非破壊的な脆弱性テストを実施します:
/api/v1/fabric_device_auth/fortigate/init にベースライン POST を送信するX-SSL-CLIENT-VERIFY: SUCCESS を含むが証明書データを含まない同一の POST を送信する証明書 PEM データなしで verify ヘッダーを送信すると検出パスがトリガーされますが、証明書チェーンが提供されないため認証はできません。サーバーは安定した状態を維持し、接続を処理し続けることができます。
contains_certificate()validate_cert_chain()RequestHeader unset ディレクティブが追加されるためです。INCONCLUSIVE の結果を報告します。git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
外部依存関係はありません。スキャナーは Python 標準ライブラリのモジュールのみを使用します。
<TARGET>:<PORT> の FortiClient EMS サーバーをテストします。デフォルトポートは 443/TCP です。
python3 CVE-2026-35616-check.py <TARGET> [PORT]
$ python3 CVE-2026-35616-check.py 192.168.1.1
======================================================================
FortiClient EMS CVE-2026-35616 Vulnerability Scanner
Non-Destructive Detection
======================================================================
[*] Target: 192.168.1.1:443
[*] Testing for CVE-2026-35616 (non-destructive)
[1] Sending baseline POST (no spoof headers)... HTTP 401
[2] Sending POST with X-SSL-CLIENT-VERIFY: SUCCESS... HTTP 500
[*] Analyzing responses...
[+] Baseline: 401 — Certificate not found in request header.
[+] Spoofed: 500 — Server encountered an error, please try again later.
[!] Spoofed header changed server behavior
[!] X-SSL-CLIENT-VERIFY is reaching Django (hotfix not applied)
======================================================================
RESULT: VULNERABLE to CVE-2026-35616
Affected versions: FortiClient EMS 7.4.5 - 7.4.6
Recommendation: Apply Fortinet hotfix or upgrade to 7.4.7+
======================================================================
$ python3 CVE-2026-35616-check.py 192.168.1.1
======================================================================
FortiClient EMS CVE-2026-35616 Vulnerability Scanner
Non-Destructive Detection
======================================================================
[*] Target: 192.168.1.1:443
[*] Testing for CVE-2026-35616 (non-destructive)
[1] Sending baseline POST (no spoof headers)... HTTP 401
[2] Sending POST with X-SSL-CLIENT-VERIFY: SUCCESS... HTTP 401
[*] Analyzing responses...
[+] Baseline: 401 — Certificate not found in request header.
[+] Spoofed: 401 — Certificate not found in request header.
[-] Responses identical (header stripped by Apache)
======================================================================
RESULT: NOT VULNERABLE (hotfix applied)
Apache is stripping X-SSL-CLIENT-VERIFY before it reaches Django
======================================================================
このツールは、以下の条件がすべて満たされた場合にのみ脆弱性を検出できます:
/api/v1/fabric_device_auth/fortigate/init エンドポイントが存在し、cert_chain_approved 認証を使用しているいずれかの条件が満たされない場合、ツールは INCONCLUSIVE の結果を報告します。
このコードは MIT ライセンス の下で配布されています。
本ツールを事前の相互同意なしにターゲットへの攻撃に使用することは違法です。適用されるすべての地域、州、連邦の法律を遵守する責任はエンドユーザーにあります。開発者は一切の責任を負わず、本プログラムによって引き起こされた誤用や損害について責任を負いません。