flawopen.com/Path Traversal/Zip Slip
Apa itu kerentanan Zip Slip?
Arsip ZIP dapat berisi nama seperti ../../outside.txt. Jika pengekstrak memercayainya, berkas dapat ditulis di luar folder tujuan sejauh izin proses mengizinkan.
Mengapa masalah ini mudah terlewat
Mengekstrak arsip tampak rutin, tetapi pembuat ZIP atau TAR yang tidak tepercaya mengendalikan setiap nama entri. Menggabungkan outputDir + entry.name tanpa memvalidasi jalur memungkinkan konten arsip keluar dari direktori tujuan.
for entry in zip_file:
dest = os.path.join(output_dir, entry.name)
write_file(dest, entry.read())
# entry.name mungkin "../../outside.txt"
root = os.path.realpath(output_dir)
os.makedirs(root, exist_ok=True)
for entry in zip_file:
dest = os.path.realpath(
os.path.join(root, entry.name)
)
try:
inside_root = os.path.commonpath([root, dest]) == root
except ValueError:
inside_root = False
if not inside_root:
raise ValueError("Unsafe entry path")
write_file(dest, entry.read())
Pemeriksaan ini mencegah jalur keluar, termasuk nama saudara yang hanya berbagi awalan teks. Ekstrak ke direktori privat yang baru dibuat, tolak entri symlink, dan perhitungkan symlink yang sudah ada atau perubahan sistem berkas serentak; kasus tersebut memerlukan API yang aman terhadap race atau pustaka ekstraksi yang terpelihara.
Pertanyaan umum
API arsip Python memiliki perlindungan jalur yang berbeda
Pasangan kode di atas adalah contoh konseptual loop ekstraksi kustom; itu bukan ZipFile.extractall() bawaan Python. Dokumentasi Python menyebut ZipFile.extract() dan extractall() berupaya mencegah path absolut dan .. keluar dari direktori tujuan, tetapi tetap memperingatkan agar arsip tak tepercaya diperiksa lebih dahulu. zipfile.Path tidak menyanitasi nama anggota, sehingga pemanggil harus memvalidasinya. Filter ekstraksi TAR ditambahkan pada Python 3.12; Python 3.14 mengubah default menjadi filter="data". Pada runtime yang mendukungnya dan mungkin memiliki default yang kurang ketat, tetapkan filter ini secara eksplisit. Filter data pun tidak mencegah semua perilaku tidak aman atau risiko kehabisan sumber daya. Ekstrak ke direktori staging privat yang baru dan batasi ukuran arsip, jumlah anggota, total byte hasil ekstraksi, serta waktu pemrosesan.
Sebagian versi menambahkan perlindungan setelah pola ini ramai dibahas pada 2018; banyak yang tetap tidak memvalidasi jalur secara default. Periksa dokumentasi versi yang digunakan dan validasi setiap entri secara eksplisit.