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)
标签:凭据扫描, 逆向工具