Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
POC-CVE-2026-102282 — CVE-2026-102282: LPE in adm-zip tramite la conservazione dei bit SUID/SGID durante l'estrazione dell'archivio (corretto in 0.6.1) | Kitploit
Strumenti/GitHubGitHub/ahmed-elmahgob/poc-cve-2026-102282
Strumenti DifensiviEscalation di PrivilegiAnalisi StaticaScanner di VulnerabilitàAnalisi delle VulnerabilitàExploitSicurezza della Supply ChainApprendimento e FormazioneRisposta agli Incidenti

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
GitHubahmed-elmahgob/poc-cve-2026-102282

POC-CVE-2026-102282

CVE-2026-102282: LPE in adm-zip tramite la conservazione dei bit SUID/SGID durante l'estrazione dell'archivio (corretto in 0.6.1)

Vedi Repository
21h 7m faNon ancora revisionato
Condividi

CVE-2026-102282 — conservazione di setuid/setgid in adm-zip durante l'estrazione

CVE GHSA CVSS 3.1

Assegnazione errata dei permessi nel pacchetto npm adm-zip. L'estrazione può conservare i bit setuid, setgid e sticky da uno zip non attendibile quando keepOriginalPermission è abilitato, consentendo di collocare su disco un eseguibile setuid di proprietà di root a partire da un archivio fornito dall'attaccante: privilege escalation locale.

Pacchettoadm-zip (npm)
EcosistemaNode.js
CVECVE-2026-102282
AdvisoryGHSA-j5f4-cc29-5x44
CWECWE-732 Incorrect Permission Assignment for Critical Resource
CVSS v3.17.1 High — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
Affette< 0.6.1 (ultima versione affetta nota: <= 0.6.0)
Corretta0.6.1 (11 settembre 2026)
PubblicataAdvisory del maintainer 11 settembre 2026; GitHub Advisory Database 29 settembre 2026

Questo repository contiene il write-up, un verificatore di versione delle dipendenze, un test comportamentale sicuro e una proof of concept autocontenuta costruita attorno a un binario di verifica benigno che stampa soltanto il proprio contesto di credenziali.

Versioni affette

Ogni release precedente alla 0.6.1 è affetta, inclusa la 0.6.0.

IntervalloStato
>= 0 e < 0.6.1Affetta
<= 0.6.0Ultima affetta nota
>= 0.6.1Corretta

Il bug è raggiungibile solo quando tutte queste condizioni sono vere:

  • Il chiamante passa keepOriginalPermission=true a extractAllTo(), extractAllToAsync() o extractEntryTo().
  • Il processo che estrae l'archivio viene eseguito come root, o come un altro utente la cui identità è più privilegiata dell'account che eseguirà successivamente il file estratto.
  • L'archivio non è attendibile (upload, artefatto scaricato, input di build, archivio di dipendenza).

L'estrazione predefinita lascia il flag disattivato e non è affetta. L'estrazione come utente non privilegiato può comunque applicare i bit di modo, ma il file risultante è di proprietà di quello stesso utente, quindi non attraversa un confine di privilegio.

Il bug

I bit di modo Unix risiedono nei 16 bit alti degli attributi esterni di una entry zip. adm-zip copia quei bit sul percorso estratto.

PosizioneRuolo
headers/entryHeader.js — fileAttrLegge il modo Unix dagli attributi esterni
adm-zip.js — extractAllTo, extractAllToAsync, extractEntryToUsa fileAttr quando keepOriginalPermission è true
util/utils.js — chmodSync all'interno dell'helper di scrittura fileApplica quel modo al percorso appena creato
adm-zip.js estrazione di directoryApplica lo stesso modo alle directory estratte

Nella 0.6.0 e precedenti, fileAttr maschera l'attributo shiftato con 0xfff (0o7777). Quella maschera conserva i tre bit speciali insieme ai soliti bit rwx, e nulla nel percorso di scrittura azzera 0o7000 prima di chmod:

// headers/entryHeader.js (<= 0.6.0)
get fileAttr() {
    return (_attr || 0) >> 16 & 0xfff;
}
  • setuid (0o4000)
  • setgid (0o2000)
  • sticky (0o1000)

Il trigger

L'estrazione passa il modo controllato dall'archivio direttamente al filesystem:

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

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

Si noti la firma di chiamata della 0.6.x: extractAllTo(targetPath, overwrite, keepOriginalPermission) accetta un booleano letterale come terzo argomento. Passare un oggetto di opzioni come { keepOriginalPermission: true } viene silenziosamente convertito in false, il che maschera la vulnerabilità in un test invece di dimostrarla. Entrambi gli script PoC in questo repo passano true direttamente.

La correzione

La correzione è il commit 6a63c339 (v0.6.1). fileAttr ora conserva solo i nove bit rwx:

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

Come funziona

  1. Una entry zip memorizza un modo Unix nei suoi attributi esterni (il posto standard, shiftato di 16 bit).
  2. Con keepOriginalPermission=true, l'estrazione legge quel modo tramite fileAttr e lo passa a chmod.
  3. Poiché la maschera è 0o7777, setuid, setgid e sticky sopravvivono.
  4. Se quel chmod viene eseguito come root, il nuovo file è di proprietà di root e può portare setuid. Un'esecuzione successiva da parte di un utente meno privilegiato esegue il codice del proprietario del file come root.
  5. Lo stesso percorso si applica alle directory. Una directory setgid mantiene l'ereditarietà del gruppo per i file creati al suo interno in seguito.

Con il flag lasciato al suo valore predefinito, l'estrazione non applica il modo dell'archivio e i bit speciali non vengono scritti.

Proof of concept

Tutto si trova sotto poc/. Il payload incluso è verify.c, un programma benigno che stampa il proprio uid/gid reale ed effettivo e, nella sua modalità predefinita, apre una shell con l'identità effettiva. Non persiste, non si nasconde e non fa nulla oltre a dimostrare il contesto di credenziali.

FileScopo
poc/verify.cPayload benigno di verifica setuid
poc/build-archive.jsImpacchetta un file in uno zip la cui entry porta il modo 0o4755
poc/extract.jsEstrae un archivio con keepOriginalPermission=true, come farebbe un'app affetta
poc/run-demo.shEsecuzione end-to-end: build, estrazione come root, esecuzione come utente invocante

Eseguirlo

git clone <this repo> && cd CVE-2026-102282
npm install [email protected]        # the version under test
sudo apt install gcc             # if needed

./poc/run-demo.sh                # uses /var/tmp/cve-2026-102282-demo
./poc/run-demo.sh /path/to/out   # or a custom output directory

Output atteso con la 0.6.0:

== 3. extract as root with keepOriginalPermission ==
adm-zip version: 0.6.0
extracted /var/tmp/cve-2026-102282-demo/exploit.zip into /var/tmp/cve-2026-102282-demo/extracted
== 4. result on disk ==
4755 -rwsr-xr-x root:root
== 5. run as the unprivileged user (user) ==
uid=1000(user) ... 
[*] real  uid=1000 gid=1000
[*] eff.  uid=0 gid=0
[+] SUID active: effective uid 0 differs from real uid 1000

Output atteso con la 0.6.1:

== 4. result on disk ==
755 -rwxr-xr-x root:root
== 5. run as the unprivileged user (user) ==
uid=1000(user) ...
[*] real  uid=1000 gid=1000
[*] eff.  uid=1000 gid=1000
[-] effective and real ids match: no SUID context

Avvertenze per la demo:

Scarica lo strumento