veilletech.fr
25 sept. Feed du jour
#04 SÉCURITÉ Faille

ansi2html : une ligne de log vole le compte

Colorer un log, c'est déjà l'interpréter.

ansi2html, bibliothèque Python qui convertit les couleurs de terminal en HTML, n'échappait pas les liens OSC 8. Sur builds.sr.ht, la CI de SourceHut, une ligne de log suffisait à exécuter du JavaScript chez chaque visiteur, avec son jeton CSRF et ses clés de déploiement. Corrigé dans ansi2html 1.9.4 et builds.sr.ht 0.105.1, après quatre ans et demi d'exposition.

3 min de lectureintermédiairevidéo 1:15
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Le mécanisme
  3. Versions et traces
  4. Ce que ça change
  5. À retenir

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 :

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.

Visiteurbuilds.sr.htListe publiqueAttaquantVisiteurbuilds.sr.htListe publiqueAttaquantPatch piégé1Build déclenché2Log rendu paransi2html3Ouvre le log4Lien devenu script5Relance au nom de V6
D'un patch envoyé par courriel à un build lancé au nom d'un autre

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

Terminal
# 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.

Source : SourceHut account takeover via build logs (XSS in ansi2html.py), Arusekk, 24 septembre 2026, en anglais.