资讯动态

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

发布时间:2026/10/22 3:41:57 来源:尧图企业网站定制
导语你以为点了一个普通的 https 链接浏览器却弹了个 Telegram 的处理提示。等你回过神来桌面客户端已经把 tdata 里的三份核心文件发到了攻击者建的群组里。整个过程就一次点击CVSS 8.1。漏洞速览CVECVE-2026-107181CVSS 3.18.1 HighAV: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.9commit db3405699f2026-09-17 发布类型命令注入 任意本地文件读取 → 账户接管本文为编译报道原始技术分析由 beaksec 公开原文地址https://beaksec.github.io/posts/telegram-desktop-one-click-account-takeover/。Telegram Desktop 攻击概念图一、两个缺陷拼成的完整链这条攻击链由两个独立缺陷组合而成单看任何一个都「看起来不严重」拼起来就致命。缺陷 1单实例 socket 的分号注入Telegram Desktop 用本地 socket 把 URL 传给已经运行的实例传输格式很简单OPEN:tg://x?a1;发送端把 URL 拼成 OPEN:;接收端用分号切分然后逐条执行。但发送端在拼接时没有对分号转义。攻击者把 URL 改成 tg://x?a1;CMD:quit到接收端就被切成两条OPEN:tg://x?a1CMD:quit这就是第一道裂缝客户端没有把分号当数据只是当分隔符。缺陷 2未鉴权的 interpret: 内部 schemeTelegram 内部有一组只在自己进程内识别的 URI scheme其中一个是 interpret:。这个 scheme 是当年 TG 用来发版本发布的工具——读一个指令文件文件里写明要把哪个 channel 的什么 caption 发什么附件本地有 InterpretSendPath 函数直接执行。问题在于它不验证调用者身份也没有确认提示。从命令行调用没问题攻击者得有机器立足点但一旦通过 socket 可达就等于「远程任意文件读取 发送到攻击者频道」。命令注入链路示意图二、文件如何落盘到攻击者能猜到的路径interpret: 接收路径。如果攻击者能提前把指令文件塞到受害者机器的可预测位置链就闭合了。Telegram Desktop 默认在群组里自动下载文件最大 8 MiB落到固定路径C:UsersDownloadsTelegram Desktop用户名未知但 interpret: 接受相对路径Telegram 自身的工作目录是 %APPDATA%Telegram Desktop回溯三级就到用户 home 下的 Downloadsinterpret:…/…/…/Downloads/Telegram%20Desktop/instructions.txt这就绕开了用户名探测。攻击者只需在群组里发三个指令文件TG 客户端在你打开群组时自动下载它们。三、从文件读取到账户接管Telegram 本地数据用双层密钥加密DEKData Encryption Key数据加密密钥——长随机高熵加密用户数据KEKKey Encryption Key密钥加密密钥——由 passcode 经 KDF密钥派生函数算出加密 DEK 本身Telegram Desktop 默认没有本地 passcode。这意味着 KEK 是从空字符串 salt 派生出来的salt 就明文存着。于是salt, encrypted_DEK read(“tdata/key_datas”)KEK KDF(“”, salt) # 空 passcodeDEK 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:// URLtg://x?a1;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 db3405699f2026-09-17 Telegram Desktop 7.2.9 发布2026-09-30 ZDI 关闭案例披露权返回作者2026-10-03 beaksec 公开 writeup2026-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」是产品决策漏洞——加密本地数据但默认空 passcodesalt 明文存等于没加密changelog 不提安全修复是行业常态——TG 这里不是孤例任何 changelog 都要和 commit diff 一起看三文件复制 完整账户接管——这种「加密但默认空口令」的设计攻击者只需要把攻击降级到「文件读取」就够了九、思考题如果 interpret: scheme 留着但加上调用者身份校验这条链还能闭合吗7.2.9 修复后Telegram Desktop 还能不能通过类似的「默认行为 内部 scheme」组合发起攻击给你 5 分钟源码审计你能找到什么默认无本地 passcode 的设计除了 Telegram 之外还有哪些流行桌面客户端中招

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