FlawOpen

flawopen.com/Incidents/bluemoon-chrome-v8-windows-alpc-september-2026

● BlueMoon · CVE-2026-85046 · September 2026 · Haute
Recherche · FlawOpen

BlueMoon : trois failles ont franchi les barrières de Chrome et Windows

Proofpoint a signalé des campagnes ciblées BlueMoon enchaînant CVE-2026-85046 (confusion de types V8), CVE-2026-87491 (évasion du sandbox V8) et CVE-2026-85880 (élévation locale de privilèges dans le noyau Windows). Google et Microsoft ont confirmé une exploitation avant leurs correctifs ; mettez Chromium et Windows à jour séparément.[1], [2], [3], [4]

💡 Explication en Langage Simple (ELI5)

Imaginez une machine qui confirme que toutes les caisses contiennent des livres, puis laisse un visiteur changer leur contenu avant le tri suivant les anciennes étiquettes. Cette erreur ouvre une zone de tri fermée ; une autre ouvre sa grille et une troisième falsifie les badges du bâtiment. Chaque verrou doit être réparé.[1]

Concepts Clés et Termes

V8 / type confusion
V8 exécute JavaScript. CVE-2026-85046 concernait des hypothèses d’optimisation de Array.prototype.sort invalidées lorsque fill() modifiait la nature des éléments.[1], [2]
V8 sandbox / WebAssembly
Le bac à sable V8 isole sa mémoire dans le processus de rendu. CVE-2026-87491 franchissait cette frontière par corruption des métadonnées WebAssembly ; ce n’est pas le bac à sable du processus.[1], [3]
ALPC / WNF / privilege
ALPC et WNF sont des mécanismes du noyau Windows impliqués dans CVE-2026-85880. La chaîne décrite obtenait SeDebugPrivilege, un privilège de débogage des processus.[1], [4]

Correspondances de référentiels

Étapes BlueMoon et décisions de mise à jour

Étape / CVE / frontièreCe que les sources établissentAction défensive
Confusion de types JIT V8 — CVE-2026-85046Proofpoint décrit une mutation du comparateur de Array.prototype.sort via fill() qui invalide l’hypothèse sur le type des éléments. Google a signalé un exploit dans la nature.Installez Chrome/Chromium 152.0.7977.82/.83 (Windows/Mac) ou .82 (Linux), ou une version ultérieure ; redémarrez le navigateur. La version Google du 3 septembre contient le correctif.
Évasion du sandbox V8 — CVE-2026-87491Proofpoint rapporte une corruption de métadonnées WebAssembly franchissant le sandbox mémoire de V8, distinct du sandbox du processus renderer. Google a signalé un exploit dans la nature.Installez Chrome/Chromium 153.0.8010.36/.37 (Windows/Mac) ou .36 (Linux), ou une version ultérieure ; redémarrez le navigateur. La version Google du 8 septembre contient le correctif.
Élévation locale noyau Windows — CVE-2026-85880Proofpoint décrit une voie ALPC/WNF vers SeDebugPrivilege et énumère les anciennes versions Windows visées par le kit. Microsoft confirme une exploitation avant les mises à jour du 8 septembre. Cette liste ne constitue pas l’inventaire complet des versions affectées.Installez les mises à jour de sécurité Windows actuellement prises en charge, y compris celle du 8 septembre 2026 ou une version ultérieure ; consultez MSRC pour le paquet propre à l’OS et effectuez tout redémarrage requis. Corrigez Windows séparément de Chrome.

Chronologie de l'Incident

2026-08-28

Proofpoint a observé BlueMoon pour la première fois.[1]

2026-09-03

Chrome Stable a corrigé CVE-2026-85046 dans 152.0.7977.82/.83 sous Windows et Mac, et .82 sous Linux.[2]

2026-09-08

Chrome Stable a corrigé CVE-2026-87491 dans 153.0.8010.36/.37 sous Windows et Mac, et .36 sous Linux ; Microsoft a corrigé CVE-2026-85880 dans ses mises à jour de septembre. Microsoft a confirmé l’exploitation de CVE-2026-85880 avant les mises à jour Windows du 8 septembre.[3], [4], [5]

Déroulement de l'Attaque Étape par Étape

Étape 1

Mode de diffusion observé

Proofpoint a observé des campagnes de spearphishing ciblées distribuant un lien vers le kit d’exploitation. Les étapes du navigateur exigeaient que la personne ouvre le lien dans un navigateur Chromium vulnérable.[1]

Étape 2

Confusion de types V8 — CVE-2026-85046

Proofpoint décrit un chemin optimisé de Array.prototype.sort dont l’hypothèse de type pouvait être invalidée lorsque le comparateur modifiait le tableau avec fill(). La confusion de types qui en résultait était la première vulnérabilité dans le renderer ; Google a signalé l’existence d’un exploit dans la nature.[1], [2]

Étape 3

Évasion du sandbox V8 — CVE-2026-87491

Proofpoint rapporte une corruption des métadonnées WebAssembly permettant de franchir le sandbox mémoire de V8. Cette frontière est distincte du sandbox du processus renderer ; Google a également signalé un exploit dans la nature.[1], [3]

Étape 4

Élévation locale dans le noyau Windows — CVE-2026-85880

Proofpoint décrit une voie noyau ALPC/WNF utilisée pour activer SeDebugPrivilege dans le renderer sur certaines anciennes versions de Windows. Microsoft a confirmé séparément une exploitation avant ses mises à jour de sécurité du 8 septembre 2026.[1], [4]

Étape 5

Sortie du processus renderer

Avec les étapes navigateur et une cible Windows prise en charge, la chaîne rapportée pouvait sortir du renderer via l’élévation locale Windows et atteindre le processus parent du navigateur. L’exemple Python illustre uniquement l’hypothèse périmée ; il ne reproduit pas la chaîne.[1], [4]

Code Source : Vulnérable vs Sécurisé

Illustration sûre en Python d’une hypothèse invalidée, ni source V8, ni exploit, ni correctif officiel. Une fonction de rappel inoffensive peut remplacer des entiers par du texte après le premier contrôle. La solution valide une copie bornée après le rappel et la consomme sans nouveau rappel. Python lève une exception dans le cas vulnérable ; aucune corruption mémoire native n’est simulée. Seuls des rappels synchrones fiables et bornés conviennent.

IMPLÉMENTATION VULNÉRABLE
def numeric_total(values, callback):
    if type(values) is not list or len(values) > 1024:
        raise ValueError("Invalid batch")
    if any(type(x) is not int for x in values):
        raise ValueError("Expected integers")
    callback(values)
    # Le callback a pu invalider la supposition sur le type.
    return sum(values)
PATCH SÉCURISÉ ET ROBUSTE
def numeric_total(values, callback):
    if type(values) is not list or len(values) > 1024:
        raise ValueError("Invalid batch")
    callback(values)
    if len(values) > 1024:
        raise ValueError("Invalid batch")
    snapshot = tuple(values)
    if any(type(x) is not int or abs(x) > 1_000_000
           for x in snapshot):
        raise ValueError("Expected bounded integers")
    # Consommez l’instantané validé sans autre callback.
    return sum(snapshot)

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources