Android 零點選遠端 DoS:WAP Push 觸發無聲崩潰
Zero click, silent, remote Android DoS
一封被篡改的 WAP Push SMS 會在 Android 裝置上無需任何使用者操作即造成遠端 DoS,甚至可將手機永久性破壞。
- 漏洞原理:未檢查的長度轉型導致負數陣列大小,觸發 NegativeArraySizeException,終止 com.android.phone。
此研究揭示 Android WAP Push 遠端 DoS 漏洞的實現與影響,幫助安全團隊評估系統脆弱性與修補策略,並提供實用的 PoC 與修補建議,促進快速響應與防禦部署。
Android 通訊 · 零點選 · 遠端 DoS
一條格式錯誤的 WAP Push SMS 會在 Android 上使 com.android.phone 失效,導致正在進行的通話(包括緊急呼叫)掉線,且 受害者不需要任何互動。
⚠ 這是工作中的概念驗證,僅授權測試。下載前請先 閱讀警告與授權條款。
- 元件
- WapPushOverSmsframeworks/opt/telephony
- 互動
- 無零點選、靜默
- 攻擊向量
- 遠端 SMSWAP Push, port 2948
- 供應商狀態
- ● 不修復分類為非安全漏洞
- 報告者
- Mark Blaszczyk獨立
- 報告日期
- 5 May 2026Android & Devices VRP
- 公開日期
- 29 Oct 2026經過90天時間表後
- CVE
- 無未釋出 CVE
01 / 漏洞
未檢查的型別轉換會將 5 位元組的標頭轉為負數陣列大小
當 Android 接收 WAP Push 訊息時,WapPushOverSms.decodeWapPdu() 將 WSP 標頭長度讀為 uintvar。該值回傳為 long,並被無範圍檢查地轉成 int,接著直接作為新 byte 陣列的大小使用:
// 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];88 80 80 80 00 的 5 位元組 uintvar 解析為 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)該訊息以資料 SMS 送達,且永遠不會顯示給使用者:收件箱中沒有任何內容,受害者也看不到發件人號碼。
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 無法簡單移動到另一臺手機,恢復會更困難,對非技術使用者而言,基本無法解決。
報告聚焦於此區別。這不是一次短暫的崩潰:它是一個 遠端、零點選、持續性拒絕服務,需要恢復出廠設定(以及更多)才能復原,這正是 VRP 規則中所稱的「破壞性遠端 DoS」的典型形式。
\n 03 / 為何這件事嚴重\n
遠端攻擊者可以將手機從 Triple Zero 切斷
在這些電話中,如果其中一個是緊急服務,則中斷呼叫並非不便。當裝置受到此攻擊或因 SQLite 損毀而被鎖定時,無法可靠撥打 000。此攻擊遠端,僅需受害者號碼,且不會顯示任何資訊。
澳洲將緊急呼叫的存取視為行動服務的必備屬性,而非可選功能。根據由 ACMA 管理的 Telecommunications (Emergency Call Service) Determination,運營商須 辨識無法連線 Triple Zero 的行動電話,協助客戶轉換至可用裝置,並停止為受影響裝置提供服務。Telstra 明確表示,必須封鎖無法撥打 000 的電話,並在 28 天內未採取行動時通知客戶並封鎖該裝置。
後果相當反常:對於無法撥打 000 的電話,監管補救措施是 將其切斷網路,而非修補作業系統。因此,能遠端觸發此狀況的攻擊者實際上可以讓受害者的手機被運營商封鎖,直到修正方案出現。此規範之所以存在,是因為失去緊急呼叫存取被視為公共安全失效;此漏洞正是按需製造此失效。
此框架於 2024 年在 3G 停服後被 加強,使得部分手機能夠撥打普通電話但無法連線緊急服務,與此漏洞所產生的功能狀態相同。
來源:ACMA:ECS Determination 的建議修正 · Telstra:Emergency Call Service Determination · Dept. of PM&C:影響分析
\n 04 / 修正方法\n
一個邊界檢查
修正方案是在 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;\n 05 / 揭露時間表\n
與 Google 的溝通
此報告透過 Android & Google Devices VRP 提交,並以錯誤分流上訴的方式重新提交兩次。經由三個工單和四名工程師,Google 將其歸類為非安全問題。
研究人員\n Android Security Team\n 狀態變更\n
- 5 May 2026研究人員報告提交:
WapPushOverSms中的零點選 WAP Push 崩潰(問題 509520497)。同日提供建議修正。 - 5 May 2026Android Security已指派進行調查;研究者被要求遵循協調披露流程。
- 15 May 2026Researcher要求提升優先順序:已在 5 臺手機上重現,影響緊急電話,符合澳洲電信業者規範。
- 20 Jun 2026Android Security已關閉 不修復 (不可行):"不是安全漏洞。"
- 20 Jun 2026Researcher澄清這是遠端永久性 DoS;約 20 條訊息會永久性停用手機。重新提交為上訴(問題 525810560 與 525816147,"SMS of DEATH")。
- 20 Jun 2026Android Security重新提交 525810560 在 3 分鐘內關閉 不修復 (無法重現)。
- 22 Jun 2026Researcher報告 SQLite 由於快速傳送導致損毀 → 開機時崩潰;恢復需將 SIM 卡換到非 Android 裝置並使用 ADB。
- 23 Jun 2026Android Security要求披露計畫;提醒 90 天 VRP 時間表,並請提前審核任何說明。
- 23 Jun 2026Researcher同意為公共安全保留;願意向澳洲電信業者說明,讓他們能安排封鎖。再次重申單行修正。
- 2-3 Jul 2026Android Security上訴被標記為原件的 重複;重新評估確認相同根本原因。
- 16 Jul 2026Android Security原件在 Discord 上曝光後重新開啟,隨後再次確認為重複。
- 16 Jul 2026Researcher補充細節:此行為符合 VRP 自身的 "Destructive Remote DoS" 標準。
- 17 Jul 2026Android Security確認額外背景;分流將再次審視:"4 位工程師將評估此報告。"
- 27 Oct 2026Researcher三個月無回覆後請求進度更新。
- 29 Oct 2026Android Security最終決定:不修復,引用 "不符合嚴重性門檻 ... 被視為非安全問題(NSI)。"
為何此事公開。此問題曾以私下方式報告,並超過 VRP 的 90 天視窗期才被處理。Google 在三張工單和四位工程師中拒絕修復,將此遠端零點選、切斷緊急電話的拒絕服務歸類為非安全問題。以下為完整說明,讓使用者、電信業者及下游 OEM 能評估風險並採取對策。
\n 06 / 概念驗證\n
來源 & APK
這個概念驗證的 Android 應用程式及完整原始碼已發布在 GitHub。該應用程式會製造格式錯誤的 WAP Push PDU,並將其以 data SMS 送到目標號碼。
警告:這是一把可用的武器。此倉庫包含一個概念驗證,可遠端幹擾並鎖定手機。它僅為安全研究、教育及防禦測試而發布。
僅在您擁有或已明確授權測試的裝置上執行。對他人使用此程式構成犯罪,且幹擾任何人使用緊急服務(000)的權利,在澳洲及大多數國家構成嚴重刑事罪行。
此軟體以「現況」提供,並無任何保固,採用Apache License 2.0。作者對任何使用、濫用或損害不承擔任何責任。下載 APK 或原始碼即表示您對其使用負全部責任。