
POC bientôt disponible
Une vulnérabilité critique d'exécution de code à distance dans Google Chrome (versions 123 et antérieures) affectant la gestion des types de garbage collection de WebAssembly (WASM). Le bug permet une confusion de type qui peut être escaladée en lecture/écriture mémoire arbitraire et, au final, en exécution de code.
La vulnérabilité provient d'une confusion entre les identifiants de types canoniques isorécursifs WASM et les représentations wasm::HeapType / wasm::ValueType utilisées dans les fonctions de conversion JavaScript vers WASM.
Point crucial, un identifiant de type canonique n'est pas lié à kV8MaxWasmTypes de quelque manière que ce soit — il peut croître jusqu'à la limite de la mémoire de l'hôte.
La classe ValueType encode les types de tas dans un champ de 20 bits, mais les identifiants de types canoniques peuvent dépasser cette limite. Lorsqu'un identifiant de type canonique tel que :
tn = t0 + 0x100000 * n
est tronqué à 20 bits, il devient un alias de t0, ce qui permet une attaque par confusion de type.
De plus, les identifiants de types canoniques correspondant à kAny + 0x100000 * n (où kAny = 1000005) contournent les vérifications de types et permettent une confusion de types WASM arbitraire.
L'avis décrit l'exploitation en trois phases :
La création de modules WASM avec plus de 1 000 000 de types provoque le bouclage des identifiants de types canoniques, permettant une confusion entre les types de structures et les types de référence. Les types de structures spécialement conçus pour correspondre par alias à kAny contournent les vérifications de types JS vers WASM.
En modifiant les champs du backing store de ArrayBuffer, l'attaquant obtient une écriture à adresse arbitraire dont la valeur écrite est l'adresse des métadonnées. Cela exploite les structures SlotSpanMetadata pour fuiter des adresses de chrome.dll et réaliser des écritures mémoire arbitraires.
L'exploit détourne la CodePointerTable et fait pivoter l'exécution vers une chaîne ROP qui rend exécutables les zones du shellcode.
La preuve de concept démontre :
kAny pour contourner les vérifications de types JS vers WASM.Il s'agit d'une variante de CVE-2024-2887, découverte par Manfred Paul et présentée à Pwn2Own Vancouver 2024. Elle exploite une faiblesse similaire de canonisation des types via un vecteur différent.
Google Chrome 123 et versions antérieures.
Corrigé dans Google Chrome 124.
Seunghyun Lee (Xion, @0x10n), participant à TyphoonPWN 2024.