🔍 Contexte

Publié le 28 mars 2026 sur le blog de recherche QriouSec, cet article présente une analyse technique approfondie de la vulnérabilité CVE-2025-14325, découverte dans le moteur JavaScript SpiderMonkey de Mozilla Firefox. La découverte a été facilitée par du fuzzing assisté par IA (Claude Code) ciblant la fonctionnalité TypedArray resizable.

🐛 VulnĂ©rabilitĂ© : Type Confusion dans le JIT Baseline

La vulnĂ©rabilitĂ© rĂ©side dans le mĂ©canisme des inline caches (IC) du tier Baseline JIT de SpiderMonkey. Le flux d’exploitation repose sur une fenĂȘtre de rĂ©-entrance :

  • [1] Snapshot de la forme (oldShape) de l’objet avant l’opĂ©ration
  • [2-3] Tentative d’attachement d’un stub IC diffĂ©rĂ©
  • [4] ExĂ©cution de l’opĂ©ration VM — peut dĂ©clencher du JavaScript arbitraire via valueOf()
  • [5-6] Attachement diffĂ©rĂ© via tryAttachAddSlotStub(oldShape)

Durant l’Ă©tape [4], un callback valueOf() appelle SharedArrayBuffer.prototype.grow(), ce qui Ă©tend la longueur d’un TypedArray redimensionnable. Un index prĂ©cĂ©demment hors-limites devient alors valide, retournant un TypedArrayElement au lieu d’un NativeProperty.

⚙ MĂ©canisme de la confusion de types

La classe PropertyResult utilise une union C++ pour stocker le rĂ©sultat d’une recherche de propriĂ©tĂ© :

  • propInfo_ (32 bits) pour NativeProperty
  • typedArrayIndex_ (64 bits) pour TypedArrayElement

En build release, l’assertion MOZ_ASSERT(isNativeProperty()) dans propertyInfo() est compilĂ©e hors, permettant la lecture des 32 bits infĂ©rieurs de typedArrayIndex_ comme un PropertyInfo. Le numĂ©ro de slot contrĂŽlĂ© est ensuite gravĂ© dans le stub IC.

🎯 Contournement du MOZ_RELEASE_ASSERT

Pour passer la garde [9], les 32 bits inférieurs de typedArrayIndex_ doivent correspondre à slotAndFlags_ de la derniÚre propriété. Par exemple :

a r r [ 0 x f f f f f f f f + 0 x 7 0 8 ] = o b j ; l o w e r 3 2 ( 0 x 1 0 0 0 0 0 7 0 7 ) = 0 x 7 0 7 ✓

đŸ’„ Exploitation

L’exploitation complĂšte comprend :

  • Stage 1 (Information Leak) : Lecture de slots arbitraires via le stub IC corrompu pour fuiter des adresses mĂ©moire
  • ContrĂŽle du GC : Utilisation de minorgc() et d’allocations massives d’ArrayBuffer pour contrĂŽler le ramasse-miettes (minor/major GC)
  • Le stub IC corrompu permet une Ă©criture hors-limites sur le buffer de slots dynamiques de l’objet, menant Ă  une exĂ©cution de code arbitraire

📋 Type d’article

Il s’agit d’une analyse technique et d’un rapport de vulnĂ©rabilitĂ© dĂ©taillant la dĂ©couverte, le mĂ©canisme interne et le scĂ©nario d’exploitation complet de CVE-2025-14325 dans Firefox/SpiderMonkey.

🧠 TTPs et IOCs dĂ©tectĂ©s

TTP

  • T1203 — Exploitation for Client Execution (Execution)
  • T1587.004 — Develop Capabilities: Exploits (Resource Development)

IOC

  • CVEs : CVE-2025-14325
  • Chemins : js/src/jit/BaselineIC.cpp
  • Chemins : js/src/vm/PropertyResult.h
  • Chemins : js/src/gc/Nursery.cpp
  • Chemins : js/src/gc/GC.cpp

🔗 Source originale : https://qriousec.github.io/post/cve-2025-14325/