我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 97.1% 的成绩。 了解更多

深度解析

深度解析

Telegram for Android 语音通话 RCE,已在 12.10.4 修复

Telegram for Android 8.6.2 至 12.10.3 中,受害者接听语音通话后,主叫方即可执行代码。无已知利用。已在 12.10.4 修复。

要点速览

  • Telegram for Android 的一处漏洞允许攻击者通过语音通话在受害者接听后在受害者手机上执行代码,安全公司 NebuSec 于 2026 年 10 月 29 日披露。攻击者只需要一个普通的 Telegram 账户,NebuSec 已在 ARM64 手机上确认了执行效果。截至 2026 年 10 月 29 日,该漏洞没有 CVE 编号,也没有 CVSS 评分。
  • 根据 NebuSec 的说法,从 2022 年 3 月发布的 8.6.2 到 2026 年 9 月发布的 12.10.3,所有版本都受影响。Telegram for iOS 在 5 月的 12.7 中、Telegram Desktop 在 7 月的 7.0.1 中纳入了该修复,因此 Android 是最后一个收到它的平台。
  • 没有已知在真实攻击中的利用:The Hacker News 询问了 NebuSec 和 Telegram 该漏洞是否被利用过,截至 10 月 29 日双方都没有公开回应。当时没有公开的技术分析或概念验证代码;公开的演示是 NebuSec 的视频。
  • 立即将 Telegram for Android 更新到 12.10.4 或更高版本。版本号显示在应用设置页面的底部。

我是否受到影响?

如果您运行的 Telegram for Android 版本在 8.6.2 至 12.10.3 之间,就会受影响。这些版本发布于 2022 年 3 月至 2026 年 9 月之间,因此自 2026 年 9 月底以来未更新过的任何安装都在范围内。

在手机上检查版本:打开 Telegram,打开设置,读取页面底部打印的版本号。在装有旧版本的手机上,Google Play 的 Telegram 页面会显示“更新”按钮。

该漏洞位于通话双方应用互相交换的代码中,因此暴露需要受害者接听一个语音通话。

Telegram for iOS 和 Telegram Desktop 都比 Android 更早发布了库修复(2026 年 5 月的 iOS 12.7,2026 年 7 月的 Desktop 7.0.1)。NebuSec 没有证据表明该漏洞影响它们或群组通话(见常见问题)。

如何修复?

通过 Google Play 更新 Telegram for Android:

  1. 安装 12.10.4 或更高版本。
  2. 打开设置,在页面底部确认版本号。

截至 2026 年 10 月 29 日,Telegram 既没有发布通告也没有提供变通方案,除更新之外没有任何配置能消除该漏洞。

由于该漏洞需要受害者接听,拒接陌生账户的来电可以避开触发条件。但这不会修复漏洞,也不是厂商指引。

对于设备集群,请通过您的移动设备管理工具针对软件包 org.telegram.messenger(Telegram for Android 在 Google Play 上的包名)的 app 报告读取已安装版本。

根本原因是什么?

解析 MediaState 通话消息的代码先验证了一个字段,然后读取另一个可选字段的迭代器,因此一个省略第二个字段的消息会让解析器解引用 map 的末尾迭代器,触碰它不该触碰的内存。

在 Telegram 通话期间,两个应用互相发送短消息来建立通话并报告其状态。其中一种 MediaState 报告麦克风是否静音、摄像头是否开启以及视频如何旋转。

解析代码位于 tgcalls 的内嵌副本中,tgcalls 是 Telegram 的 Android、iOS 和桌面应用用于通话的库,路径为 TMessagesProj/jni/voip/tgcalls/v2/Signaling.cpp。它使用 json11,其 Json::object 是 std::map<std::string, Json>,而 object.find() 在字段不存在时返回 map 的 end() 迭代器。

解析器开头是正确的:它查找可选字段 videoState,如果字段不存在就走默认分支,让 videoState 迭代器指向 end():

const auto videoState = object.find("videoState");
if (videoState != object.end()) {
    ...
} else {
    message.videoState = MediaStateMessage::VideoState::Inactive;
}

漏洞在下一个解析视频旋转的代码块里。它查找 videoRotation,检查该值是数字,然后从错误的迭代器读取旋转值:每一次比较读取的都是 videoState->second,即那个可能不存在的可选字段的迭代器,而不是它刚刚验证过的 videoRotation 迭代器。这是 12.10.3 版本中的代码:

