Telegram Desktop 的 IPC 注入,点一次链接就能读走本地文件并接管账号

Telegram Desktop 7.2.9 之前,单实例进程间通信写入前不给分隔符转义。点一次链接,额外指令就能挤进这次通信,再借内部协议 interpret 读走本机任意文件并发进攻击者的群。默认没设本地密码时,拿到 tdata/key_datas 就能推出解密密钥,会话授权随之解开。受影响版本到 7.2.8,编号 CVE-2026-107181,评分 8.1 High。

做桌面应用的开发者可以对照自己项目的单实例通信。

分隔符为什么会变成指令边界

Telegram Desktop 注册了协议名 tg。应用已在运行时,系统照样启动新进程,靠连本地套接字判断是否多余。套接字传字节不传对象,URL 得先压成一行文本,每条是关键字加参数加收尾分号,链接拼成 OPEN 加链接再加分号,对面按分号切开。值自带分号时,新进程仍当它是普通字符写出去,一条指令裂成两条。老进程把它当成自己人。

interpret 这种内部协议危险在哪

OPEN 接受任意 URL,不筛协议。顺着它往下翻能找到 Telegram 内部的 interpret,系统不认识它,它没注册成协议处理器。它本来用于发布自己的版本,构建脚本把频道、文件和正文写进一个文本文件,再把路径交给启动参数,文件里一行 from 比对登录账号,只在存在时才检查。危险在于它读盘上任意文件并发进一个会话,不问确认,不查是谁要求。

从一次点击到文件外发

  1. 攻击者建超级群把受害者拉进去,默认隐私设置允许不经确认拉人。
  2. 攻击者在群里发三个指令文本文件,各指向一个要偷的文件,目的地写自己的群,from 那行省略。群聊里 8 MiB 以内的文件默认自动下载,受害者打开群时就收下了。路径里的未知量是 Windows 用户名,相对路径往上退三级即可。
  3. 攻击者发一条看着正常的链接,受害者点开,浏览器跳到构造好的 tg 链接。
  4. 系统拉起第二个 Telegram 进程,把链接转给运行中的实例,没转义的分号切开这一行。
  5. 三条 interpret 指令依次执行,三个文件传到攻击者的群,没有确认弹窗。

没有本地密码时,三个文件就是账号

Telegram 本地数据不存明文,用两层密钥。DEK 又长又随机,负责加密用户数据。KEK 只加密 DEK,由用户密码经密钥派生函数算出,盐和加密后的 DEK 一起存在 tdata/key_datas。默认没有本地密码,得自己去设置里开,没开时参与派生的密码是空字符串,KEK 由空密码加盐算出,盐却明文躺在同一个文件里,拿到它就能重算 KEK 并解开 DEK。拿走账号要三个文件,key_datas 存盐和加密的 DEK,D877F783D5D3EF8Cs 是用 DEK 加密的会话授权,D877F783D5D3EF8C 目录是索引,读授权时要顺带读。丢进干净的 tdata 启动 Telegram,会话就开了。

修复方式与各自的处置顺序

db3405699f 在 2026 年 9 月 16 日落地,删掉 interpret 协议和对应的发送函数,同时给套接字上的分隔符加转义,值在写入前用百分号加十六进制编码,切分后再解回来。补丁另加两条限制,同一条连接上出现 OPEN 时跳过 CMD 和 CTRL 记录,出现过非本地 URL 后丢掉本地路径。

用户这边按效果排序。

  • 升级到 7.2.9 或更高版本,这是唯一能关掉问题的动作。
  • 打开“下载前询问保存位置”,指令文件落不到盘上。
  • 把“谁可以把我拉进群组”限制成仅联系人,被偷的文件只能发到频道或超级群。
  • 设一个本地密码,它拦不住文件被偷,但能让偷走的会话用不了。

开发者要注意,把外部字符串拼进自定义协议时都得问一句分隔符出现在值里会怎样,会读文件或改配置的内部协议要么校验调用方身份,要么别让它从进程外够到。

常见问题

只在 Windows 上受影响吗。 已公开的验证在 Windows 的 6.9.3 上完成,受影响版本声明到 7.2.8。

点了链接没反应,是不是就没事。 不一定,这一链是静默外发。