Contexte et objectifs

En août 2026, l’équipe de recherche XBOW a construit une chaîne d’exploitation complète contre Google Chrome en six jours (du 2 au 7 août). Le travail a été récompensé par le premier bounty de 250 000 $ du programme VRP introduit en avril 2026. Pour accélérer le processus, les chercheurs ont mobilisé des agents d’IA basés sur le modèle gpt-5.6-sol d’OpenAI, générant environ 40 000 $ de frais d’API.

Vulnérabilités exploitées

La chaîne repose sur trois failles distinctes :

1. Bug du compilateur Maglev (V8) : lors de la déoptimisation, le compilateur réutilise un HeapNumber mutable comme littéral constant. Le code vulnérable, extrait de maglev-code-generator.cc, crée un objet HeapNumber puis le stocke dans le tableau de littéraux :

void BuildHeapNumber(const VirtualObject* vobject) {
    DCHECK_EQ(vobject->object_type(), vobj::ObjectType::kHeapNumber);
    ValueNode* value_node = vobject->get(offsetof(HeapNumber, value_));
    return BuildHeapNumber(value_node->Cast<Float64Constant>()->value());
}
void BuildHeapNumber(Float64 number) {
    DirectHandle<Object> value = local_isolate_->factory()->
        NewHeapNumberFromBits<AllocationType::kOld>(number.get_bits());
    translation_array_builder_->StoreLiteral(GetDeoptLiteral(*value));
}

Le second fragment, issu de translated-state.cc, copie l’objet entier dans le stockage reconstruit, violant l’invariant que les HeapNumber doivent rester immuables :

if (marker == kStoreHeapObject) {
    DirectHandle<HeapObject> field_value = slot->storage();
    WRITE_FIELD(*object_storage, offset, *field_value);
    WRITE_BARRIER(*object_storage, offset, *field_value);
    continue;
}

Cette incohérence permet de modifier un champ double utilisé comme offset, contournant les vérifications de limites et révélant des pointeurs internes de V8.

2. Décodage WebP animé : le moteur Blink exploite une propriété du sandbox V8 qui n’est pas vérifiée. En combinant des géométries mises en cache avec des octets d’image modifiés, l’exploit déclenche un débordement qui sort du pointer‑compression cage de V8, ouvrant la porte à une écriture native hors du sandbox.

3. Bug de Crashpad : Crashpad, le gestionnaire de crash de Chrome, traite une lecture échouée depuis le renderer comme une observation stable. Un dépassement de tampon dans Crashpad écrit en dehors du sandbox du renderer, permettant l’exécution de code dans le processus de crash non sandboxé, donc sur l’hôte.

Mécanique de la chaîne d’exploitation

Le flux d’attaque suit trois frontières : d’abord la cage de pointeurs de V8 (4 GiB de région réservée), ensuite le sandbox du renderer (processus OS), enfin le gestionnaire Crashpad hors sandbox. La première vulnérabilité fournit un contrôle de lecture/écriture dans la cage, révélant les adresses de fonctions natives. La deuxième vulnérabilité utilise ces adresses pour écrire un pointeur vers du code contrôlé dans la mémoire du renderer, franchissant le sandbox interne. La troisième vulnérabilité exploite un overflow dans Crashpad pour injecter ce code dans le processus de crash, obtenant ainsi une exécution native non restreinte.

Rôle de l’IA et coût de l’opération

Les agents d’IA ont automatisé la recherche de code source, la génération de preuves de concept et la validation des hypothèses. Chaque agent a travaillé sur une campagne parallèle : recherche de vulnérabilités, corruption V8, échappement du sandbox, intégration finale. Cette approche modulaire a permis de remplacer rapidement un composant défaillant sans reconstruire l’ensemble. Le coût total des appels API, estimé à 40 000 $, montre que l’utilisation massive d’IA reste économiquement viable pour des programmes de récompense de plusieurs centaines de milliers de dollars.