const auto videoRotation = object.find("videoRotation");
if (videoRotation != object.end()) {
    if (!videoRotation->second.is_number()) {
        RTC_LOG(LS_ERROR) << "Signaling: videoRotation must be a number";
        return absl::nullopt;
    }
    if (videoState->second.int_value() == 0) {              // reads videoState, not videoRotation
        message.videoRotation = MediaStateMessage::VideoRotation::Rotation0;
    } else if (videoState->second.int_value() == 90) {      // reads videoState, not videoRotation
        message.videoRotation = MediaStateMessage::VideoRotation::Rotation90;
    } else if (videoState->second.int_value() == 180) {     // reads videoState, not videoRotation
        message.videoRotation = MediaStateMessage::VideoRotation::Rotation180;
    } else if (videoState->second.int_value() == 270) {     // reads videoState, not videoRotation
        message.videoRotation = MediaStateMessage::VideoRotation::Rotation270;
    } else {
        ...
    }
}

一个携带 videoRotation 数字但没有 videoState 字符串的 MediaState 消息(这是解析代码在其他地方本可容忍的形态),会让这些比较解引用 end()。NebuSec 的描述与此吻合:代码“没有正确处理缺失字段,访问了它不该访问的内存”。NebuSec 如何把这次读取变成 ARM64 手机上的代码执行,截至 2026 年 10 月 29 日尚未公布。

如何利用?

没有公开的概念验证代码,因此以下步骤依据 NebuSec 的披露及其演示视频(由 The Hacker News 报道)。

  1. 攻击者只需要一个普通 Telegram 账户,从应用向受害者发起语音通话。
  2. 受害者接听。从这一刻起,两个应用交换承载通话的建立与状态短消息。
  3. 攻击者客户端发送一个针对该漏洞特制的 MediaState 消息:包含 videoRotation 数字,省略可选的 videoState 字段。
  4. 受害者应用解析该消息,验证旋转数字,然后通过指向消息字段之外的 videoState 迭代器读取旋转值。
  5. 解析器读取它不该读取的内存,NebuSec 的演示显示手机落入攻击者控制:通话开始约半分钟后,受害者的手机切换到主屏幕,应用图标从屏幕上落下,出现一个 “HACKED BY NEBUSEC” 标志。

攻击如何展开?

链条只有一条消息长:受害者接听通话,攻击者发送一个带一个字段、缺另一个字段的 MediaState 消息,解析器越过末尾迭代器读取它不该触碰的内存。

