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

深度解析

深度解析

SMS of Death:Android 零点击电话服务 DoS 攻击(CVE-2026-58882)

一条畸形的 WAP Push 短信即可让 Android 电话服务进程崩溃并中断通话,包括紧急呼叫;只有 Android 14 至 17 收到了十月修复。

TL;DR

  • 一条畸形的 WAP Push 短信会让 Android 的电话服务进程崩溃,切断任何进行中的通话,包括拨打紧急服务的通话,受害者无需点击,也看不到任何消息。研究人员 Mark B 于 2026 年 10 月 29 日连同可用的概念验证一起披露了该漏洞。
  • 该缺陷可在 Android 12 至 Android 16 上复现,而 Google 只为 Android 14 至 17 提供了修复,随 2026 年 10 月的安全更新发布。Android 12 和 13 设备在 2026 年 10 月占全球 Android 网络流量的 18%,不会收到修复。
  • 影响是拒绝服务,而不是代码执行:手机崩溃、重启,并可能进入最终导致恢复出厂设置的循环。BleepingComputer 报道其编号为 CVE-2026-58882;截至 2026 年 11 月 2 日,公开 CVE 记录尚未收录该编号,截至同日,该缺陷也不在 CISA 的已知被利用漏洞(KEV)目录中。
  • 将所有受支持的设备更新到 2026 年 10 月或更晚的补丁级别。Android 12 和 13 没有补丁;请为无法离开这些版本的设备规划更换或退役。

您是否受影响?

以下条件全部满足时,您处于暴露状态:

  • 设备运行 Android 12 至 Android 17。研究人员在 Pixel 9 和多款三星机型上从 Android 12 到 Android 16 复现了崩溃,受影响代码随这些版本一同发布。
  • 设备尚未收到 2026 年 10 月的安全更新。Google 的修复覆盖 Android 14 至 17;补丁级别为 2026 年 10 月或更晚的设备已受保护。
  • 攻击者知道或能猜到目标手机号。除此之外不需要任何东西:无需安装应用、无需交互、无需事先访问。
分支 状态 修复版本
Android 17 修复前受影响 2026 年 10 月或更晚的补丁级别
Android 16 修复前受影响 2026 年 10 月或更晚的补丁级别
Android 15 修复前受影响 2026 年 10 月或更晚的补丁级别
Android 14 修复前受影响 2026 年 10 月或更晚的补丁级别
Android 13 受影响,未发布修复 无
Android 12 受影响,未发布修复 无

研究人员报告称,崩溃在所有测试设备上以 100% 的比例复现。2026 年 10 月,Android 12 和 13 占全球 Android 网络流量的 18.01%,这些设备运行着相同的电话服务代码,却没有补丁路径。

收不到修复的 Android 13 和 Android 12 合计占全球 Android 网络流量的 18%
图 1:2026 年 10 月全球 Android 版本份额;红色的两根柱形是收不到修复的版本。来源:Statcounter Global Stats,2026 年 11 月 2 日核查

请检查您管理的每台设备的 Android 版本和安全补丁级别:

adb shell getprop ro.build.version.release
adb shell getprop ro.build.version.security_patch

第一条命令输出 Android 版本,例如 14。第二条输出补丁日期,例如 2026-10-08;任何 2026-10-01 或更晚的日期都表示十月的更新已到达该设备。

如何修复?

将每台 Android 14 至 17 的设备更新到 2026 年 10 月或更晚的补丁级别:

  1. 打开设置,进入安全与隐私,检查 2026 年 10 月的安全更新;安装并重启手机。
  2. 确认设备确实带有修复:adb shell getprop ro.build.version.security_patch 必须输出 2026-10-01 或更晚的日期。更新的可用性取决于制造商和运营商,安装完成可能需要重启。
  3. 重新核查设备台账。任何 Android 12 或 13 的设备都没有补丁路径,任何早于 2026 年 10 月补丁级别的设备仍然脆弱。

未打补丁的设备没有任何变通方案。消息在任何可见收件箱之前就被处理,因此任何短信拦截应用、权限更改或飞行模式习惯都无法阻止它。对已中招的设备,"如何检查是否被入侵?"中的恢复步骤会通过 ADB 清除恶意消息;它们不能阻止新的攻击。

