安全攻防
morning
Telegram Desktop 漏洞允许任何用户的文件被盗
摘要
Introduction Someone adds you to a Telegram group. A link shows up in the chat. You click it, and your Telegram account is no longer only yours. How? Telegram Desktop hands clicked links to its own al...
the
Telegram
and
that
link
The
running
file
chat
Desktop
2026-10-10
1 阅读
约7分钟阅读
g-b-r
字号:
简介 有人将您添加到 Telegram 群组。聊天中会显示一个链接。你点击它,你的 Telegram 帐户就不再是你一个人的了。如何? Telegram Desktop 通过本地套接字将点击的链接以文本形式传递到其自己已运行的实例,并且永远不会转义用于分隔命令的字符。因此,精心设计的链接不会以一条指令的形式到达:它以多条指令的形式到达。我发现的链条有两个缺陷。第一个是注射。第二个是注入命令所达到的内容:一个内部 URI 方案,解释:,它读取指令文件中指定的文件并将其发送到聊天,而不检查谁请求它,也没有确认。它们一起将点击的链接转换为任意文件读取。在这篇文章中,我将遍历该链,然后使用它来窃取受害者的登录文件。从 7.2.8 开始受影响的 Telegram Desktop,在 Windows (6.9.3) 上已确认影响远程任意本地文件读取,渗漏到攻击者控制的聊天室;帐户接管 CVE CVE-2026-107181 已在 7.2.9 中修复,提交 db3405699f 严重性 8.1 高,CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N 一个链接,两个进程 操作系统让程序注册一个 URI 方案,以便在遇到该链接时知道要启动哪个应用程序善良。 Telegram Desktop 注册 tg 。从那时起,系统知道 tg://... 链接属于 Telegram,并使用 URL 作为命令行参数来启动它。如果 Telegram 未运行,则进程启动,将字符串作为参数,将其转换为 URL 对象并在内部处理:一个进程,无需进行通信。但如果 Telegram 已经在运行怎么办?操作系统既不知道也不检查:它无论如何都会启动一个新进程,与第一个进程相同。 Telegram 本身必须弄清楚它是多余的,而它的解决方法是尝试连接到本地套接字。已经运行的实例是服务器:自启动以来它一直在侦听该套接字。新进程是客户端。如果它成功连接,则实例已经处于活动状态,因此它会移交链接并退出。套接字不携带对象,它携带字节。新进程在内存中保存的 URL 对象无法跨越该通道,因此必须将其展平为一行文本。该操作有一个名称:序列化。它的逆过程是从文本重建对象,即反序列化。每当结构化数据必须跨越边界时,这两种情况都是不可避免的,并且这两种情况都是数据内部的边界不再被结构所保留并成为文本中的字符的确切点。 Telegram 使用自己的一种简单格式来实现这一点。每条指令都是一个关键字,然后是它的参数,然后是一个结束它的分号。要打开的链接变为: tg://x?a=1 与 Telegram 内的处理程序不匹配,因此该链接本身不执行任何操作。它只是一个载体。该行在这里构建,每个要打开的 URL 一个: 1 2 3 4 // sandbox.cpp:295-297 for ( const auto & url : cRefStartUrls ()) {commands += u"OPEN:" _q + url 。 toString(QUrl::FullyEncoded)+';' ;另一方面,正在运行的实例反序列化:它读取接收到的字节,在每个分号处切割它们,并将每个片段本身视为一条指令。对于以 OPEN: 开头的每个部分,它会采用以下内容并将其重建为 URL,就像它刚刚到达命令行一样。 1 2 3 4 5 6 // sandbox.cpp:453-463 (缩写) for ( int32 to = cmds .indexOf ( QChar ( ';' ), from ); to >= from ; ...) { auto cmd = base :: StringViewMid ( cmds , from , to - from ); } ... } else if ( cmd .startsWith( u"OPEN:" _q )) { startUrls 。追加 ( cmds . mid ( from + 5 , to - from - 5 ). mid ( 0 , 8192 ));未转义的分隔符 那么,如果传输的值之一包含自己的分号(该格式用作分隔符的字符),会发生什么情况?获取之前的链接并向其中添加一些内容:新进程将其视为单个 URL,因为对于它来说,分号只是查询中的一个字符。它将其压平并将其写入套接字: 1 OPEN:tg://x?a=1;CMD:quit;正在运行的实例在每个分号处进行切割,并获得两条指令而不是一条: 1 2 OPEN:tg://x?a=1 CMD:quit 这就是注入,它是两个缺陷中的第一个。解释: URI 方案 上面的示例注入了 CMD: ,但不要被名称误导:它只接受 show 和 quit ,所以它能做的最糟糕的事情就是关闭应用程序。总共接受四个命令,其中三个是无害的。第四个是 OPEN: ,有一个细节:它接受任何 URL,没有对方案进行过滤。深入研究代码会发现 Telegram 内部的另一个 URI 方案,称为解释:。操作系统不知道如何处理以 Interpret: 开头的链接,因为它没有在任何地方注册为协议处理程序:它只存在于 Telegram 自己的代码中,它像其他任何方案一样从起始 URL 列表中选取该方案。 1 2 3 4 // application.cpp:1162-1164 if ( url .scheme
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