
Toolkit pour transformer des vulnérabilités Chromium en exploits fiables, multiplateformes et de bout en bout.
Un toolkit pour transformer des vulnérabilités Chromium en exploits cross-platform fiables, complets et de bout en bout.
Ce projet fournit un ensemble de scripts d'aide puissants, mais nécessite que vous apportiez vos propres vulnérabilités. Vous êtes responsable de l'implémentation des primitives d'exploitation minimales ; le toolkit s'occupe de tout le reste.
Une chaîne d'exploit personnalisée repose sur le fichier de script main.js, qui vous permet d'inclure sélectivement vos vulnérabilités aux côtés des scripts d'aide du toolkit :
// Exploit settings
let loglevel = 5;
let run_in_worker = false;
// Exploit chain
async function main() {
// Common helpers
await include("kit/common/convert.js");
await include("kit/common/dom.js");
await include("kit/common/stability.js");
await include("kit/common/v8-utils.js");
await include("kit/common/versions.js");
await include("kit/common/wasm-module-builder.js");
// Symbols database for your exploit chain
await include("vulns/symbols.js");
// Early fingerprinting
await include("kit/fingerprint/d8.js");
await include("kit/fingerprint/useragent.js");
// Your initial V8 memory corruption
// This should craft addrOf() & fakeObj() primitives
await include("vulns/memcor/your-code.js");
// Bootstrap stage-2 primitives & gain memory read/write inside the V8 SBX
await include("kit/v8/cage.js");
// Your V8 sandbox escape
// This should craft arbRead() & arbWrite() primitives AND leak some pointers
await include("vulns/v8sbx/your-code.js");
// Utils to manipulate the renderer memory
await include("kit/v8/memory.js");
// Achieve code execution (automatically select the best method based on the leaked pointers)
await include("kit/v8/rwx/egghunt.js");
await include("kit/v8/rwx/isolate.js");
await include("kit/v8/rwx/partitionalloc.js");
await include("kit/v8/rwx/wasmrwx.js");
await include("kit/v8/rwx.js");
// Bootstrap stage-3 primitives & provide generic shellcodes
await include("kit/shellcodes/x64.js");
await include("kit/shellcodes/x64-win.js");
await include("kit/shellcodes/x64-linux.js");
// Precise fingerprinting
await include("kit/fingerprint/win.js");
await include("kit/fingerprint/linux.js");
// Enable MojoJS and other protected flags
await include("kit/renderer/mojo.js");
// Your sandbox escape
await include("vulns/sbx/your-code.js");
}
/*
Other customizable features are implemented here
(logging, clean exit handling, exploit reloading, scripts execution context...)
...
*/
Lisez la documentation pour un aperçu complet des fonctionnalités disponibles.
Une page web de test est fournie dans index.html.
Elle affiche les journaux, gère les crashs et permet au script principal d'inclure des fichiers depuis les sous-dossiers du projet.
Vous pouvez l'exécuter localement avec python3 server.py, puis naviguer vers http://localhost:8000.
La page web monitor.html fournit une interface simple pour surveiller et tester des exploits à distance.
Elle affiche les hôtes distants, les journaux d'exploits et les statistiques d'erreurs.
Elle permet également d'envoyer des commandes aux hôtes distants, y compris des rechargements d'exploits et un mode de test de charge (stress-test).
Pour le développement précoce d'exploits, vous pouvez également exécuter le script d'exploit principal dans d8 : d8.exe main.js.
Une fois une chaîne d'exploit prête, des outils sont fournis pour automatiser diverses tâches :
build.py pour compiler l'exploit en un script uniquedownload.py pour télécharger des versions spécifiques de Google Chromesymbols.py pour l'analyse automatisée des PDBQuelques exploits pour des vulnérabilités publiques sont fournis pour illustrer les fonctionnalités du toolkit :
| Vulnérabilité | Versions affectées (Chrome Stable) | Détails |
|---|---|---|
| CVE-2024-11114 | 94 - 130 (Windows uniquement) | La souris peut être contrôlée via l'interface Mojo IPC startDragging() pour exécuter des fichiers téléchargés et s'échapper du sandbox |
Une chaîne d'exploit de démonstration est fournie dans le main.js par défaut. Elle repose sur les vulnérabilités suivantes :
Cette chaîne d'exploit fonctionne directement (out-of-the-box) sur tout Chrome 130 stable et les versions étendues jusqu'à 130.0.6723.160. Elle peut être facilement étendue à M128, M129 et M131 (< 131.0.6778.264) en ajoutant des symboles.
Les exploits peuvent également être testés à distance depuis la page web de surveillance :

Ce toolkit est destiné strictement à la recherche en sécurité. En soi, il ne fournit aucun élément permettant d'exploiter des vulnérabilités non divulguées dans le projet Chromium. L'utilisation de ce toolkit à des fins malveillantes relève de votre seule responsabilité.
Les versions publiques sont sous licence GNU AGPLv3. Plus précisément, le commerce d'exploits privés basés sur ce toolkit n'est pas autorisé dans le cadre de ces conditions. Les commits antérieurs à la première version publique peuvent ne pas être sous licence et sont protégés par les lois sur le droit d'auteur par défaut.
Ce projet inclut des composants sous licence tierce : voir ici pour plus de détails.
| Vulnérabilité | Versions affectées (Chrome Stable) | Détails |
|---|
| CVE-2024-7971 | <= 127 | Confusion de types WASM lors de ParallelMove dans Liftoff |
| CVE-2025-0291 | 128 - 131 (< 131.0.6778.264, composant vulnérable distribué via Finch) | Confusion de types dans WasmGCTypeAnalyzer de Turboshaft sur les boucles à bloc unique |
| CVE-2025-2135 | 133 - 134 (< 134.0.6998.88) | Confusion de types sur les objets aliasés dans TransitionElementsKindOrCheckMap |
| CVE-2025-5419 | <= 136 (kill-switch Finch depuis 133) | Accès mémoire hors limites en raison d'une élimination invalide store-store sur des index dynamiques |
| Vulnérabilité | Versions affectées (Chrome Stable) | Détails |
|---|
| 352689356 | <= 131 | Confusion de signatures de fonctions WASM dans call_ref de TurboFan non inline |
| 379140430 | <= 132 | Confusion de types de signature lors du tier-up WasmToJsWrapper avec corruption Tuple2 dans le sandbox |
| 395659804 | <= 134 | Exécution de code arbitraire via une confusion OSR DeoptimizationData |
| 421403261 | 134 - 137 (< 137.0.7151.119, x64 uniquement) | Collision de hachage de signature i32/i64 dans Liftoff |