SMS of Death: zero-click Android telephony DoS

Technische details

  • Component: WapPushOverSms (frameworks/opt/telephony)
  • Interactie: Geen (zero-click, stil)
  • Vector: Remote SMS WAP Push, poort 2948
  • Status leverancier: Won't Fix (geclassificeerd als Non-Security)
  • Rapporteur: Mark Blaszczyński (onafhankelijk)
  • Gerapporteerd: 5 mei 2026 (Android & Devices VRP)
  • Openbaar gemaakt: 29 oktober 2026 (na een tijdlijn van 90 dagen)
  • CVE: Geen CVE uitgegeven

---

01 / De kwetsbaarheid

Een ongecontroleerde cast zet een header van 5 bytes om in een negatieve array-grootte

Wanneer Android een WAP Push-bericht ontvangt, leest WapPushOverSms.decodeWapPdu() de WSP-headerlengte als een uintvar. De waarde wordt teruggegeven als een long, wordt zonder bereikcontrole gecast naar een int, en wordt vervolgens direct gebruikt als de grootte van een nieuwe byte-array:

// WapPushOverSms.java:217  headerlengte gelezen als long, gecast zonder bounds check
int headerLength = (int) pduDecoder.getValue32();
...
// WapPushOverSms.java:244  de gecaste waarde wordt gebruikt als array-grootte
byte[] header = new byte[headerLength];

Een uintvar van 5 bytes bestaande uit 88 80 80 80 00 decodeert naar 0x80000000. Gecast naar een signed 32-bit int, is dit -2147483648. Het alloceren van new byte[-2147483648] veroorzaakt een niet-opgevangen NegativeArraySizeException op de hoofdthread van de telefonie, waardoor com.android.phone wordt afgesloten:

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)

Het bericht wordt afgeleverd als een data-SMS en wordt nooit aan de gebruiker getoond: er verschijnt niets in de inbox en het slachtoffer ziet het nummer van de afzender nooit.

---

02 / Impact

Remote, stil en alleen met aanzienlijke inspanning herstelbaar

  • Zero-click: Het slachtoffer hoeft niets te doen. Geen tik, geen openen, geen notificatie.
  • Stil: Er verschijnt niets in de berichten-app; het nummer van de aanvaller wordt nooit getoond.
  • Gesprekken breken af: Actieve spraakoproepen, inclusief noodoproepen, worden beëindigd met DisconnectCause CS_DEATH terwijl het proces herstart.
  • Telefonie-blackout: Per bericht is er 1 tot 2 seconden geen service terwijl com.android.phone herstart.
  • Versterking door provider-herlevering: Niet-bevestigde berichten worden opnieuw verzonden door de provider, waardoor de telefoon opnieuw crasht. In tests veroorzaakte één enkel bericht intermitterende storingen tot een week lang.
  • Onbruikbaar toestel: Ongeveer 20 berichten maken het apparaat voor een langere periode onbruikbaar.
  • Permanente Denial of Service: Snelle herhaalde levering corrumpeert de SQLite-database achter de SMS-opslag. Hierdoor verandert een tijdelijke crash in een telefoon die crasht bij elke opstart (zie hieronder).

Deze kwetsbaarheid is getest op meerdere merken en modellen (Pixel 9 met firmware van april 2026, diverse Samsung Galaxy en A-series) met een reproductiesnelheid van 100%.

Van een crash van 2 seconden naar een "brick": de SQLite race

Een enkel bericht zorgt voor een tijdelijke storing. Het snel opeenvolgend verzenden van de payload (ongeveer 30 berichten) is echter veel erger: de crashes vallen samen met de schrijfacties van de telefonieprovider naar de SMS-opslag, wat leidt tot een race condition die de SQLite-database met de berichten van het apparaat corrumpeert.

Zodra de database corrupt is, heeft com.android.phone geen nieuw bericht meer nodig om te falen: hij crasht onmiddellijk bij elke opstart tijdens het lezen van de beschadigde opslag. De telefoon is nu permanent zonder telefoniefuncties en een herstart lost dit niet op.

