Der Angriff war unauffällig: Der Bot konnte ein Skript-Tag in den Text einer Schaltfläche legen und mit unsichtbaren Zeichen auffüllen, sodass der Button in der getesteten Version von Telegram Desktop leer aussah. In Telegram selbst wirkte die Nachricht wie eine gewöhnliche Mitteilung mit Link-Button.
Entscheidend ist, dass der Bot nicht Mitglied des Zielchats sein muss. Eine Nachricht, deren Schaltflächen ausschließlich Weblinks sind, behält diese Buttons beim Weiterleiten – jedes Gruppenmitglied, das die Bot-Nachricht weiterleitet, trägt den Code mit hinein. Die Nachricht verbleibt anschließend wie jede andere im Verlauf und kann Monate oder Jahre später exportiert werden.
Wurde eine Exportdatei mit dieser Nachricht geöffnet, lief das Skript laut den Forschern ohne weiteren Klick an. Es konnte alle Nachrichten der Datei samt Absendernamen und Zeitstempeln auslesen, dazu Name, Typ und Mitgliederzahl des Chats sowie den lokalen Dateipfad – und alles an den Server des Angreifers senden. Da der Exportcode lange Verläufe in Dateien zu je 1.000 Nachrichten aufteilt, ist jeweils nur der Inhalt einer Datei betroffen, nicht der gesamte Chat oder das Telegram-Konto.
Darüber hinaus ließ sich die Seite manipulieren. In der Demonstration ersetzte das Skript den kompletten Export durch ein gefälschtes Telegram-„Verifizierungs"-Formular; ebenso könnten Daten, Absender oder Nachrichtentexte in einer als Beleg genutzten Datei verändert werden. Telegrams eigene Kopie des Chats und die auf der Festplatte gespeicherte Exportdatei blieben unangetastet.
Drei Bedingungen mussten erfüllt sein: Der HTML-Export stammte aus einer Telegram-Desktop-Version vor dem Fix, die präparierte Nachricht fiel in den exportierten Bereich, und die Datei wurde in einem Browser mit aktiviertem JavaScript geöffnet. Untersucht wurde ausschließlich der HTML-Export von Telegram Desktop – das JSON-Format und die Exportfunktionen anderer Telegram-Apps blieben außen vor.
Ob eine weitergeleitete Bot-Nachricht überhaupt im Export landet, hängt von dessen Art ab: Der Export eines einzelnen Chats über dessen Menü enthält die Nachrichten aller Mitglieder, ein vollständiger Kontoexport standardmäßig nur die eigenen Nachrichten in Gruppen und Kanälen, dafür aber alle Nachrichten in Einzelchats und Chats mit Bots.
Den Fehler behebt Commit 8457d13a des Telegram-Desktop-Entwicklers John Preston, der die fehlende Maskierung ergänzt. Er entstand am 30. Juni, erreichte am 3. Juli die Beta 6.9.4 und am 14. Juli das stabile Release 7.0.1. Die unmaskierte Zeile steckte seit Version 4.15.1 vom März 2024 in stabilen Releases – rund zwei Jahre und vier Monate.
Die Forscher meldeten die Lücke am 3. Juni, zwei Tage nach dem Fund, und testeten sie nach eigenen Angaben nur mit eigenen Konten und Testgruppen; dass die Schwachstelle gegen reale Nutzer eingesetzt wurde, behaupten sie nicht. Telegram bestätigte den Fehler am 1. Juli und bot 500 US-Dollar Bug Bounty an, die die Forscher ablehnten und für wohltätige Zwecke gespendet sehen wollten.
Eine koordinierte Veröffentlichung lehnte Telegram ab: „Wir haben auch die Möglichkeit einer öffentlichen Offenlegung erwogen, können sie aber nicht befürworten, da selbst die Offenlegung bereits behobener Probleme künftig mehr Telegram-Nutzer gefährden könnte. Werden Informationen zu einer Schwachstelle öffentlich, können böswillige Akteure versuchen, sie auszunutzen, und Telegram-Nutzern damit finanziellen Schaden zufügen", schrieb Telegram Support in einer E-Mail vom 1. Juli, die die Forscher als Screenshot veröffentlichten. Da keine Geheimhaltungsvereinbarung bestand, publizierten sie am 12. September, nach Auslieferung des Patches.
Eine CVE-Kennung existiert nicht; eine Suche in öffentlichen Schwachstellendatenbanken durch The Hacker News am 14. September fand keine. Auch die Release Notes zu 6.9.4 und 7.0.1, das Changelog und Telegrams Ankündigung vom 14. Juli erwähnen den Fix nicht, und das GitHub-Repository listet keine Sicherheitshinweise. Für Nutzer mit älteren Exporten hatte Telegram bis zum 14. September keine Hinweise veröffentlicht. Neue HTML-Exporte anzulegen, gibt es vor dem App-Update keinen Grund – nur Dateien aus dem alten Code tragen die Lücke.
