Telegram Desktop 缺陷允许隐藏 JavaScript 从 HTML 导出文件中窃取消息
- 浏览次数 2015
- 喜欢 0
ExPatch 安全研究人员在 9 月 12 日发布的文章中表示,Telegram Desktop 中的一个缺陷使机器人的消息能够在用户导出为 HTML 文件的聊天中植入隐藏 JavaScript。
在 Telegram 中,该消息看起来很普通,带有一个链接按钮,脚本只有在有人用网页浏览器打开导出文件时才会运行。随后它可以将该文件中的每一条消息复制到攻击者控制的服务器,或重写页面所显示的内容。
Telegram 于 7 月发布了修复程序,但应用更新不会更新用较早版本导出的文件,因此旧的 HTML 导出文件仍可能携带该脚本。
Telegram Desktop 是 Telegram 面向 Windows、macOS 和 Linux 的应用,可将单个聊天或账户中的所有聊天保存为可在浏览器中打开的 HTML 页面。机器人可以在其消息下方附加多行按钮(Telegram 称之为 inline keyboard),并由机器人选择每个按钮上显示的文字。
研究人员 Denis Rostilov 和 Aleksander Rostilov 发现,在修复之前,导出代码将该按钮文字直接写入 HTML 页面而未进行转义。
转义会将 < 等字符进行转换,使浏览器将其显示为文本而非将其当作代码处理,导出功能对消息文本、发送者姓名和其他字段应用了转义。
因此,机器人可以在按钮文字中放入一个 script 标签,并用不可见字符填充,使按钮在研究人员测试的 Telegram Desktop 版本中看起来是空的。
该机器人无需位于其针对的聊天中。研究人员发现,一条只有网页链接按钮的消息在被转发时会保留这些按钮,因此任何将该机器人消息转发到群组的成员都会将脚本一并带入。该消息随后像其他消息一样留在聊天历史中,直到被删除,并可能在数月或数年后被导出。
他们于 6 月 3 日(即发现该缺陷两天后)向 Telegram 报告,并称仅在自己的账户和测试群组中进行了测试。他们的文章并未声称有人针对真实用户利用过该缺陷。
研究人员表示,当包含该消息的导出文件被打开时,脚本无需任何进一步点击即会运行。它可以读取该文件中的每一条消息,包括发送者姓名和时间戳、聊天的名称、类型和成员数,以及本地文件路径,并将它们全部发送到攻击者的服务器。
Telegram Desktop 的导出代码将较长的导出拆分为每个包含 1,000 条消息的文件,因此单个文件最多暴露其自身内容,而非整个聊天或 Telegram 账户。
该脚本还可以重写页面。在研究人员的演示中,它将整个导出替换为一个伪造的 Telegram "验证"表单。
研究人员称,同样的控制能力可以更改用作记录的文件中的日期、发送者或消息文本。它不会更改 Telegram 自身的聊天副本或保存在磁盘上的导出文件。
研究人员将该缺陷在 CVSS 3.1 量表上评为 8.2 分(满分 10 分),截至 9 月 14 日,Telegram 或美国国家漏洞数据库 (NVD) 均未给出评分。
脚本运行需满足三个条件:HTML 导出文件是使用修复之前的 Telegram Desktop 版本生成的、携带脚本的消息位于导出的聊天范围内,且该文件在启用了 JavaScript 的浏览器中被打开。
研究人员仅检查了 Telegram Desktop 的 HTML 导出,未涉及 JSON 导出格式或 Telegram 其他应用的导出功能。
转发的机器人消息是否最终进入导出文件取决于导出的方式。从单个聊天的菜单导出会包含每位成员的消息。根据导出代码和 Telegram 的文档,全账户导出默认只包含账户所有者在群组和频道中自己的消息,但包含一对一聊天和与机器人聊天中的所有消息。
修复由 Telegram Desktop 开发者 John Preston 提交的 commit 8457d13a,补上了缺失的转义。它于 6 月 30 日编写,于 7 月 3 日进入 6.9.4 beta 版,并于 7 月 14 日进入 7.0.1 稳定版,这是在 GitHub 上发布的首批已修复版本。未转义的代码行自 2024 年 3 月的 4.15.1 起就存在于稳定版本中,历时约两年四个月。
- 受影响版本:Telegram Desktop 4.15.1(2024 年 3 月)至 6.9.3
- 已修复版本:6.9.4 beta(2026 年 7 月 3 日)、7.0.1(2026 年 7 月 14 日)及更高版本
研究人员建议用户:
- 将 Telegram Desktop 更新至 7.0.1 或更高版本,或在 beta 渠道更新至 6.9.4 或更高版本。
- 更新后,重新导出在修复之前导出为 HTML 的所有聊天,或仅在禁用 JavaScript 的情况下打开旧文件。
- 将修复之前生成的任何 HTML 导出视为不可信,尤其是来自大型群组的导出,因为其中每条消息的来源都难以核实。
- 在应用更新之前,没有理由创建新的 HTML 导出,因为只有由旧代码生成的导出文件才携带该缺陷。
截至 9 月 14 日,Telegram 尚未为持有旧导出文件的用户发布任何指导。
无公告,无 CVE
6.9.4 和 7.0.1 的发布说明、应用的更新日志以及 Telegram 7 月 14 日的更新公告均未提及该修复,且 GitHub 上的 Telegram Desktop 仓库也未列出任何安全公告。
该缺陷也没有 CVE 编号。研究人员指出,截至 9 月 11 日,The Hacker News 于 9 月 14 日对公开漏洞数据库的搜索未发现任何编号。
研究人员称,Telegram 于 7 月 1 日确认了该缺陷,并提供了 500 美元的漏洞赏金,他们予以拒绝并要求将其捐给慈善机构。他们要求商定一个协调发布的日期,并承诺在补丁发布前保持沉默。
"我们也考虑过公开披露的可能性,但我们无法批准,因为披露即使已修复的问题也可能在未来使更多 Telegram 用户面临风险。例如,如果有关漏洞的信息被公开,恶意行为者可能试图利用它,从而给 Telegram 用户造成经济损失,"Telegram 支持团队在 7 月 1 日的一封电子邮件中写道,研究人员将其作为截图发布。
研究人员将此解读为即使在修复之后也拒绝允许发布。他们称没有任何保密协议覆盖他们的报告,并在补丁发布后的 9 月 12 日发布了文章。
Telegram 公布的漏洞赏金规则称,"在修复之前向公众或第三方披露"的漏洞不符合赏金资格。该页面未提及修复之后的发布。