根本原因是什么?

一个 WSP 头部长度以 64 位值到达,未经任何范围检查就被强制转换为有符号 32 位整数。 截断后的值随后被用作数组大小。该缺陷位于 WapPushOverSms 的 decodeWapPdu 中,这个组件把入站的 WAP Push 短信转换为 Android intent,属于平台的 frameworks/opt/telephony 部分。

解码过程把头部长度读作 uintvar,即一个最多 5 字节的 WSP 整数,并以 Java long 接收:

// WapPushOverSms.java:217  header length read as long, cast with no bounds check
int headerLength = (int) pduDecoder.getValue32();

随后,同一个值决定头部缓冲区的大小:

// WapPushOverSms.java:244  the cast value is used as an array size
byte[] header = new byte[headerLength];

一条精心构造的消息声明了一个 5 字节的 uintvar,取值 88 80 80 80 00,解码为 long 值 2147483648。转换为有符号 32 位 int 后,它变成 -2147483648。分配 new byte[-2147483648] 会在电话服务主线程上抛出 NegativeArraySizeException,进程随之死亡:

E AndroidRuntime: FATAL EXCEPTION: main
E AndroidRuntime: Process: com.android.phone
E AndroidRuntime: java.lang.NegativeArraySizeException: -2147483648
E AndroidRuntime:   at ...WapPushOverSms.decodeWapPdu(WapPushOverSms.java:244)

修复前的代码在这段解码周围只捕获 ArrayIndexOutOfBoundsException,因此 NegativeArraySizeException 得以逃逸,杀死了 com.android.phone,也就是负责通话、调制解调器连接和短信的进程。

如何被利用?

概念验证已经公开,包含源码和可安装的应用,整个攻击只是一条短消息:

  1. 攻击者向目标的 2948 端口(WAP Push 端口)发送一条数据短信,而不是文本短信。载荷为 8 字节:01 06 88 80 80 80 00 BE,包含一个事务 ID、一个 push PDU 类型、被投毒的头部长度和一个内容类型。
  2. Android 在任何用户可见的收件箱之前把消息交给电话服务栈。InboundSmsHandler.processMessagePart 将其传给 WapPushOverSms.decodeWapPdu,后者把 uintvar 头部长度解析为 2147483648 并转换为 -2147483648。
  3. new byte[-2147483648] 的分配在电话服务主线程上抛出异常。com.android.phone 崩溃,任何进行中的通话都以断开原因 CS_DEATH 终止。
  4. Android 重启电话服务进程,这带来 1 到 2 秒的无服务。由于该短信从未被确认,运营商将重新投递,崩溃不断重复。研究人员测得一条消息造成了长达一周的间歇性中断。
  5. 恶意消息留在原始短信数据库的队列中,每次开机都会重试。大约 20 条消息使测试设备长时间不可用;一台 Android 12 设备大约每 90 秒重启进入恢复模式一次,最终以恢复出厂设置告终。

GitHub 上的概念验证应用从另一台 Android 手机发送构造好的消息。研究人员发布它时警告这是一件可用的武器,并将其许可证限制为授权测试。

攻击如何展开?

一条发往 2948 端口的 8 字节数据短信通过未检查的强制转换让电话服务崩溃,留在队列中的消息让崩溃不断重演。

