Telegram 桌面端一键盗号漏洞:信任混淆穿透加密防线

Telegram 桌面端一键盗号漏洞:信任混淆穿透加密防线

安全漏洞分析客户端安全

数据源:beaksec.github.io

Telegram 本地数据的加密体系是完备的。用户会话数据由专门的数据加密密钥(DEK)加密,而 DEK 进一步由基于口令派生的密钥加密密钥(KEK)保护。但在 Windows 桌面上,一条恶意链接就能让这套密码学防线失效。安全研究者 beaksec 公开了针对 Telegram Desktop 的一键账号接管漏洞 CVE-2026-107181,攻击者诱导受害者点击构造好的链接后,系统会将受害者的核心会话文件静默上传到指定群组,进而接管账号。

VulnCheck 作为 CNA 机构给该漏洞的 CVSS 4.0 评分为 8.6,而基础的 CVSS 3.1 评分为 8.1。分数差异的核心源于新版标准加重了由用户轻微交互引发的后续系统级影响的权重。这条攻击链得以成立,是因为 Telegram Desktop 把内部可信调用和外部不可信输入汇进了同一条无校验的通信通路。当一条数据通路上前置节点没有假定输入不可信,内部再好的密码学堡垒也防不住边界失效。

分隔符未转义触发内部特权后门

整个攻击链的第一环,是本地单实例 socket 上的记录分隔符处理不当(CWE-143)。当用户点击外部链接唤起已经运行的 Telegram Desktop 实例时,操作系统会将链接传递给新进程。新进程通过本地 socket 把待打开的链接格式化为 OPEN:<url>; 交给已运行的主实例,接收方按分号切分成多条指令。这里的工程缺陷在于,输入 URL 中的分号没有被转义,相关逻辑在 sandbox.cpp:295-297 拼装与 sandbox.cpp:453-463 切分中均未对特殊字符做限制。系统未过滤特殊字符,导致包含分号的恶意链接 tg://x?a=1;CMD:quit 被生硬地切分成两条指令,外部不受信的输入由此逃逸到内部控制流中。

图:从点击一条链接到受害者会话文件外泄的链路示意。来源:beaksec.github.io 图:从点击一条链接到受害者会话文件外泄的链路示意。来源:beaksec.github.io

逃逸出的指令顺势接管了攻击链的第二环:内部 URI scheme interpret:。根据 application.cpp:1162-1164 的实现,系统会将对应的路径附加到执行队列中。随后的 InterpretSendPath 函数(位于 support_helper.cpp:673-680)读取指令文件指定的本地文件,并发送到特定的频道或超级群,全程不进行授权校验,也不弹窗确认。该协议最初是官方用于发布更新的工具链,构建脚本 build/updates.py 会用它下发版本包。指令文件里原本包含用于比对当前登录账号的 from: 字段,但该行缺失时,系统直接跳过检查。协议解析缺乏防备,等同于向外部攻击者直接交出内部核心特权函数的执行权。

自动下载机制拼装出确定性攻击链

漏洞本身是一个执行入口,将其转化为账号接管需要精准的状态机工程拼装。攻击者首先创建一个超级群,并利用 Telegram 默认隐私设置下无需确认的机制,将受害者拉入群中。随后,攻击者在群内发送三个纯文本指令文件,包含指向受害者本地机密文件的 interpret: 读取指令。利用 Telegram 对小于 8 MiB 附件默认自动下载的特性,这三个文件会静默保存到 C:\Users\<user>\Downloads\Telegram Desktop\ 目录下。

interpret: 协议接受相对路径,且解析基准是 Telegram 在 Windows 上的工作目录 %APPDATA%\Telegram Desktop。攻击者利用 ../../../Downloads/Telegram%20Desktop/instructions.txt 就能在无需知道具体系统用户名的情况下,精确命中这些自动下载的载荷文件。之后,攻击者只需在群里发送一条 HTTP 链接并 302 跳转至构造好的 tg:// 链接,受害者点击后即刻触发注入。

三个指令文件随后读取并回传了会话接管所需的核心数据:存有未加密 salt 的 tdata/key_datas 文件、由默认数据名派生目录下的 D877F783D5D3EF8Cs 文件,以及对应的索引 maps 文件。这里的目录名 D877F783D5D3EF8C 并非随机值,而是系统根据默认数据名 data 派生得来的固定字符串,相关逻辑在 storage_file_utilities.cpp:241-250 中清晰可见,每次安装生成的结果都一模一样。默认未设置本地口令时,本地口令为空字符串,攻击者拿到 key_datas 里的 salt 就能依靠公开算法重算 KEK、解开 DEK,进而在本地重建受害者的 MTProto 授权会话。单个来看,自动下载、支持相对路径和默认免密都是合理功能,但当它们在同一个执行上下文中交汇,就串接成了一条杀伤力极强的利用链。

四项源码修改重构通信边界

面对这条利用链,Telegram 的修复动作选择了清退旧有逻辑。在 2026 年 9 月 16 日的 db3405699f 提交中,开发团队进行了四项针对性修改。首先,从代码库中删除了 interpret:// 方案及对应的 Support::InterpretSendPath 发送辅助函数。其次,对 socket 通信上的记录分隔符实施百分号十六进制转义,切断了多段指令注入的可能。另外增加了两条加固断言:当同一连接中出现 OPEN: 时跳过 CMD: 与 CTRL: 记录,并在检测到非本地 URL 后丢弃后续的本地路径请求。

次日发布的 7.2.9 版本包含了上述所有补丁。该版本的更新日志仅提及渲染问题修复,未包含安全公告或漏洞影响说明。回顾时间线,ZDI 在 2026 年 6 月 25 日收到漏洞上报,厂商在 9 月 16 日独立修复代码,9 月 30 日 ZDI 以已修复名义结案,直至 10 月 3 日研究者 beaksec 自行公开分析,10 月 7 日才正式分配 CVE。这种不发安全公告的静默更新策略,切断了下游企业评估内部客户端风险的信息链。目前 CISA 的 SSVC 评级仅将利用状态标记为 poc,未列入 KEV 目录。

不靠升级也能切断攻击的三条防线

本次漏洞验证在 Windows 平台的 6.9.3 版本上完成,对未及时升级 7.2.9 及以上版本的用户,客户端内自带的配置项能提供直接的隔离效果。在高级设置中开启「每个文件都询问保存位置」,会破坏漏洞链对指令文件绝对路径的依赖,让恶意载荷无法出现在预定目录里。将「谁能把我拉进群」权限收缩为仅限联系人,则阻断了攻击者强拉受害者进群投递恶意文件的通道。另外,对浏览器弹出的「用 Telegram 打开」提示保持怀疑,并在活跃会话列表里检查异常登录,能及时止损。

最核心的防护层在于密码学层面:为 Telegram 设置本地口令。漏洞利用的前提是本地口令为空,导致攻击者能直接用默认参数结合窃取到的 salt 解密数据。设置本地口令后,系统要求提供外部输入的明文密码才能派生合法的 KEK。此时即便本地的 key_datas 等文件被全部传走,攻击者在没有明文密码的情况下也无法读取实质内容。当业务逻辑出现信任边界穿透时,配置上不退让的安全底线才是抵御接管的最终屏障。

参考链接:

  • Telegram Desktop 一键账号接管漏洞分析(beaksec)
  • VulnCheck 漏洞评分说明