Telegram Desktop 一键账户接管:分号注入 + interpret: 内部 scheme 的致命组合

导语:你以为点了一个普通的 https 链接,浏览器却弹了个 Telegram 的处理提示。等你回过神来,桌面客户端已经把 tdata 里的三份核心文件发到了攻击者建的群组里。整个过程就一次点击,CVSS 8.1。


漏洞速览

  • CVE:CVE-2026-107181
  • CVSS 3.1:8.1 High(AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N)
  • 影响版本:Telegram Desktop 7.2.8 及以下(Windows 6.9.3 已确认)
  • 修复版本:7.2.9(commit db3405699f,2026-09-17 发布)
  • 作者:beaksec(CC BY 4.0 协议)
  • 类型:命令注入 + 任意本地文件读取 → 账户接管

本文为编译报道,原始技术分析由 beaksec 公开,原文地址:https://beaksec.github.io/posts/telegram-desktop-one-click-account-takeover/。

Telegram Desktop 攻击概念图

一、两个缺陷拼成的完整链

这条攻击链由两个独立缺陷组合而成,单看任何一个都「看起来不严重」,拼起来就致命。

缺陷 1:单实例 socket 的分号注入

Telegram Desktop 用本地 socket 把 URL 传给已经运行的实例,传输格式很简单:

OPEN:tg://x?a=1;

发送端把 URL 拼成 OPEN:;,接收端用分号切分,然后逐条执行。但发送端在拼接时没有对分号转义。

攻击者把 URL 改成 tg://x?a=1;CMD:quit,到接收端就被切成两条:

OPEN:tg://x?a=1
CMD:quit

这就是第一道裂缝:客户端没有把分号当数据,只是当分隔符。

缺陷 2:未鉴权的 interpret: 内部 scheme

Telegram 内部有一组只在自己进程内识别的 URI scheme,其中一个是 interpret:。这个 scheme 是当年 TG 用来发版本发布的工具——读一个指令文件,文件里写明要把哪个 channel 的什么 caption 发什么附件,本地有 InterpretSendPath 函数直接执行。

问题在于:它不验证调用者身份,也没有确认提示。从命令行调用没问题(攻击者得有机器立足点),但一旦通过 socket 可达,就等于「远程任意文件读取 + 发送到攻击者频道」。

命令注入链路示意图

二、文件如何落盘到攻击者能猜到的路径

interpret: 接收路径。如果攻击者能提前把指令文件塞到受害者机器的可预测位置,链就闭合了。

Telegram Desktop 默认在群组里自动下载文件(最大 8 MiB),落到固定路径:

C:Users<user>DownloadsTelegram Desktop<file name>

用户名未知,但 interpret: 接受相对路径,Telegram 自身的工作目录是 %APPDATA%Telegram Desktop,回溯三级就到用户 home 下的 Downloads:

interpret:../../../Downloads/Telegram%20Desktop/instructions.txt

这就绕开了用户名探测。攻击者只需在群组里发三个指令文件,TG 客户端在你打开群组时自动下载它们。


三、从文件读取到账户接管

Telegram 本地数据用双层密钥加密:

  • DEK(Data Encryption Key,数据加密密钥)——长随机高熵,加密用户数据
  • KEK(Key Encryption Key,密钥加密密钥)——由 passcode 经 KDF(密钥派生函数)算出,加密 DEK 本身

Telegram Desktop 默认没有本地 passcode。这意味着 KEK 是从空字符串 + salt 派生出来的,salt 就明文存着。于是:

salt, encrypted_DEK = read("tdata/key_datas")
KEK = KDF("", salt)              # 空 passcode
DEK = decrypt(encrypted_DEK, KEK)
session = decrypt(authorization_file, DEK)

三个关键文件:

tdata/
├── key_datas                      # salt + 加密的 DEK
├── D877F783D5D3EF8Cs              # MTProto 授权(DEK 加密)
└── D877F783D5D3EF8C/maps          # 索引(无密文但 session 加载要读它)

文件夹名是写死的字符串(storage_file_utilities.cpp:241-250),所有安装都一样。攻击者拿到这三个文件,扔进一个全新的 tdata,启动 Telegram,受害者账户直接登录——连 passcode 都不用。