flowchart LR A["攻击者向 2948 端口
发送 8 字节数据短信"] --> B["在任何收件箱之前
处理 WAP Push PDU"] B --> C["头部长度 uintvar
解码为 2147483648"] C --> D["转换为 int 并用作
数组大小
无范围检查"] D --> E["NegativeArraySizeException
杀死 com.android.phone"] E --> F["包括紧急呼叫在内的
通话中断;
运营商重投不断重复"]

攻击者能做什么?

已证明的影响是对手机蜂窝服务的持续拒绝,披露材料中的任何来源都没有声称代码执行:

  • 进程死亡时任何进行中的通话都会被切断,包括拨打紧急服务的通话。在攻击或由此产生的循环持续期间,手机无法可靠地拨出电话。
  • 每次崩溃带来 1 到 2 秒的电话服务中断。运营商重投把一条消息变成反复崩溃;一条消息就使一台测试设备在一周内持续间歇性失效。
  • 大约 20 条消息使设备不可用,在一台 Android 12 上,队列中的消息导致每 90 秒一次的重启进入恢复模式的循环。研究人员描述的恢复要么需要一套 ADB 清理步骤,要么需要完整的恢复出厂设置。
  • 受害者什么都看不到:数据短信绝不会出现在"信息"应用中,发件人的号码也绝不会显示。这也让攻击在事后难以归因。

条件极为有限:攻击者只需要手机号。不需要应用、权限、交互或网络位置。

修复为什么有效?

Google 的修复是提交 735d9672603fa206c4b43cb668c1aa273db70b97,"Fix remote DoS in decodeWapPdu",编写于 2026 年 6 月 15 日,随 2026 年 10 月的安全更新发布。它没有添加研究人员建议的范围检查;它让崩溃不再致命,也让消息不再幸存:

// WapPushOverSms.java: widen the catch to cover NegativeArraySizeException
-        } catch (ArrayIndexOutOfBoundsException aie) {
+        } catch (RuntimeException e) {
// InboundSmsHandler.java: a failed decode now deletes the poison message
-                    if (processMessagePart(inboundSmsTracker)) {
+                    boolean success = false;
+                    if (inboundSmsTracker != null) {
+                        try {
+                            success = processMessagePart(inboundSmsTracker);
+                        } catch (RuntimeException e) {
+                            loge("Exception delivering message part", e);
+                            deleteFromRawTable(inboundSmsTracker.getDeleteWhere(),
+                                    inboundSmsTracker.getDeleteWhereArgs(), MARK_DELETED);
+                        }
+                    }

NegativeArraySizeException 是一种 RuntimeException,因此放宽的 catch 吞掉了分配失败,并把消息标记为通用错误。InboundSmsHandler 中的配套修改在投递抛出异常时从原始数据库中删除该消息,同时打断运营商重投循环和开机重试循环。该提交带有 Google 的 EXEMPT CVE_FIX 标志,并为 4294967295 的头部长度添加了测试。

这个修复收窄了问题,而没有消除其根源。未检查的强制转换仍留在代码中,畸形头部现在在下游被拒绝,而不是在解析时被校验。这足以阻止 Android 14 至 17 上的崩溃,而 Android 12 和 13 上相同的强制转换仍未修复。

如何检查是否被入侵?

未完成的攻击可能不留下任何痕迹,成功的攻击则留下一部不停崩溃的手机。该缺陷本身的迹象是明确的:

adb logcat -d | grep -i "NegativeArraySizeException"

com.android.phone 下出现 NegativeArraySizeException: -2147483648 就是这段解码失败的签名。恶意消息位于原始短信数据库中,任何普通短信应用都不会显示。列出 WAP Push 记录及其发件人:

adb shell content query --uri content://sms/raw --projection _id:address:destination_port:date:deleted

携带 destination_port=134020(原始数据库中 WAP Push 端口 2948 的编码)且发件人无法解释的记录,就是要删除的消息。下面的恢复步骤由 @sakisdog 贡献并记录在概念验证仓库中;它必须在手机开机后的短窗口内执行:

adb shell cmd appops set com.android.shell WRITE_SMS allow
adb shell "content delete --uri content://sms/raw --where \"address='<SENDER>'\""
adb shell cmd appops set com.android.shell WRITE_SMS default

将 <SENDER> 替换为上面查询得到的地址。如果无法打破循环,最后手段会清除所有短信和彩信并重置 APN 设置:adb shell pm clear com.android.providers.telephony。除非您打算恢复出厂设置,否则不要在恢复提示中选择"wipe data"。

时间线

  • 2026-05-05:Mark B 向 Google 的 Android 与设备漏洞奖励计划报告该缺陷。
  • 2026-06-15:一名 Android 工程师在电话服务框架中编写修复提交 735d9672603fa206c4b43cb668c1aa273db70b97。
  • 2026-10-01:Google 发布 2026 年 10 月安全公告,补丁级别为 2026-10-01 和 2026-10-08。修复随本次更新面向 Android 14 至 17 发布;该缺陷本身未列在公告中。
  • 2026-10-29:Mark B 公开技术分析、概念验证应用与源码,@sakisdog 记录了 ADB 恢复方法。
  • 2026-11-02:公开 CVE 记录仍未收录所报告的编号 CVE-2026-58882,该缺陷也不在 CISA 的 KEV 目录中。

从报告到公开披露历时 177 天,从报告到 10 月 1 日公告历时 149 天
图 2:5 月 5 日的报告、6 月 15 日编写的修复、2026 年 10 月的安全更新和 10 月 29 日的披露。来源:smsofdeath.com 和 AOSP 提交,2026 年 11 月 2 日核查

FAQ

这是远程代码执行吗?

不是。已证明的影响是进程崩溃和随之而来的电话服务拒绝。披露材料中的任何来源都没有声称代码执行,Google 自己的修复提交也将该缺陷定名为远程拒绝服务。

这条消息会出现在"信息"应用里吗?

不会。攻击是发往 2948 端口的数据短信,Android 在它到达任何收件箱之前就在电话服务栈中处理它。受害者永远看不到内容,也永远看不到发件人号码,这也让攻击在事后难以归因。

为什么 Android 12 和 13 没有被修复?

框架的安全更新面向受支持的版本发布,就本缺陷而言是 Android 14 至 17。Android 12 和 13 设备运行相同的电话服务代码,却处在这条更新窗口之外。除非制造商向后移植该修改,这些设备在其剩余使用寿命内将保持脆弱。

怎么知道这个 CVE 编号是对的?

请把它当作已报道但未确认。BleepingComputer 给出的名称是 CVE-2026-58882,而 Google 的修复提交带有 EXEMPT CVE_FIX 标志,这证实确实分配了 CVE。截至 2026 年 11 月 2 日,公开 CVE 数据库和 NVD 仍未收录该记录,因此记录发布时编号可能改变。

运营商能拦截这些消息吗?

已发布的材料中没有描述运营商侧的过滤。畸形值位于普通数据短信的 WAP Push 头部内,因此拦截必须针对该端口或该编码。来源中没有描述任何此类过滤。设备端唯一的保护是 2026 年 10 月的补丁级别。

企业设备资产本周应该做什么?

将每台 Android 14 至 17 的设备更新到 2026 年 10 月的补丁级别,清点报告为 Android 12 或 13 的版本,并规划它们的更换或退役。这些设备无法收到修复,而攻击只需要它们的手机号。

参考文献

  • "SMS of Death" 技术分析,含根本原因、影响和概念验证:https://smsofdeath.com/(2026 年 10 月 29 日发布;2026 年 11 月 2 日核查)
  • 概念验证应用与源码,以及 ADB 恢复的讨论:https://github.com/MarkBlah/smsofdeath(2026 年 10 月 29 日发布;2026 年 11 月 2 日核查)
  • Android 修复提交 735d9672603fa206c4b43cb668c1aa273db70b97,"RESTRICT AUTOMERGE: Fix remote DoS in decodeWapPdu":https://android.googlesource.com/platform/frameworks/opt/telephony/+/735d9672603fa206c4b43cb668c1aa273db70b97(2026 年 6 月 15 日编写;2026 年 11 月 2 日核查)
  • 修复提交处的 WapPushOverSms.java 源码,第 217 行和第 244 行:https://android.googlesource.com/platform/frameworks/opt/telephony/+/735d9672603fa206c4b43cb668c1aa273db70b97/src/java/com/android/internal/telephony/WapPushOverSms.java(2026 年 11 月 2 日核查)
  • Android 安全公告,2026 年 10 月:https://source.android.com/docs/security/bulletin/2026/2026-10-01(2026 年 10 月发布;2026 年 11 月 2 日核查)
  • BleepingComputer,"New Android SMS of Death exploit can remotely crash unpatched phones",CVE-2026-58882 编号的来源:https://www.bleepingcomputer.com/news/security/new-android-sms-of-death-exploit-can-remotely-crash-unpatched-phones/(2026 年 10 月 31 日发布;2026 年 11 月 2 日核查)
  • Statcounter Global Stats,全球 Android 版本份额,2026 年 10 月:https://gs.statcounter.com/android-version-market-share/worldwide(2026 年 11 月 2 日核查)
  • CISA 已知被利用漏洞目录,针对 CVE-2026-58882 核查的数据源:https://www.cisa.gov/known-exploited-vulnerabilities-catalog(2026 年 11 月 2 日核查)