Ce qui se passe
Le chercheur Arusekk a publié dans la nuit du 23 au 24 septembre le récit d'une prise de contrôle de compte sur builds.sr.ht, l'intégration continue de SourceHut. La cause est une dépendance : ansi2html, bibliothèque Python qui transforme les codes de couleur ANSI d'une sortie de terminal en HTML. Le défaut est entré dans ansi2html le 3 septembre 2021 et dans la production de SourceHut le 8 février 2022 : quatre ans et demi d'exposition.
Le mécanisme
Outre les couleurs, ansi2html reconnaît les liens cliquables des terminaux
récents, la séquence OSC 8 (ESC ]8;;adresse BEL texte ESC ]8;; BEL). Il en
tirait une balise de lien en recopiant l'adresse sans l'échapper. Deux charges
suffisaient :
- un guillemet dans l'adresse referme l'attribut
href, et la suite ajouteautofocuset un gestionnaireonfocus: le script s'exécute dès l'affichage, sans clic ; - une adresse en
javascript:s'exécute au clic.
Sur builds.sr.ht, tout ce qui s'imprime dans un log de build passe par là. Et pas besoin d'un compte payant pour y écrire : un patch envoyé à une liste de diffusion publique reliée à la CI déclenche un build, tout comme une ressource distante dont le contenu finit dans le log.
La page du log contient le jeton CSRF et le formulaire de relance du build. Le script peut donc soumettre un build modifié au nom de la personne qui regarde, avec ses clés de déploiement — sur l'instance principale, celles de sr.ht lui-même. Chaque victime peut en piéger d'autres : l'attaque se propage seule.
Versions et traces
- ansi2html : touché de
1.7.0à1.9.4exclu, corrigé en1.9.4le 2 septembre 2026 avec le mainteneur Sebastian Pipping. Arch Linux a suivi le 5 septembre. - builds.sr.ht : touché de
0.40.0à0.105.1exclu. Signalé le 1er août, atténué le 4 par Drew DeVault, qui assainit désormais la sortie d'ansi2html. - Un CVE a été attribué par VulnCheck ; le billet n'en donne pas le numéro.
- Aucune exploitation connue. Pour vérifier des logs bruts :
# Liens OSC 8 dont l'adresse contient un guillemet
grep -rl $'\33]8;[^\7\33]*"' logs/
# Liens OSC 8 vers une adresse javascript:
grep -rl $'\33]8;;javascript:' logs/Ce que ça change
Toute page qui affiche des logs de CI ou une sortie de commande a le même problème potentiel, quelle que soit la bibliothèque : une séquence d'échappement est une entrée utilisateur.
- Passer ansi2html en
1.9.4ou plus (pip show ansi2htmlpour vérifier). - Assainir le HTML produit, comme l'a fait SourceHut.
- Servir une CSP sans
'unsafe-inline': ni gestionnaire en ligne ni URLjavascript:ne s'exécutent plus. L'auteur note que la page de SourceHut utilise un script en ligne pour son défilement, ce qui rend ce durcissement moins immédiat.
Source : SourceHut account takeover via build logs (XSS in ansi2html.py), Arusekk, 24 septembre 2026, en anglais.