Petunjuk dan konteks
Pengguna mengunggah arsip ZIP atau TAR.GZ untuk pemindaian virus di latar belakang, ekstraksi teks, atau impor batch. Penyerang mungkin mengunggah file terkompresi berukuran sangat kecil yang mengembang secara masif, arsip bersarang rekursif, atau path entri yang keluar dari direktori target. Jelaskan batasan unggahan, parsing format, anggaran sumber daya, isolasi, status kegagalan, dan pembersihan (cleanup).
Fokus utamanya adalah keamanan sumber daya selama ekstraksi. Batasan ukuran unggahan bukanlah pertahanan yang lengkap; rasio kompresi, jumlah entri, dan output hasil ekspansi harus menjadi bagian dari perancangan.
Apa yang diuji oleh pewawancara
Pewawancara mengharapkan adanya pembedaan antara byte terkompresi dan biaya ekstraksi. Sertakan anggaran untuk file, kedalaman direktori, penumpukan (nesting), CPU, memori, disk, dan waktu nyata (wall-clock). OWASP merekomendasikan untuk mempertimbangkan ukuran setelah dekompresi; OWASP WSTG mendeskripsikan zip bomb sebagai arsip yang menguras disk atau memori sehingga menyebabkan denial of service.
Jawaban yang kuat mencakup traversal, symlink, nama duplikat, deklarasi ukuran palsu, kerentanan parser, dan pembersihan setelah pembatalan. Worker yang terisolasi, direktori per-tugas, publikasi atomik, dan telemetri menjaga input berbahaya tetap berada di dalam satu tugas yang terbatas.
Jawaban 30 detik
“Saya akan memperlakukan setiap arsip sebagai data yang tidak tepercaya. Edge membatasi byte terkompresi, format, kuota, dan laju permintaan. Worker dalam kontainer terbatas melakukan streaming entri ke direktori sementara khusus tugas sambil menegakkan path entri, kebijakan symlink, jumlah entri, kedalaman nesting, dan anggaran byte hasil ekspansi. Worker ini juga memiliki batas CPU, memori, disk, dan wall-clock. Batas apa pun yang terlampaui akan menghentikan ekstraksi dan memicu pembersihan. Hanya hasil yang telah dipindai dan diperiksa tipenya yang dipublikasikan secara atomik. Respons menampilkan status yang aman, sementara event audit menyimpan kode alasan dan metrik penggunaan tanpa konten mentah.”
Perancangan langkah demi langkah
Langkah 1: Tetapkan batasan input dan tugas
Batasi ukuran terkompresi, konkurensi per pengguna, kuota total, dan laju permintaan. Tetapkan ID tugas, tenant, objek sumber, format, dan status. Simpan file asli di penyimpanan non-executable yang terisolasi; worker menerima akses baca berumur pendek dan tidak pernah memperlakukan data unggahan sebagai kode atau konfigurasi.
Langkah 2: Identifikasi format dan pilih parser
Jangan hanya percaya pada ekstensi atau Content-Type; periksa magic bytes dan allowlist. Pilih library yang terawat untuk ZIP, TAR, dan GZIP serta kunci versinya (pin). Metadata ukuran entri membantu pra-pemeriksaan tetapi tidak dapat menjadi satu-satunya otoritas; tetap hitung byte saat membaca data. Arsip terenkripsi, metode yang tidak dikenal, dan header yang rusak harus ditolak atau ditinjau.
Langkah 3: Terapkan anggaran multidimensi
Tentukan batasan untuk byte terkompresi, byte hasil ekspansi, jumlah file, ukuran file tunggal, kedalaman direktori, kedalaman arsip bersarang, waktu CPU, memori, disk, dan wall-clock. Setiap tugas memiliki batas atas yang ketat (hard ceiling). Rasio kompresi dapat memicu peringatan, tetapi tidak dapat menggantikan penghitungan byte hasil ekspansi karena format dan data memiliki cara kompresi yang berbeda.
Langkah 4: Lindungi path dan objek sistem file
Normalisasi setiap nama entri dan tolak path absolut, traversal, dan null bytes. Ekstrak ke dalam direktori unik khusus untuk tugas tersebut dan verifikasi bahwa setiap path akhir tetap berada di dalamnya. Tolak symlink, hard link, dan file perangkat secara default. Tentukan kebijakan nama duplikat, biasanya penolakan, untuk menghindari masalah urutan penimpaan (overwrite-order).
Langkah 5: Isolasi ekstraksi dan pemindaian
Jalankan worker dalam kontainer berhak istimewa rendah atau sandbox dengan root read-only, kuota disk sementara, dan tanpa atau akses jaringan minimal. Berikan anggaran terpisah untuk ekstraksi dan pemindaian agar satu arsip tidak dapat menghabiskan keduanya secara diam-diam. Tulis hasil pemindaian, teks, dan thumbnail sebagai objek non-executable baru, bukan langsung sebagai unduhan browser.
Langkah 6: Batasi nesting, rekursi, dan pembatalan
Tolak arsip bersarang jika produk tidak membutuhkannya. Jika nesting diperlukan, tetapkan kedalaman maksimum, total anggaran bersama, dan pemeriksaan path di setiap lapisan; rekursi tidak boleh menerima kuota baru. Batas waktu (timeout), pembatalan, worker crash, dan penghapusan tenant semuanya memicu pembersihan idempoten agar tidak ada file sementara yang tersisa.
Langkah 7: Gunakan state machine untuk publikasi dan pemulihan
Status dapat berupa uploaded, inspecting, extracting, scanning, published, rejected, dan cleanup_failed. Publikasikan secara atomik hanya setelah setiap entri lolos pemeriksaan dan pemindaian. Status pengguna yang aman dapat mencakup tindakan berikutnya; event internal menyimpan kode penolakan terstruktur, penggunaan anggaran, dan kesalahan library. Percobaan ulang (retry) tidak boleh melewati anggaran atau memublikasikan dua kali.
Langkah 8: Uji dan amati batasannya
Uji rasio kompresi tinggi, arsip bersarang, traversal, symlink, nama duplikat, header rusak, entri berukuran sangat besar, CRC buruk, file terenkripsi, dan pembatalan di tengah tugas. Ukur byte hasil ekspansi, jumlah file, kedalaman maksimum, CPU, alasan penolakan, latensi pembersihan, batas penggunaan disk sementara (waterline), dan restart worker. Gunakan sampel berbahaya sintetis terhadap versi library persis yang digunakan dalam produksi.
Trade-off, batasan, dan perolehan informasi
Pra-pemeriksaan metadata berbiaya murah tetapi tidak dapat menggantikan penghitung streaming; streaming murni lebih aman tetapi dapat menghabiskan beberapa sumber daya sebelum batas terdeteksi. Menolak nesting adalah yang paling aman, sementara mendukungnya dapat mengakomodasi alur kerja pencadangan dengan konsekuensi anggaran bersama dan pemeriksaan rekursif.
Worker yang terisolasi menurunkan risiko layanan utama tetapi menambah latensi antrean dan biaya operasional. Menyimpan file asli membantu investigasi dan retry, tetapi memerlukan batas retensi, kontrol akses, dan enkripsi. Antrean asinkron bukanlah alasan untuk mengizinkan ekstraksi tanpa batas.
Contoh jawaban berkualitas tinggi
“Saya akan membagi pengunggahan dan ekstraksi ke dalam dua batas kepercayaan. Edge membatasi byte terkompresi, konkurensi, dan kuota. Worker asinkron dalam kontainer tanpa jaringan dan berhak istimewa rendah menggunakan parser yang terawat dan hanya menulis ke direktori tugas. Saat membaca setiap entri, worker menghitung byte hasil ekspansi dan file serta menerapkan batas ukuran file tunggal, kedalaman direktori, kedalaman nesting, CPU, memori, disk, dan anggaran wall-clock.
Path yang dinormalisasi menolak path absolut, traversal, symlink, hard link, dan file perangkat. Jika nesting diperlukan, setiap lapisan berbagi satu anggaran yang sama. Hasil dipindai sebelum publikasi atomik; kelebihan batas, timeout, pembatalan, dan crash semuanya menggunakan pembersihan idempoten. Telemetri mencatat penggunaan anggaran, alasan penolakan, latensi pembersihan, dan disk waterline, dengan menyertakan arsip berbahaya dalam pengujian regresi.”
Kesalahan umum
- Hanya membatasi ukuran unggahan terkompresi. File kecil dapat menguras disk atau memori setelah diekstrak.
- Mempercayai deklarasi ukuran hasil ekspansi. Header bisa saja tidak lengkap atau tidak tepercaya.
- Menggunakan rasio kompresi sebagai satu-satunya aturan. Ini hanyalah sebuah sinyal, bukan anggaran keamanan universal.
- Mengekstrak ke dalam direktori bersama. Traversal, penimpaan file, dan sisa data dapat melintasi batas tenant.
- Mengizinkan symlink atau file perangkat. Entri dapat mengalihkan penulisan ke luar target atau ke antarmuka khusus.
- Memberikan kuota baru untuk setiap lapisan nesting. Rekursi melipatgandakan konsumsi sumber daya.
- Mempublikasikan konten mentah setelah pemindaian. Skrip dan tipe konten yang salah masih dapat menyerang pihak yang mengunduh.
- Melewatkan pembersihan setelah pembatalan. Sisa file dapat memicu insiden kehabisan ruang disk.
Pertanyaan lanjutan dan jawaban
Haruskah pemindaian dilakukan sebelum ekstraksi?
Arsip harus dibaca untuk memindai file di dalamnya, tetapi ekstraksi itu sendiri memerlukan isolasi dan anggaran. Lakukan pemeriksaan format dan metadata terlebih dahulu, lakukan streaming ekstraksi di dalam worker terbatas, lalu pindai setiap hasilnya.
Pada rasio kompresi berapa arsip harus ditolak?
Tidak ada angka universal untuk semua format. Gunakan rasio untuk peringatan atau penolakan dini, sedangkan batasan ketat (hard limits) mencakup byte hasil ekspansi, satu file, jumlah file, CPU, disk, dan wall-clock.
Bagaimana cara mendukung arsip bersarang secara aman?
Tetapkan kedalaman maksimum, gunakan satu anggaran total bersama untuk semua lapisan, ulangi pemeriksaan path dan link, serta jaga rekursi tetap berada dalam kuota waktu dan disk milik worker yang sama.
Bisakah ukuran entri yang dilaporkan parser dipercaya?
Ukuran tersebut merupakan sinyal peringatan, bukan otorisasi. Terus hitung byte saat membaca dan perhitungkan Zip64, header yang rusak, deskriptor data, serta batasan library yang diketahui.
Haruskah tugas yang melebihi batas dicoba ulang?
Pelanggaran anggaran adalah penolakan deterministik dan tidak boleh dicoba ulang secara membabi buta. Coba ulang hanya untuk kegagalan worker yang bersifat sementara (transient), dengan membuat direktori terisolasi baru dengan anggaran yang sama dan status idempoten.