Het herstel is complex: een fabrieksreset helpt slechts tijdelijk, omdat de provider het niet-bevestigde bericht opnieuw verzendt en de crash opnieuw triggert. Volledig herstel vereist het volgende:

  1. De fysieke SIM-kaart verwijderen en plaatsen in een niet-Android-toestel (bijv. een iPhone), zodat de opnieuw verzonden berichten van de provider worden bevestigd en stoppen met opnieuw verzenden.
  2. Vervolgens de SMS-records / de corrupte database wissen via ADB.

Bij een toestel met een eSIM, waarbij de SIM niet simpelweg naar een ander toestel kan worden verplaatst, is herstel aanzienlijk moeilijker en voor een niet-technische gebruiker effectief onmogelijk.

Dit is het cruciale onderscheid in het rapport. Het is geen tijdelijke crash, maar een remote, zero-click, persistente denial of service die een fabrieksreset (en meer) vereist voor herstel. Dit komt exact overeen met de definitie van een "Destructive Remote DoS" in de eigen regels van het VRP.

---

03 / Waarom dit ernstig is

Een remote aanvaller kan een telefoon afsluiten van nooddiensten

Het verbreken van gesprekken is geen ongemak wanneer een van die gesprekken naar de nooddiensten gaat. Terwijl een apparaat onder deze aanval staat, of is "gebrickt" door SQLite-corruptie, kan het niet betrouwbaar bellen naar 000 (Triple Zero). De aanval is remote, vereist alleen het nummer van het slachtoffer en toont het slachtoffer niets.

In Australië wordt toegang tot noodoproepen beschouwd als een verplichte eigenschap van een mobiele dienst. Onder de Telecommunications (Emergency Call Service) Determination, beheerd door de ACMA, zijn providers verplicht om mobiele telefoons te identificeren die 000 niet kunnen bereiken, de klant te helpen overstappen naar een werkend toestel en de dienstverlening aan het getroffen toestel te staken. Telstra stelt expliciet dat zij verplicht zijn telefoons die 000 niet meer kunnen bellen te blokkeren, de klant te informeren en het apparaat te blokkeren als er binnen 28 dagen niets wordt gedaan.

De consequentie is paradoxaal: de wettelijke oplossing voor een telefoon die 000 niet kan bereiken, is om deze van het netwerk af te sluiten, niet om het OS te patchen. Een aanvaller die deze conditie remote kan opwekken op een Android-toestel kan dus effectief ervoor zorgen dat het toestel van het slichtoffer door de provider wordt geblokkeerd totdat er een fix is. De regelgeving bestaat juist omdat het verlies van toegang tot noodoproepen wordt beschouwd als een falen van de openbare veiligheid; deze bug produceert dat falen op verzoek.

Het kader hiervoor is in 2024 aangescherpt na de uitschakeling van 3G, waardoor sommige telefoons gewone gesprekken konden voeren maar geen noodoproepen, wat precies de functionele staat is die deze kwetsbaarheid produceert.

Bronnen: ACMA: proposed amendments to the ECS Determination; Telstra: Emergency Call Service Determination; Dept. of PM&C: impact analysis.

---

04 / De oplossing

Eén bounds check

De oplossing is een bereikcontrole vóór de cast in WapPushOverSms.java (regel 217), die op de dag van het eerste rapport aan Google is verstrekt:

long rawHeaderLen = pduDecoder.getValue32();
if (rawHeaderLen < 0 || rawHeaderLen > pdu.length) {
    result.statusCode = Intents.RESULT_SMS_GENERIC_ERROR;
    return result;
}
int headerLength = (int) rawHeaderLen;

---

05 / Tijdlijn van openbaarmaking

Communicatie met Google

