jasonmiao0511-hue/modelscan-pytorch-bypass-poc

GitHub: jasonmiao0511-hue/modelscan-pytorch-bypass-poc

证明 modelscan <= 0.8.5 可被利用 `marshal+types+base64` 链构建的恶意 PyTorch `.pt` 文件绕过检测,从而在 `torch.load()` 时实现远程代码执行的概念验证项目。

Stars: 0 | Forks: 0

# modelscan PyTorch Bypass PoC ## 摘要 证明了 `modelscan` (<= 0.8.5) 可以被恶意的 `.pt` (PyTorch) 文件绕过,因为: 1. .pt 格式本质上是一个包含 pickle 数据的 ZIP 归档文件 2. 当 pickle 是使用 marshal+types+base64 链构建时,它可以绕过 modelscan 的 `unsafe_globals` 黑名单 3. `torch.load()` 会触发 pickle 反序列化,从而执行嵌入的 payload ## 受影响版本 - modelscan <= 0.8.5 - PyTorch >= 1.0 - 使用默认 `weights_only=False`(历史默认值)的 `torch.load()` ## 复现 ``` pip install modelscan torch # 步骤 1:scan 报告 "No issues" (BYPASSED) modelscan scan -p rce.pt # 步骤 2:加载该文件会执行任意代码 python -c "import torch; torch.load('rce.pt')" # 检查:cat pwned_p4.txt -> PWNED_P4 ``` ## 攻击链 1. 攻击者创建一个恶意的 `.pt` 文件(包含 pickle 的 ZIP) 2. 内部 pickle 使用 `types.FunctionType(marshal.loads(base64.b64decode(\"...\")), {})()` 作为其 `__reduce__` 目标 3. `types`、`marshal` 和 `base64` 并不在 modelscan 的黑名单中 4. 当 `torch.load()` 反序列化该文件时,该攻击链将被执行 5. 结果:在宿主机上实现任意代码执行 ## 文件 - `rce.pt` — 恶意的 PyTorch PoC 文件(带有 .pt 扩展名的原始 pickle) - `rce_pt.py` — 生成脚本 - `README.md` — 本文件 ## 临时解决方案(针对用户) 在官方修复发布之前,请在调用 `torch.load()` 时设置 `weights_only=True`(适用于 PyTorch 1.13+): ``` import torch torch.load('model.pt', weights_only=True) # refuses arbitrary pickle ``` ## 披露 - 发现者:jasonmiao0511-hue - 报告方式:huntr.com 模型格式漏洞表单 - 日期:2026-06-15 - 相关内容:有关纯 `.pkl` 格式中相同根本原因的分析,另请参见 [modelscan-pickle-bypass-poc](https://github.com/jasonmiao0511-hue/modelscan-pickle-bypass-poc)
标签:凭据扫描, 逆向工具