Skip to content
KitploitKITPLOIT
StrumentiBlog
Log in
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
131 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:

# 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:

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:

import cornac.utils.download as d
import io, os, tarfile, tempfile
Scarica lo strumento