
Preuve de concept d'exploit pour CVE-2025-6554, une vulnérabilité du moteur JavaScript V8 permettant un accès non autorisé à des valeurs 'Hole' non initialisées via le chaînage optionnel, entraînant une confusion de type et une manipulation de mémoire.
CVE-2025-6554 est une vulnérabilité dans l’interpréteur V8 (JavaScript Engine) de Chrome : un contrôle inadéquat du « Hole » dans des variables non intentionnelles au sein d’expressions avec chaînage optionnel. Le POC (CVE-2025-6554-POC.JS) explore une faille du mécanisme de vérification du « Hole » dans les variables avant leur utilisation, permettant la lecture de valeurs non initialisées – un comportement normalement bloqué par une référence.
function leak_hole() {
let x;
delete x?.[y]?.a;
return y;
let y;
}
function pwn() {
let hole = leak_hole();
%DebugPrint(hole);
}
pwn();
let x; et let y; déclarent des variables dans la portée locale.
La ligne delete x?.[y]?. utilise le chaînage optionnel pour accéder à une propriété imbriquée en toute sécurité.
Problème : la variable Y est utilisée avant d’être déclarée, ce qui devrait déclencher une erreur de référence, mais dans la version pré-corrigée de V8, cela échouait silencieusement, permettant de capturer la valeur spéciale appelée « The Hole » (sentinelle pour les variables en TDZ — Zone Morte Temporelle).
La valeur de retour () dans le code ne devrait pas être accessible car Y est toujours en TDZ. Mais la faille le permet.
return yLe mécanisme qui empêche l’accès aux variables en TDZ est ThrowReferenceErrorIfHole.
Avant le correctif, ce mécanisme n’était invoqué qu’une seule fois lors de delete x?.[y]?.
V8 marquait alors en interne que la variable Y avait déjà été vérifiée comme « n’étant pas un hole », mais cette vérification échappait à la portée contrôlée et n’était donc pas réévaluée lors du return y.
Le correctif ajoute un autre appel obligatoire à ThrowReferenceErrorIfHole sur return y, garantissant que toute tentative d’accès à Y avant sa déclaration déclenche correctement une erreur.
Cette vérification était assurée par la portée OilCheckETSCOPE, qui a été incluse dans tous les appels à OptionalChainNullLabelScope.
delete x?.[y]?. → Tentative d’accès à Y (non initialisé) → Échec de la vérification du « Hole »
→ Y s’échappe comme valeur → return y; → Capture de la valeur « Hole » → DebugPrint révèle
L’attaquant, en capturant ce « Hole », peut déduire l’état interne du moteur V8, facilitant des attaques telles que :