Het rapport werd ingediend via het Android & Google Devices VRP en tweemaal opnieuw ingediend als een beroep tegen een foutieve triage. Over drie tickets en vier engineers verspreid, classificeerde Google het als een non-security issue.

  • 5 mei 2026 (Onderzoeker): Rapport ingediend: zero-click WAP Push crash in WapPushOverSms (issue 509520497). Voorgestelde fix dezelfde dag verstrekt.
  • 5 mei 2026 (Android Security): Toegewezen voor onderzoek; onderzoeker gevraagd om gecoördineerde openbaarmaking te volgen.
  • 15 mei 2026 (Onderzoeker): Verzoekt om hogere prioriteit: gereproduceerd op 5 toestellen, impact op noodoproepen, Australische provider-regelgeving.
  • 20 juni 2026 (Android Security): Gesloten als Won't Fix (Infeasible): "geen beveiligingskwetsbaarheid."
  • 20 juni 2026 (Onderzoeker): Verduidelijkt dat dit een remote permanente DoS is; ~20 berichten schakelen de telefoon permanent uit. Dien opnieuw in als beroep (issues 525810560 en 525816147, "SMS of DEATH").
  • 20 juni 2026 (Android Security): Herindiening 525810560 binnen 3 minuten gesloten als Won't Fix (Not Reproducible).
  • 22 juni 2026 (Onderzoeker): Rapporteert SQLite-corruptie door snelle verzending → crash bij opstarten; herstel vereist SIM-swap naar een niet-Android-toestel + ADB.
  • 23 juni 2026 (Android Security): Verzoekt om plannen voor openbaarmaking; herinnert aan de 90-dagen VRP-tijdlijn en vraagt om eventuele teksten vooraf te reviewen.
  • 23 juni 2026 (Onderzoeker): Stemt in met wachten in het belang van de openbare veiligheid; biedt aan om Australische providers te informeren zodat zij een blokkade kunnen plannen. Herhaalt de one-line fix.
  • 2-3 juli 2026 (Android Security): Beroep gemarkeerd als duplicaat van het origineel; herbeoordeling bevestigt dezelfde bronoorzaak.
  • 16 juli 2026 (Android Security): Origineel heropend nadat het probleem op Discord naar voren kwam, daarna opnieuw bevestigd als duplicaat.
  • 16 juli 2026 (Onderzoeker): Voegt detail toe: het gedrag voldoet aan het "Destructive Remote DoS"-criterium van het VRP.
  • 17 juli 2026 (Android Security): Erkent de extra context; triage gaat er opnieuw naar kijken: "4 engineers hebben het rapport geëvalueerd."
  • 27 oktober 2026 (Onderzoeker): Verzoekt om een statusupdate na drie maanden stilte.
  • 29 oktober 2026 (Android Security): Definitieve beslissing: Won't Fix, met de reden dat het "niet voldoet aan de ernst-drempel ... beschouwd als een Non-Security Issue (NSI)."

Waarom dit openbaar is: Het probleem is privé gemeld en zeer lang vastgehouden, ruim voorbij het VRP-venster van 90 dagen. Google weigerde het op te lossen over drie tickets en vier engineers, en classificeerde een remote, zero-click, noodoproep-onderbrekende denial of service als een non-security issue. Volledige openbaarmaking volgt zodat gebruikers, providers en downstream OEM's het risico kunnen inschatten en beperken.

---

06 / Proof of Concept

Broncode & APK

De proof-of-concept Android-app en de volledige broncode zijn gepubliceerd op GitHub. De app maakt de foutieve WAP Push PDU aan en verzendt deze als een data-SMS naar een doelnumer.

Waarschuwing: Dit is een functioneel wapen. De repository bevat een proof-of-concept die mobiele telefoons op afstand kan verstoren en onbruikbaar maken. Het is strikt gepubliceerd voor beveiligingsonderzoek, educatie en defensieve tests.

Voer dit alleen uit op apparaten die u bezit of waarvoor u expliciet bent geautoriseerd om te testen. Het gebruiken hiervan tegen anderen is een misdrijf, en het hinderen van de mogelijkheid van een persoon om nooddiensten (000) te bereiken is een ernstig strafbaar feit in Australië en de meeste andere landen.

De software wordt geleverd "as is", zonder garantie, onder de Apache License 2.0. De auteur aanvaardt geen aansprakelijkheid voor enig gebruik, misbruik of schade. Door de APK of de broncode te downloaden, aanvaardt u de volledige verantwoordelijkheid voor wat u ermee doet.