CVE-2025-64446 Sumo Logic CSE · Sumo

Detect CVE-2025-64446: Fortinet FortiWeb Path Traversal Exploitation in Sumo Logic CSE

Detects exploitation attempts targeting CVE-2025-64446, a path traversal vulnerability (CWE-23) in Fortinet FortiWeb. This vulnerability allows attackers to traverse directory boundaries and access files outside the intended web root, potentially exposing sensitive configuration files, credentials, or system files. The vulnerability is listed in CISA KEV indicating active exploitation in the wild.

MITRE ATT&CK

Tactic
Initial Access Defense Evasion Discovery

Sumo Detection Query

Sumo Logic CSE (Sumo)
sql
_sourceCategory=fortinet/fortiWeb OR _sourceCategory=network/fortiWeb
| parse field=_raw "url=*" as url nodrop
| parse field=_raw "request_url=*" as request_url nodrop
| parse field=_raw "uri=*" as uri nodrop
| eval url = lower(coalesce(url, request_url, uri, ""))
| where url matches "*../*" or url matches "*..\\*" or url matches "*%2e%2e%2f*" or url matches "*..%2f*" or url matches "*%2e%2e%5c*" or url matches "*%252e%252e*" or url matches "*etc/passwd*" or url matches "*etc/shadow*" or url matches "*web.config*" or url matches "*proc/self*" or url matches "*..../*"
| parse field=_raw "srcip=*" as src_ip nodrop
| parse field=_raw "dstip=*" as dst_ip nodrop
| count by src_ip, url, _sourceCategory
| where _count >= 1
| sort by _count desc
critical severity medium confidence

Sumo Logic query for Fortinet FortiWeb path traversal detection. Parses URL fields from raw FortiWeb log entries and identifies traversal patterns including percent-encoded variants, aggregating by source IP to highlight repeated attempts.

Data Sources

Fortinet FortiWebSyslog

Required Tables

_sourceCategory=fortinet/fortiWeb

False Positives & Tuning

  • Legitimate security scanning tools authorized to test web applications behind FortiWeb
  • Log parsing artifacts from non-standard FortiWeb log formats creating false URL matches
  • CDN or proxy services that modify URLs before FortiWeb inspection creating apparent traversal sequences
  • FortiWeb management interface access using paths that resemble traversal patterns

Other platforms for CVE-2025-64446


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 1Basic Path Traversal Against FortiWeb-Protected Endpoint

    Expected signal: FortiWeb access log entry with the traversal URL, source IP, HTTP method GET, and either a 403 block response (if WAF in block mode) or 200/redirect if in monitor mode. SIEM should receive a CommonSecurityLog or syslog event within 60 seconds.

  2. Test 2URL-Encoded Path Traversal (Double Encoding)

    Expected signal: Multiple FortiWeb log entries with percent-encoded URL paths. SIEM events should show the encoded traversal sequences in RequestURL or Message fields. Attack log should show WAF signature matches for each encoded variant.

  3. Test 3Traversal Targeting FortiWeb Configuration or Certificate Files

    Expected signal: FortiWeb access and attack logs showing four separate requests targeting sensitive paths. Response codes expected to be 403 if blocking mode is active. SIEM should receive all four events and score the requests with TargetsSensitiveFile=true, raising FinalScore to critical threshold.

  4. Test 4Automated Traversal Fuzzing Simulation

    Expected signal: Burst of 8 FortiWeb log events from the same source IP within 10 seconds, each containing traversal patterns. SIEM correlation rules should group these by source IP and escalate based on repeat attempts.


Response Playbook

Triage

  1. Identify the source IP and confirm it is external or an unexpected internal host — check whether it corresponds to a known authorized scanner, penetration tester, or threat actor by cross-referencing threat intelligence feeds and IP reputation databases.
  2. Review the full request URL and HTTP response code in FortiWeb logs to determine whether the traversal attempt was blocked by the WAF policy or succeeded (HTTP 200 with non-trivial response body size suggests success).
  3. Determine which path was targeted: if the traversal targeted /etc/passwd, /etc/shadow, SSL certificates, FortiWeb configuration files, or application credentials, treat as confirmed high-severity incident requiring immediate escalation.
  4. Check FortiWeb WAF policy enforcement mode — if the device was in detection-only or monitor mode rather than blocking mode, the attack may have passed through to the backend application.
  5. Correlate source IP activity across all network logs for the same time window to identify lateral movement, data exfiltration, or follow-on exploitation attempts (e.g., credential use, reverse shell callbacks).

Containment

  1. If exploitation is confirmed or the FortiWeb WAF was in monitor mode, immediately block the source IP at the perimeter firewall and on the FortiWeb access control policy, and isolate the FortiWeb appliance management interface from untrusted networks.
  2. Apply the Fortinet-issued patch for CVE-2025-64446 immediately — reference FG-IR-25-910 for the patch package — and if patching cannot occur immediately, configure a virtual patch rule in FortiWeb to block requests containing traversal sequences targeting sensitive paths.
  3. Rotate all credentials and secrets accessible from the FortiWeb appliance file system, including SSL private keys, API tokens, LDAP bind credentials, and any application credentials stored in FortiWeb configuration files.

