Présentation

Une faille de type zero‑click a été identifiée dans le composant com.android.phone des appareils Android. Un seul SMS de type WAP Push, envoyé en tant que data SMS, suffit à provoquer un plantage du processus téléphonique, même sans aucune interaction de l'utilisateur. Le problème a été reproduit avec un taux de succès de 100 % sur plusieurs modèles, dont le Pixel 9 (firmware d’avril 2026) et divers Samsung Galaxy de la série A.

Mécanisme de l'exploitation

Lors de la réception d’un WAP Push, la méthode WapPushOverSms.decodeWapPdu() lit la longueur de l’en‑tête WSP comme un uintvar. Cette valeur est retournée sous forme de long, puis convertie en int sans contrôle de débordement. Le code concerné est :

// 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];

Un uintvar de cinq octets contenant 88 80 80 80 00 se décode en 0x80000000. Converti en int signé, il devient -2147483648. L’allocation new byte[-2147483648] déclenche une NegativeArraySizeException non interceptée sur le thread principal, entraînant l’arrêt brutal du processus :

E AndroidRuntime: FATAL EXCEPTION: main
E AndroidRuntime: Process: com.android.phone
E AndroidRuntime: java.lang.NegativeArraySizeException: -2147483648

Le plantage interrompt immédiatement les appels en cours, y compris les appels d’urgence.

Impact et persistance

Un seul message suffit à interrompre les communications téléphoniques. L’envoi d’environ trente messages consécutifs crée une condition de course qui corrompt la base SQLite contenant les SMS, rendant le processus com.android.phone incapable de démarrer même après redémarrage. La corruption persiste au-delà d’un reset d’usine : le réseau mobile renvoie le même payload non acquitté, déclenchant à nouveau le crash. Sur les appareils équipés d’eSIM, la migration de la carte vers un autre téléphone n’est pas possible, rendant la récupération pratiquement hors de portée pour un utilisateur non technique.

En Australie, la perte de la capacité d’appeler le numéro d’urgence « 000 » contrevient à la réglementation ACMA qui oblige les opérateurs à bloquer les téléphones incapables d’émettre cet appel et à informer le client sous 28 jours. Le cadre juridique a été renforcé en 2024 après la fin du réseau 3G, soulignant la gravité de ce type de déni de service.

Réponse et mitigation

Le correctif proposé consiste à insérer un contrôle de limites avant la conversion :

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

Ce correctif a été transmis à Google le jour même du premier signalement, mais les équipes de sécurité ont classé la vulnérabilité comme « non‑security issue », la maintenant non corrigée. Le code d’exploitation et le PoC sont disponibles sur GitHub, permettant aux opérateurs, OEM et utilisateurs de mesurer le risque et d’appliquer des mesures d’atténuation temporaires, telles que le filtrage des SMS de type data ou la désactivation du service WAP Push via les paramètres du téléphone.