一条畸形 WAP Push 短信即可导致 Android 上的 com.android.phone 崩溃,造成通话中断(包括紧急呼叫)

Lobsters Hottest 新闻

摘要

一个名为「SMS of Death」的零点击漏洞,只需一条畸形的 WAP Push 短信就能使 Android 的 com.android.phone 进程崩溃,导致通话中断(包括紧急呼叫),并可能因 SQLite 数据损坏而使电话功能彻底瘫痪;Google 将其归类为非安全问题,不予修复。

<p><a href="https://lobste.rs/s/udg9co/single_malformed_wap_push_sms_crashes_com">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/10/29 07:39

# 死亡短信 来源:https://smsofdeath.com/ Android 电话子系统 · 零点击 · 远程拒绝服务 一条畸形的**WAP Push**短信即可使 Android 上的**com.android.phone**进程崩溃,导致正在进行的通话中断(**包括紧急呼叫**),受害者**无需任何操作**。 ⚠ 已验证可用的概念验证代码,仅限授权测试。下载前请先阅读警告与许可证声明 (https://smsofdeath.com/#poc)。 | 组件 | WapPushOverSms | |---|---| | 所属模块 | frameworks/opt/telephony | | 交互 | 无 | | 点击次数 | 零点击,静默 | | 攻击载体 | 远程短信 | | 技术细节 | WAP Push,端口 2948 | | 厂商态度 | ● 不修复,归类为非安全问题 | | 报告人 | Mark Blaszczyk | | 身份 | 独立研究员 | | 报告日期 | 2026 年 5 月 5 日 | | 计划 | Android & Google 设备 VRP | | 公开日期 | 2026 年 10 月 29 日 | | 时间线 | 90 天期限之后 | | CVE | 无,未分配 CVE | ## 01 / 漏洞 ### 一次未检查的类型转换,将 5 字节头部变成负数数组大小 当 Android 收到 WAP Push 消息时,`WapPushOverSms.decodeWapPdu()` 将 WSP 头部长度作为 `uintvar` 读取。该值以 `long` 返回后,未经任何范围检查便被直接强制转换为 `int`,然后用作新建字节数组的大小: ``` // WapPushOverSms.java:217 头部长度以 long 读取,未进行边界检查即转换 int headerLength = (int) pduDecoder.getValue32(); ... // WapPushOverSms.java:244 转换后的值直接用作数组大小 byte[] header = new byte[headerLength]; ``` 一个 5 字节的 uintvar `88 80 80 80 00` 解码结果为 `0x80000000`。转换为带符号的 32 位 `int` 后,其值为 `-2147483648`。执行 `new byte[-2147483648]` 会在电话子系统主线程上抛出未捕获的 `NegativeArraySizeException`,导致 `com.android.phone` 进程被杀死: ``` 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) E AndroidRuntime: at ...WapPushOverSms.dispatchWapPdu(WapPushOverSms.java:339) E AndroidRuntime: at ...InboundSmsHandler.processMessagePart(InboundSmsHandler.java:1169) E AndroidRuntime: at ...InboundSmsHandler$DeliveringState.processMessage(InboundSmsHandler.java:627) ``` 该消息以数据短信的形式送达,不会在界面上显示:收件箱中没有任何记录,受害者也永远不会看到发送方的号码。 ## 02 / 影响 ### 远程、静默,且恢复代价高昂 - **零点击。**受害者无需任何操作。不需要点击、打开或查看通知。 - **静默。**信息应用中不会出现任何内容;攻击者号码永远不会显示。 - **通话中断,包括紧急呼叫。**正在进行的语音通话会在进程重启时以 `DisconnectCause CS_DEATH` 结束。 - **电话服务中断。**每收到一条消息,`com.android.phone` 重启期间会出现 1-2 秒的服务中断。 - **运营商重投递会放大影响。**未确认的消息会被运营商重发,导致手机反复崩溃;测试中,单条消息造成的间歇性中断最长持续一周。 - **约 20 条消息**即可使设备在相当长时间内无法使用。 - **持久拒绝服务。**快速连续投递消息会破坏 SMS 存储背后的 SQLite 数据库,将瞬时崩溃变为每次开机都会崩溃的手机(详见下文)。 已在多种品牌和型号上测试(Pixel 9 搭载 2026 年 4 月固件、多款 Samsung Galaxy 和 A 系列),复现率为 100%。 ### 从 2 秒崩溃到变砖:SQLite 竞态条件 单条消息只造成反复的瞬时中断。快速连续发送载荷(约 30 条消息)则后果严重得多:崩溃与电话子系统对 SMS 存储的写入操作交错发生,触发**竞态条件,破坏了存储设备消息的 SQLite 数据库**。 一旦数据库损坏,`com.android.phone` 就不再需要收到新消息才会失败:**每次开机时**读取到损坏的数据库后便会**立即崩溃**。此时手机将持久丧失电话功能,重启也无法恢复。 恢复过程极其困难,这也是问题的关键所在:**恢复出厂设置只能暂时解决问题**,因为运营商会重新投递未确认的载荷,再次触发崩溃。完整恢复需要: - 取出实体 SIM 卡并插入**非 Android 设备**(如 iPhone),使运营商的重试消息被确认并停止重投递; - 然后通过 **ADB** 清除 SMS 记录/损坏的数据库。 对于使用 **eSIM** 的设备,SIM 卡无法简单地转移到另一部手机上,恢复将更加困难;对非技术用户而言,实际上无法恢复。 这正是本报告的核心论点。这不是一次瞬时崩溃:它是**一种远程、零点击、持久的拒绝服务攻击,需要恢复出厂设置(甚至更多操作)才能恢复**,这恰好符合 Android VRP 规则中对"破坏性远程拒绝服务"的定义。 ## 03 / 为何这很严重 ### 远程攻击者可以切断手机与 Triple Zero 的联系 当被拨打的电话中包含紧急服务时,中断通话就不再只是不便。当设备正在遭受此攻击,或已被 SQLite 损坏导致变砖时,它无法可靠地拨打 **000**。该攻击是远程的,只需要受害者的号码,且不会给受害者留下任何痕迹。 澳大利亚将紧急呼叫接入视为移动服务的强制性属性,而非可选功能。根据由 **ACMA** 管理的**《电信(紧急呼叫服务)裁定》(https://www.acma.gov.au/consultations/2024-09/proposal-amend-ecs-determination)**,运营商必须**识别无法拨打 Triple Zero 的手机,协助客户迁移到正常设备,并停止为受影响的手机提供服务**。Telstra 明确表示 (https://www.telstra.com.au/support/mobiles-devices/3g-determination),其有义务屏蔽无法再拨打 000 的手机,并通知客户;如 28 天内未采取措施,则屏蔽该设备。 其后果是反直觉的:对无法拨打 000 的手机,监管补救措施是**将其断网**,而非修补操作系统。因此,能够远程使 Android 手机陷入该状态的攻击者,实际上可以让受害者自己的设备被运营商停服,直到修复方案出现为止。这项法规的存在正是因为它认为失去紧急呼叫接入是一种公共安全失效;而这个漏洞可以按需制造这种失效。 该框架已于 2024 年 (https://oia.pmc.gov.au/published-impact-analyses-and-reports/requirements-identify-and-manage-mobile-phones-unable-access) 在 3G 关停后收紧,当时部分手机仍能拨打普通电话但无法接通紧急服务——与本漏洞产生的功能状态完全相同。 来源:ACMA:ECS 裁定修正提案 (https://www.acma.gov.au/consultations/2024-09/proposal-amend-ecs-determination) · Telstra:紧急呼叫服务裁定 (https://www.telstra.com.au/support/mobiles-devices/3g-determination) · 总理与内阁部:影响分析 (https://oia.pmc.gov.au/published-impact-analyses-and-reports/requirements-identify-and-manage-mobile-phones-unable-access) ## 04 / 修复 ### 一次边界检查即可 修复方案是在 `WapPushOverSms.java`(第 217 行)(https://android.googlesource.com/platform/frameworks/opt/telephony/+/refs/heads/main/src/java/com/android/internal/telephony/WapPushOverSms.java#217) 中,在类型转换前添加范围检查。该修复在首次报告当天即提供给 Google: ``` long rawHeaderLen = pduDecoder.getValue32(); if (rawHeaderLen < 0 || rawHeaderLen > pdu.length) { result.statusCode = Intents.RESULT_SMS_GENERIC_ERROR; return result; } int headerLength = (int) rawHeaderLen; ``` ## 05 / 披露时间线 ### 与 Google 的沟通 该报告通过 Android & Google 设备 VRP 提交,并作为误判申诉重新提交两次。历经三个工单和四位工程师,Google 均将其归类为非安全问题。 | 日期 | 提交方 | 状态变更 | |---|---|---| | 2026 年 5 月 5 日 | 研究员 | 提交报告:`WapPushOverSms` 中的零点击 WAP Push 崩溃(问题 509520497)。当天提供修复建议。 | | 2026 年 5 月 5 日 | Android 安全团队 | 分派调查;要求研究员遵循协调披露流程。 | | 2026 年 5 月 15 日 | 研究员 | 请求提高优先级:已在 5 部设备上复现,存在紧急呼叫影响,援引澳大利亚运营商法规。 | | 2026 年 6 月 20 日 | Android 安全团队 | 关闭,**不修复(不可行)**:"不是安全漏洞。" | | 2026 年 6 月 20 日 | 研究员 | 澄清这是远程持久拒绝服务;约 20 条消息可永久禁用手机。重新提交申诉(问题 525810560 和 525816147,"SMS of DEATH")。 | | 2026 年 6 月 20 日 | Android 安全团队 | 重新提交的 525810560 在 3 分钟内关闭,**不修复(无法复现)**。 | | 2026 年 6 月 22 日 | 研究员 | 报告快速投递导致 SQLite 损坏 → 开机即崩溃;恢复需要将 SIM 卡换至非 Android 设备并使用 ADB。 | | 2026 年 6 月 23 日 | Android 安全团队 | 询问披露计划;提醒 90 天 VRP 时间线并要求提前审阅任何文章。 | | 2026 年 6 月 23 日 | 研究员 | 同意为公共安全暂缓公开;提出可向澳大利亚运营商进行通报以便安排屏蔽。重申一行代码的修复方案。 | | 2026 年 7 月 2-3 日 | Android 安全团队 | 申诉被标记为原始报告的**重复**;重新评估确认为同一根因。 | | 2026 年 7 月 16 日 | Android 安全团队 | 该问题在 Discord 上曝光后重新打开原始报告,随后再次确认为重复。 | | 2026 年 7 月 16 日 | 研究员 | 补充细节:该行为符合 VRP 自身对"破坏性远程拒绝服务"的判定标准。 | | 2026 年 7 月 17 日 | Android 安全团队 | 确认收到补充信息;将再次审阅:"将有 4 位工程师评估该报告。" | | 2026 年 10 月 27 日 | 研究员 | 三个月沉默后请求状态更新。 | | 2026 年 10 月 29 日 | Android 安全团队 | 最终决定:**不修复**,引用"未达到严重性阈值……被认定为非安全问题(NSI)。" | **为何公开。**该问题曾以私密方式报告,并远远超过 VRP 的 90 天窗口。Google 在三个工单和四位工程师的评估中均拒绝修复,将一种远程、零点击、可中断紧急呼叫的拒绝服务归类为非安全问题。现予以完全公开,以便用户、运营商和下游 OEM 评估风险并采取缓解措施。 ## 06 / 概念验证 ### 源代码与 APK 概念验证 Android 应用和完整源代码已发布在 GitHub 上。该应用会构造畸形的 WAP Push PDU,并将其作为数据短信发送至目标号码。 **警告:这是一件可用的武器。**该仓库包含一个可以远程破坏和变砖手机的概念验证代码。发布目的严格限于安全研究、教育和防御性测试。 **仅针对您拥有或明确授权测试的设备运行。**对他人使用属于犯罪行为;在澳大利亚和大多数国家,干扰他人联系紧急服务(000)的能力属于严重刑事犯罪。 本软件按"原样"提供,不附带任何明示或暗示的担保,依据 [Apache License 2.0](https://github.com/MarkBlah/smsofdeath/blob/main/LICENSE) 发布。**作者不对任何使用、滥用或损害承担责任。**下载 APK 或源代码即表示您对自身行为承担全部责任。

相似文章

在 Android 上一键执行 MMI

Lobsters Hottest

安全研究员披露 Android 拨号器应用中的漏洞,利用 CALL_PHONE 权限可在几乎无需用户交互的情况下静默执行 USSD/MMI 代码,例如设置呼叫转移等运营商级操作,且执行过程不写入通话记录。

WeWorm: 零点击微信蠕虫

Hacker News Top

WeWorm 是一种零点击蠕虫漏洞利用程序,通过微信通话在 iOS 和 Android 系统间传播,可能危及超过十亿个账户。它在 AI 辅助下开发,突显了高级攻击正日益变得易于技能较低的攻击者实施的风险。

Pixel 10 的零点击利用链

Hacker News Top

谷歌 Project Zero 发布了针对 Pixel 10 的零点击利用链,利用 Dolby 漏洞和新 VPU 驱动缺陷实现 Android 根权限获取。

EX-ARRR:航行于零点击之海

Lobsters Hottest

一位安全研究员描述发现苹果的EXR文件解析器中存在一个零点击堆溢出漏洞,该漏洞允许通过iMessage远程入侵iOS设备,无需任何用户交互。