veilletech.fr
15 sept. Feed du jour
#03 SÉCURITÉ Faille

Telegram : un export HTML qui vous relit

Échapper huit champs sur neuf, c'est ne pas échapper.

Telegram Desktop écrivait sans échappement le libellé des boutons d'un bot dans ses exports HTML, ce qui permettait d'y cacher du JavaScript exécuté à l'ouverture du fichier dans un navigateur. Les chercheurs d'ExPatch, Denis et Aleksander Rostilov, l'ont publié le 12 septembre 2026 et le notent 8,2 sur 10 en CVSS 3.1. Le correctif est parti en juillet, mais aucun export déjà produit n'est réparé, et il n'existe ni CVE ni avis de sécurité.

3 min de lectureintermédiairevidéo 1:15
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Le parcours de la charge
  3. Versions, et ce que le correctif ne fait pas
  4. Une divulgation sans avis
  5. À retenir

Ce qui se passe

Telegram Desktop sait enregistrer une conversation, ou un compte entier, sous forme de pages HTML ouvrables dans un navigateur. Le code qui produit ces pages échappait le texte des messages, les noms d'expéditeurs et les autres champs — mais pas le libellé des boutons d'un inline keyboard, ces rangées de boutons qu'un bot attache sous ses messages et dont il choisit lui-même le texte.

Un bot pouvait donc y placer une balise <script>, rembourrée de caractères invisibles pour que le bouton paraisse vide dans l'application. Dans Telegram, rien ne se passe : le code ne s'exécute qu'à l'ouverture du fichier exporté.

Le parcours de la charge

ServeurattaquantNavigateurUtilisateurSalon TelegramBotServeurattaquantNavigateurUtilisateurSalon TelegramBotle message reste dans l'historique,des mois s'il le fautmessage + bouton dont lelibellé contient <script>transfert du message (lesboutons-liens suivent)export HTML de laconversationouverture du fichier exportéexécution du script,sans clicmessages, expéditeurs,horodatages, chemin local

Deux propriétés rendent l'attaque praticable. D'abord, le bot n'a pas besoin d'être dans le salon visé : un message dont les seuls boutons sont des liens web conserve ses boutons lorsqu'il est transféré, donc n'importe quel membre peut l'y apporter. Ensuite, le message dort dans l'historique jusqu'à ce que quelqu'un exporte — des mois, voire des années plus tard.

Ce que le script peut lire dans le fichier ouvert : chaque message, les noms d'expéditeurs, les horodatages, le nom du salon, son type, son nombre de membres, et le chemin local du fichier. Il peut aussi réécrire la page : la démonstration remplace l'export par un faux formulaire de « vérification » Telegram. Une modification de dates ou d'expéditeurs dans un fichier utilisé comme preuve est du même ressort.

Versions, et ce que le correctif ne fait pas

Le point à ne pas manquer : mettre à jour l'application ne répare pas les fichiers déjà exportés. Un export produit avant juillet reste piégé sur le disque.

Les chercheurs conseillent donc de mettre à jour, puis de refaire les exports HTML antérieurs, ou de n'ouvrir les anciens qu'avec JavaScript désactivé — et de traiter comme non fiable tout export issu d'un grand groupe. Tant que l'application n'est pas à jour, inutile d'en créer de nouveaux : seuls les exports produits par l'ancien code portent le défaut.

Une divulgation sans avis

Les chercheurs ont signalé la faille le 3 juin, Telegram l'a confirmée le 1er juillet et proposé une prime de 500 $, qu'ils ont refusée au profit d'une association. Telegram a ensuite refusé la publication, y compris après correctif. Ils ont publié le 12 septembre, notant la faille 8,2 sur 10 en CVSS 3.1 — leur propre évaluation.

Au 14 septembre : aucun CVE, aucun avis dans le dépôt GitHub, et aucune mention du correctif dans le changelog ni dans les notes des versions 6.9.4 et 7.0.1. Pour un administrateur qui suit les avis publics, ce correctif n'existe pas.

À retenir

Un export HTML n'est pas un format de données : c'est un programme. Tout générateur qui concatène des champs utilisateur dans du HTML doit les échapper tous, y compris ceux qui paraissent contraints par l'interface. Ici, le champ oublié était celui qu'un tiers non présent dans la conversation pouvait remplir.