Evidence Collection

  1. Capture and preserve full FortiWeb access and attack logs for the affected time window, including raw syslog exports, before any log rotation occurs. Archive to tamper-evident storage.
  2. Collect FortiWeb configuration snapshots, including virtual server definitions, WAF policies, and server pool configurations, to establish what backend applications and paths were potentially exposed.
  3. If the FortiWeb appliance is accessible for forensic investigation, collect running process list, network connection state, authentication logs, and any files with recent modification timestamps in web-accessible directories.

Escalation Criteria

  • !Escalate immediately to incident response if any traversal request returned HTTP 200 with a response body size consistent with the targeted file (e.g., /etc/passwd typically 1-4 KB), indicating successful file disclosure.
  • !Escalate if post-exploitation activity is observed from the same source IP, including authentication attempts using credentials that may have been disclosed, outbound connections to C2 infrastructure, or lateral movement within the network segment.

Investigation Guide

Related Techniques

Forensic Artifacts

  • >FortiWeb access logs containing raw HTTP request URLs with traversal sequences, response codes, and response sizes
  • >FortiWeb attack logs with WAF policy match records, block/allow action, and attack signature IDs
  • >Network packet captures (PCAP) on the FortiWeb management or traffic interface capturing the full HTTP request and response payload
  • >FortiWeb configuration backup files to identify what credentials and certificates were potentially exposed
  • >System file modification timestamps on FortiWeb for any files in web-accessible paths that changed during or after the attack window

Tuning Guidance

Start with high-confidence tuning by adding known authorized scanner IP ranges (Qualys, Tenable, Rapid7 cloud scanner CIDRs) to an allowlist exclusion. If the environment uses legitimate URL rewriting that produces traversal-like sequences, capture those specific patterns and exclude them by exact match. Adjust the traversal depth threshold (default 1) upward to 2 or 3 in environments where single-depth traversal generates excessive false positives from proxies or CDNs. For SPL and KQL, create a lookup table of approved pentest source IPs that can be excluded during authorized engagement windows. Monitor the ratio of blocked to allowed traversal attempts in FortiWeb WAF logs — if the WAF is blocking all attempts, consider reducing alert severity to medium for blocked events while maintaining critical for any allowed traversal responses.


Hunting Queries

7-day retrospective hunt for source IPs conducting repeated path traversal attempts against FortiWeb, identifying potential reconnaissance or persistent exploitation campaigns that may have predated the detection rule deployment.

Hunting — KQL
kql
CommonSecurityLog
| where DeviceVendor == "Fortinet" and DeviceProduct == "FortiWeb"
| where TimeGenerated >= ago(7d)
| extend NormalizedURL = tolower(coalesce(RequestURL, ""))
| where NormalizedURL matches regex @"(\.\./|\.\.%2f|%2e%2e%2f|%2e%2e%5c|%252e%252e)"
| summarize TotalAttempts = count(), UniqueURLs = dcount(RequestURL), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by SourceIP
| where TotalAttempts >= 2
| order by TotalAttempts desc
Hunting — SPL
spl
index=fortinet sourcetype=fortinet:fortiWeb earliest=-7d
| eval url=lower(coalesce(url, request_url, uri, ""))
| where match(url, "(\.\./|\.\.\\/|%2e%2e%2f|%2e%2e/|\.\.%2f|%2e%2e%5c|%252e%252e)")
| stats count as attempt_count, dc(url) as unique_paths, min(_time) as first_seen, max(_time) as last_seen by src_ip
| where attempt_count >= 2
| sort -attempt_count

30-day hunt for requests specifically targeting sensitive file paths regardless of traversal sequence encoding, catching attackers who may use alternative encoding or exploit secondary vulnerabilities to reach sensitive files.

Hunting — KQL
kql
CommonSecurityLog
| where DeviceVendor == "Fortinet" and DeviceProduct == "FortiWeb"
| where TimeGenerated >= ago(30d)
| extend NormalizedURL = tolower(coalesce(RequestURL, ""))
| where NormalizedURL has_any (['/etc/passwd', '/etc/shadow', 'web.config', 'config.json', 'ssl/private', '.key', 'certificate'])
| project TimeGenerated, SourceIP, RequestURL, DeviceAction
| order by TimeGenerated desc
Hunting — SPL
spl
index=fortinet sourcetype=fortinet:fortiWeb earliest=-30d
| eval url=lower(coalesce(url, request_url, uri, ""))
| where match(url, "(etc/passwd|etc/shadow|web\.config|\.key$|ssl/private|certificate)")
| table _time, src_ip, url, action
| sort -_time

Atomic Red Team Tests

Test 1 Basic Path Traversal Against FortiWeb-Protected Endpoint
linux

Simulates a basic path traversal attack targeting /etc/passwd via a FortiWeb WAF. Tests whether the WAF detection signatures and SIEM logging pipeline correctly capture and alert on the traversal attempt.