四、完整 PoC 步骤

  1. 攻击者建一个 supergroup,把受害者拉进去(Telegram 默认隐私设置允许)
  2. 攻击者往群组里发 3 个指令文件,每个文件省略 from: 行(跳过账户校验),指定不同目标
  3. 攻击者发一条无害的 https 链接到群里,受害者点击
  4. 浏览器跟随 302 重定向到构造的 tg:// URL:
tg://x?a=1;OPEN:interpret:../../../Downloads/Telegram%20Desktop/instructions1.txt;
          OPEN:interpret:../../../Downloads/Telegram%20Desktop/instructions2.txt;
          OPEN:interpret:../../../Downloads/Telegram%20Desktop/instructions3.txt
  1. 操作系统启动第二个 Telegram 进程,URL 通过 socket 转发给已运行的实例
  2. 未转义的分号把单条 URL 拆成 4 条指令(1 个无操作 + 3 个 OPEN:interpret:)
  3. 三条 interpret: 命令执行,三个文件被读取并上传到攻击者频道
  4. 攻击者重建 tdata,启动 Telegram,受害者账户登录

整个过程一次点击,零确认弹窗。


五、时间线

日期事件
2026-06-25通过 ZDI 报告漏洞
2026-09-16厂商独立修复,commit db3405699f
2026-09-17Telegram Desktop 7.2.9 发布
2026-09-30ZDI 关闭案例,披露权返回作者
2026-10-03beaksec 公开 writeup
2026-10-07CVE-2026-107181 分配

修复发布很低调:7.2.9 changelog 只提了一个渲染修复,修复 commit 标题是「Remove legacy interpret path helper」,没有任何 advisory。


六、修复细节

commit db3405699f 做了三件事:

  • 完全移除 interpret:// scheme 和 Support::InterpretSendPath——直接砍掉内部发布工具
  • 转义 record separator(记录分隔符)——分号在写入前用 percent-prefixed hex 编码,读出后解码,再也不能当边界
  • 混合命令检查——OPEN: 出现后跳过 CMD: 和 CTRL:;出现非本地 URL 后丢弃本地文件路径

七、缓解措施

只有升级 7.2.9+ 才能真正关闭这条链。其他的只是降低暴露面:

  • 开启「每次保存文件前询问」——自动下载被禁,指令文件落不到磁盘
  • 限制只有联系人能拉你进群——被盗文件只能发到 channel/supergroup,这条直接掐断外传通道
  • 设置本地 passcode——文件还是会被偷,但解不出 session

八、红队观察四点

  1. 「未鉴权的内部 API」是最危险的资产——interpret: 单独看是 TG 自家的发布工具,但因为没人验证调用者身份,配合任意一个能调到它的路径(这里是 socket)就成了 RCE 级的攻击面
  2. 「默认无 passcode」是产品决策漏洞——加密本地数据但默认空 passcode,salt 明文存,等于没加密
  3. changelog 不提安全修复是行业常态——TG 这里不是孤例,任何 changelog 都要和 commit diff 一起看
  4. 三文件复制 = 完整账户接管——这种「加密但默认空口令」的设计,攻击者只需要把攻击降级到「文件读取」就够了

九、思考题

  1. 如果 interpret: scheme 留着但加上调用者身份校验,这条链还能闭合吗?
  2. 7.2.9 修复后,Telegram Desktop 还能不能通过类似的「默认行为 + 内部 scheme」组合发起攻击?给你 5 分钟源码审计你能找到什么?
  3. 默认无本地 passcode 的设计,除了 Telegram 之外还有哪些流行桌面客户端中招?

素材出处

本文编译自 beaksec 原创技术分析,原文采用 CC BY 4.0 协议。

  • 原文标题:Telegram Desktop: one-click account takeover via IPC injection
  • 作者:beaksec
  • 原文地址:https://beaksec.github.io/posts/telegram-desktop-one-click-account-takeover/
  • CVE:CVE-2026-107181
  • ZDI 报告通道:2026-06-25 提交,2026-09-30 关闭
  • 修复 commit:db3405699f(Telegram Desktop 官方仓库,2026-09-16)
  • YouTube 频道:https://www.youtube.com/@beaksec

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容