FlawOpen

flawopen.com/Path Traversal/Zip Slip

Apa itu kerentanan Zip Slip?

Reference page
ELI5

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.

VULNERABLE (conceptual)
for entry in zip_file:
    dest = os.path.join(output_dir, entry.name)
    write_file(dest, entry.read())
# entry.name mungkin "../../outside.txt"
PEMERIKSAAN KONTENSI LEKSIKAL — tidak cukup untuk mencegah race condition
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.

Apakah pustaka arsip modern otomatis mencegahnya?

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.

Referensi

Lihat juga Path traversal (CWE-22): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Node.js path.join() tidak mencegah Path Traversal PHP include() dan jalur yang dikendalikan pengguna Perbaikan Path Traversal Python os.path.join()