Command

bash
curl -v -k 'https://<FORTIWEB_IP>/protected-app/../../../../etc/passwd' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36' --connect-timeout 10 2>&1 | grep -E '(HTTP|Location|< |passwd)'

Cleanup

bash
No cleanup required — this is a read-only HTTP request. Review FortiWeb logs to confirm detection and clear any temporary firewall blocks on the test source IP if needed.

Expected Telemetry

FortiWeb access log entry with the traversal URL, source IP, HTTP method GET, and either a 403 block response (if WAF in block mode) or 200/redirect if in monitor mode. SIEM should receive a CommonSecurityLog or syslog event within 60 seconds.

Expected Detection

Alert triggered by KQL/SPL detection rules matching the '../' traversal pattern in the RequestURL field with FinalScore >= 50.

Test 2 URL-Encoded Path Traversal (Double Encoding)
linux

Tests detection of percent-encoded path traversal variants (%2e%2e%2f and %252e%252e%252f) that may bypass naive signature matching. Validates that detection rules cover encoded traversal sequences.

Command

bash
for PAYLOAD in '%2e%2e%2f%2e%2e%2fetc%2fpasswd' '%252e%252e%252f%252e%252e%252fetc%252fpasswd' '..%2f..%2fetc%2fpasswd' '%2e%2e/%2e%2e/etc/passwd'; do echo "Testing: $PAYLOAD"; curl -s -o /dev/null -w "%{http_code} %{url_effective}" -k "https://<FORTIWEB_IP>/app/$PAYLOAD" --connect-timeout 5; echo; sleep 2; done

Cleanup

bash
No persistent changes. If source IP was blocked by FortiWeb during the test, remove from block list in FortiWeb policy management after confirming detection worked.

Expected Telemetry

Multiple FortiWeb log entries with percent-encoded URL paths. SIEM events should show the encoded traversal sequences in RequestURL or Message fields. Attack log should show WAF signature matches for each encoded variant.

Expected Detection

Detection rules using regex patterns for %2e%2e%2f, %252e%252e, and ..%2f should trigger separate alerts or a single aggregated alert for the source IP within the session window.

Test 3 Traversal Targeting FortiWeb Configuration or Certificate Files
linux

Simulates high-impact exploitation by targeting FortiWeb-specific sensitive paths including SSL certificate directories and configuration files. This represents the worst-case exploitation objective of CVE-2025-64446.

Command

bash
for TARGET in '../../../etc/ssl/private/fortiweb.key' '../../../etc/fortiWeb/config' '../../../../proc/self/environ' '../../../var/log/fortiWeb/access.log'; do echo "[*] Targeting: $TARGET"; curl -s -o /dev/null -w "%{http_code}" -k "https://<FORTIWEB_IP>/app/$TARGET" --connect-timeout 5; echo " - done"; sleep 3; done

Cleanup

bash
No persistent changes made. Review FortiWeb attack logs post-test to confirm all four requests were logged. Unblock test source IP if auto-blocked.

Expected Telemetry

FortiWeb access and attack logs showing four separate requests targeting sensitive paths. Response codes expected to be 403 if blocking mode is active. SIEM should receive all four events and score the requests with TargetsSensitiveFile=true, raising FinalScore to critical threshold.

Expected Detection

High-confidence alert with TargetsSensitiveFile flag set to true, FinalScore >= 70, triggering escalation to critical severity in the SIEM and playbook escalation workflow.

Test 4 Automated Traversal Fuzzing Simulation
linux

Simulates an attacker using automated tooling to fuzz path traversal depth and encoding variations at speed, mimicking tools like dotdotpwn or similar path traversal fuzzers that are commonly used in exploitation of CVE-2025-64446.

Command

bash
python3 -c "
import urllib.request, ssl, time
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
payloads = ['../etc/passwd', '../../etc/passwd', '../../../etc/passwd', '....//etc/passwd', '..%2fetc%2fpasswd', '%2e%2e/etc/passwd', '%2e%2e%2fetc%2fpasswd', '..%252fetc%252fpasswd']
for p in payloads:
    try:
        url = f'https://<FORTIWEB_IP>/app/{p}'
        req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
        r = urllib.request.urlopen(req, context=ctx, timeout=5)
        print(f'{r.status} {p}')
    except Exception as e:
        print(f'ERR {p}: {type(e).__name__}')
    time.sleep(1)
"

Cleanup

bash
No persistent changes. The test generates 8 HTTP requests over approximately 8 seconds. Clear any source IP blocks from FortiWeb after confirming detection. Review SIEM to confirm burst detection logic (if implemented) triggered.

Expected Telemetry

Burst of 8 FortiWeb log events from the same source IP within 10 seconds, each containing traversal patterns. SIEM correlation rules should group these by source IP and escalate based on repeat attempts.

Expected Detection

Multiple rule matches from a single source IP within a short timeframe. Sumo Logic count aggregation and QRadar sequence correlation should surface this as a high-confidence exploitation attempt rather than a single accidental request.

Related Detections