flowchart LR A["攻击者发起 Telegram
语音通话"] --> B["受害者接听通话"] B --> C["攻击者发送 MediaState 消息:
videoRotation 存在,
videoState 省略"] C --> D["解析器验证 videoRotation,
然后通过 videoState
迭代器读取"] E["videoState 查找返回 end():
该字段不存在"] --> D D --> F["通过末尾迭代器
越界读取"] F --> G["据 NebuSec,在受害者的
ARM64 手机上执行代码"]

攻击者能做什么?

攻击者可以在受害者接听的通话中,在受害者手机上执行代码,主叫方所需的不过是一个普通 Telegram 账户。NebuSec 在一对一通话中于 ARM64 手机上确认了执行效果。视频显示设备切换屏幕并显示攻击者的标志。

攻击需要的条件:

  • 受害者手机上的 Telegram for Android 版本在 8.6.2 至 12.10.3 之间。使用该消息的通话代码在 8.6.2 版本中启用,这是 NebuSec 点名的第一个版本。
  • 受害者接听一个来电语音通话。用户交互是唯一关卡:漏洞在接听后触发,而不是在响铃时。
  • Android 上的一对一通话:没有任何证据把影响扩展到 Telegram for iOS、Telegram Desktop 或群组通话(见常见问题)。

NebuSec 于 2026 年 10 月 29 日披露了该漏洞。The Hacker News 询问 NebuSec 和 Telegram 该漏洞是否曾在真实攻击中使用。它还询问了攻击者代码能在手机上访问什么。截至 10 月 29 日,两家公司都没有发布答复。

为什么修复有效?

12.10.4 版本中的修复从已验证的迭代器读取旋转值。该代码块中的每次比较都从 videoState->second.int_value() 改为 videoRotation->second.int_value():

if (videoRotation->second.int_value() == 0) {
    message.videoRotation = MediaStateMessage::VideoRotation::Rotation0;
} else if (videoRotation->second.int_value() == 90) {
    message.videoRotation = MediaStateMessage::VideoRotation::Rotation90;
} else if (videoRotation->second.int_value() == 180) {
    message.videoRotation = MediaStateMessage::VideoRotation::Rotation180;
} else if (videoRotation->second.int_value() == 270) {
    message.videoRotation = MediaStateMessage::VideoRotation::Rotation270;
} else {
    ...
}

该代码块在第一次比较前已检查 videoRotation->second 是数字,因此读取同一个值不会再越过消息的字段。同样的四行改动也应用于应用编译的另一份解析器副本 v2_4_0_0/Signaling_4_0_0.cpp,它存在同样的错误。缺失的 videoState 字段仍会回落到默认值 Inactive。

这次修复在不同时间到达各个平台。同一个修正于 2026 年 4 月 21 日进入共享库 tgcalls,提交标题为 “Fix camera rotation”,各平台陆续采纳:Telegram for iOS 从 2026 年 5 月发布的 12.7 版本起包含修正后的库,Telegram Desktop 从 2026 年 7 月发布的 7.0.1 版本起包含。Telegram for Android 在 2026 年 9 月的 12.10.4 中才收到它,因为 Android 应用在 TMessagesProj/jni/voip/tgcalls 中携带自己的库副本,由各平台分别更新。

Android 在共享库修复 156 天后才收到修复
图 1:2026 年 4 月 21 日的 tgcalls 库修复直到 2026 年 9 月 24 日的 12.10.4 才到达 Android 应用。来源:TelegramMessenger/tgcalls 与 DrKLO/Telegram 的提交,2026 年 10 月 29 日核查。

如何检查是否已遭入侵?

不存在入侵指标,因为没有报告任何利用。NebuSec 的披露描述的是漏洞本身,截至 2026 年 10 月 29 日,该公司和 Telegram 都没有表示它被用于攻击任何人。

披露也没有给防御者提供任何可以排查的东西:攻击搭载在与普通通话交换完全相同的 MediaState 消息上,而解析器的越界读取不会留下任何公开来源点名的痕迹。把更新本身当作补救措施,把仍运行 12.10.3 或更早版本的手机视为暴露,而不是已被入侵。

时间线

  • 2022 年 3 月:8.6.2 版本发布,这是 NebuSec 点名的第一个受影响版本,也是据 The Hacker News 源码审查启用了使用该消息的通话代码的版本。
  • 2026-04-21:修正进入共享库 tgcalls,提交为 “Fix camera rotation”。
  • 2026 年 5 月:Telegram for iOS 从 12.7 版本起包含修正后的库。
  • 2026 年 7 月:Telegram Desktop 从 7.0.1 版本起包含修正后的库。
  • 2026-09-17:最后一个受影响版本 Telegram for Android 12.10.3 提交。
  • 2026-09-24:修复该漏洞的 Telegram for Android 12.10.4 提交,The Hacker News 将其发布日期定为 9 月下旬。
  • 2026-10-29:NebuSec 披露该漏洞。

常见问题

哪些版本的 Telegram for Android 受影响?

根据 NebuSec,8.6.2 到 12.10.3 之间的所有版本,即 2022 年 3 月至 2026 年 9 月发布的所有版本。2026 年 9 月 24 日提交的 12.10.4 版本是第一个修复版本,应核对的是 12.10.4 或更高。

Telegram for iOS 或 Telegram Desktop 受影响吗?

尚无实证。三款应用共享漏洞所在的 tgcalls 通话库,但 iOS 从 2026 年 5 月的 12.7 起包含修正后的库,Desktop 从 2026 年 7 月的 7.0.1 起包含,都早于 9 月的 Android 修复。NebuSec 没有证据表明该漏洞直接影响这些应用或群组通话,The Hacker News 声明旧代码在那里是否可被利用尚无证明。

有 CVE 或 CVSS 评分吗?

没有。截至 2026 年 10 月 29 日,该漏洞没有 CVE 编号,也没有公布 CVSS 评分。影响表述来自 NebuSec 的披露:受害者接听通话时,攻击者的代码在受害者手机上运行。

该漏洞正在真实攻击中被利用吗?

截至 2026 年 10 月 29 日,尚无真实攻击中使用的报告;NebuSec 和 Telegram 都没有公开说明该漏洞是否曾被使用。该漏洞不在 CISA 已知被利用漏洞目录中,该目录只跟踪 CVE 编号。

有可以测试的概念验证吗?

只有一段视频。NebuSec 的演示展示了两部手机,一部标记为攻击者,一部标记为受害者,通话开始约半分钟后受害者的手机落入攻击者控制。视频没有展示受害者的手机运行的 Telegram 或 Android 版本,截至 2026 年 10 月 29 日,NebuSec 网站上也没有该漏洞的技术分析。

群组通话会暴露相同路径吗?

没有证据这样说。NebuSec 的披露只覆盖双方通话,即两个应用直接交换 MediaState 消息的场景,该公司没有证据表明群组通话受影响。

使用 Ostorlab 扫描您的 Android 应用

对您开发或分发的 Android 应用运行 Ostorlab 移动扫描:它会分析应用包,包括其内置的原生库,让存在漏洞的组件在版本到达用户之前就被发现。

参考资料

  • The Hacker News《Telegram Android Flaw Lets Attackers Run Code When Users Answer Voice Calls》,2026 年 10 月 29 日,含 NebuSec 的受影响范围、ARM64 确认、iOS 与桌面修复版本,以及对有缺陷与已修复代码的源码级审查:https://thehackernews.com/2026/10/telegram-android-flaw-lets-attackers.html (2026 年 10 月 29 日核查)
  • NebuSec 在 X 上的披露,2026 年 10 月 29 日,由 The Hacker News 引用:https://x.com/nebusecurity/status/2115601122727702634 (2026 年 10 月 29 日核查)
  • Telegram for Android 8.6.2 版本源码,2022 年 3 月 20 日的提交 “Update to 8.6.2”,它将 tgcalls/v2/Signaling.cpp 加入构建,并把通话协议 4.0.0 加入可用版本:https://github.com/DrKLO/Telegram/commit/0abe4541ddbafa65bb79beff5d81c452c7e9626d (2026 年 10 月 29 日核查)
  • Telegram for Android 12.10.3 版本源码,tgcalls 内嵌副本中有缺陷的 MediaStateMessage_parse,2026 年 9 月 17 日的提交 “update to 12.10.3 (7089)”:https://github.com/DrKLO/Telegram/blob/9552e5541e1274b9557c9832b204dbfcaf44b3dc/TMessagesProj/jni/voip/tgcalls/v2/Signaling.cpp#L720-L740 (2026 年 10 月 29 日核查)
  • Telegram for Android 12.10.4 版本源码,已修复的解析块,2026 年 9 月 24 日的提交 “update to 12.10.4 (7099)”:https://github.com/DrKLO/Telegram/blob/c84801762fd5f936c8296ecf09a14a48ebfc4fe4/TMessagesProj/jni/voip/tgcalls/v2/Signaling.cpp#L727-L747 (2026 年 10 月 29 日核查)
  • tgcalls 上游修复提交 “Fix camera rotation”,2026 年 4 月 21 日,同时修改 v2/Signaling.cpp 和 v2_4_0_0/Signaling_4_0_0.cpp:https://github.com/TelegramMessenger/tgcalls/commit/a6ea40ebf18233fad5aae29aa3d30561f839a6a8 (2026 年 10 月 29 日核查)
  • Telegram for iOS 12.7 版本,其 tgcalls 子模块指向该修复提交:https://github.com/TelegramMessenger/Telegram-iOS/tree/release-12.7/submodules/TgVoipWebrtc (2026 年 10 月 29 日核查)
  • Telegram Desktop 7.0.1,2026 年 7 月 14 日发布,是首个 tgcalls 子模块包含该修复的桌面版本:https://github.com/telegramdesktop/tdesktop/releases/tag/v7.0.1 (2026 年 10 月 29 日核查)
  • Google Play 上的 Telegram for Android,页面上的“更新”按钮:https://play.google.com/store/apps/details?id=org.telegram.messenger (2026 年 10 月 29 日核查)
  • CISA 已知被利用漏洞目录 JSON 订阅源,2026 年 10 月 29 日核查该漏洞编号的缺失:https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json