- Operator blog pribadi mengirim Zip Bomb berbasis gzip sebagai respons HTTP kepada bot berbahaya untuk mengurangi pemindaian kerentanan, spam, dan scraping konten
- Memanfaatkan alur Accept-Encoding: gzip, deflate yang digunakan browser dan crawler normal; untuk permintaan mencurigakan, server mengembalikan
200 OK dan Content-Encoding: gzip
- File gzip 1MB akan membesar menjadi sekitar 1GB saat didekompresi, sedangkan file 10MB menjadi sekitar 10GB, sehingga banyak bot kehabisan memori atau menghentikan permintaan
- Middleware server memeriksa IP daftar hitam dan pola spam; jika memenuhi kondisi, server mengirim file Zip Bomb yang sudah dibuat sebelumnya lalu mengakhiri pemrosesan permintaan
- Karena mudah dideteksi dan dilewati, ini bukan pertahanan yang sempurna, tetapi cukup untuk menahan bot sederhana yang mengganggu server dengan crawling membabi buta
Latar belakang penggunaan lalu lintas bot dan Zip Bomb
- Sebagian besar lalu lintas web berasal dari bot, dan ada juga penggunaan sah untuk menemukan konten baru seperti RSS reader, crawler mesin pencari, dan bot AI
- Masalahnya adalah bot berbahaya yang dijalankan oleh spammer, scraper konten, dan peretas
- Di tempat kerja sebelumnya, bot mencari kerentanan WordPress dan menyisipkan skrip berbahaya ke server
- Server tersebut kemudian menjadi bagian dari botnet yang digunakan untuk DDoS
- Salah satu situs web awal sepenuhnya dikeluarkan dari hasil Google Search karena spam yang dibuat oleh bot
- Setelah pengalaman tersebut, penulis mulai menggunakan Zip Bomb untuk melindungi server dari bot berbahaya
Cara mengubah kompresi gzip menjadi sarana pertahanan
- Zip Bomb adalah file terkompresi kecil yang saat didekompresi mengembang menjadi file yang sangat besar dan membebani mesin
- Pada masa awal web, kompresi gzip diperkenalkan untuk mengurangi jumlah data yang dikirim di lingkungan internet lambat
- Jika file HTML 50KB diperkecil menjadi 10KB, transfer data dapat dihemat 40KB
- Pada internet dial-up, ini berdampak mengurangi waktu unduh halaman dari 12 detik menjadi 3 detik
- Browser memberi tahu metode kompresi yang didukungnya melalui header saat mengirim permintaan
Accept-Encoding: gzip, deflate
- Jika server juga mendukung kompresi, server mengembalikan versi terkompresi dari data yang diharapkan
- Bot crawling web juga mendukung kompresi seperti gzip untuk mengumpulkan data dalam jumlah besar, dan karakteristik ini dimanfaatkan sebagai pertahanan
Respons yang dikirim untuk permintaan berbahaya
- Di blog, bot yang memindai kerentanan keamanan sering muncul, dan sebagian besar diabaikan
- Jika permintaan dinilai mencoba menyisipkan input berbahaya atau menelusuri respons, server mengirim respons gzip bersama
200 OK
Content-Encoding: gzip
- Ukuran file yang dikirim berkisar 1MB–10MB tergantung situasi
- File 1MB membesar menjadi sekitar 1GB saat didekompresi
- File 10MB membesar menjadi sekitar 10GB saat didekompresi
- Bot melihat header dan menganggapnya sebagai file terkompresi, lalu mencoba mendekompresi untuk menemukan isinya
- Saat file terus mengembang, memori terkuras dan server atau skrip dapat crash
- Untuk skrip bandel yang tidak cukup dihentikan dengan file 1MB, penulis mengirim file 10MB; dalam kasus ini skrip disebut langsung berhenti
Contoh pembuatan Zip Bomb dan penerapannya di server
- Saat membuat Zip Bomb, Anda harus menanggung risiko karena dapat membuat perangkat sendiri crash atau rusak
- File gzip yang terurai menjadi 10GB dibuat dengan perintah berikut
dd if=/dev/zero bs=1G count=10 | gzip -c > 10GB.gz
- Susunan perintahnya adalah sebagai berikut
dd: perintah untuk menyalin atau mengonversi data
if=/dev/zero: menggunakan file khusus yang menghasilkan aliran byte 0 tanpa batas sebagai input
bs=1G: menetapkan ukuran blok menjadi 1GB
count=10: memproses 10 blok 1GB untuk menghasilkan data nol sebesar 10GB
gzip -c > 10GB.gz: mengompresi data keluaran dengan gzip dan menyimpannya sebagai file 10GB.gz
- Dalam kasus ini, ukuran file hasilnya sekitar 10MB
- Di server, ditambahkan middleware yang memeriksa apakah permintaan saat ini berbahaya
- Memelihara daftar hitam IP yang berulang kali memindai seluruh situs
- Pola setelah meninggalkan spam lalu kembali memeriksa apakah spam tersebut muncul di halaman juga digunakan untuk deteksi
if (ipIsBlackListed() || isMalicious()) {
header("Content-Encoding: gzip");
header("Content-Length: ". filesize(ZIP_BOMB_FILE_10G)); // 10 MB
readfile(ZIP_BOMB_FILE_10G);
exit;
}
- Biayanya adalah dalam situasi tertentu server harus mengirim file 10MB
- Saat tulisan menjadi viral, penulis menurunkannya ke file 1MB, dan file ini juga disebut tetap efektif
Batasan dan cakupan penggunaan
- Zip Bomb bukan pertahanan yang sempurna
- Dapat dengan mudah dideteksi
- Juga dapat dilewati
- Klien mungkin hanya membaca sebagian isi
- Meski begitu, ini cukup sebagai alat untuk menahan bot yang tidak canggih yang meng-crawl web secara membabi buta dan mengganggu server
- Contoh cara kerjanya dapat dilihat di replay log server: this replay of my server logs
1 komentar
Pendapat di Hacker News
Sekitar tahun 2001, pernah ada masa ketika saya punya jalur tetap di rumah dan meng-hosting macam-macam dari kotak Linux rumahan
Karena pembaruan Windows NT, banyak sistem mengaktifkan fitur enkripsi oportunistis yang mencoba terhubung lebih dulu ke port tertentu untuk menegosiasikan s/wan sebelum mengirim trafik TCP, dan saya sering melihat trafik seperti itu di firewall, jadi tidak terlalu saya hiraukan
Namun ada satu mesin yang terus mencoba terhubung setiap beberapa detik dan itu sangat mengganggu; saya mencoba menghubungi administratornya, tetapi gagal
Akhirnya saya memberi tahu dengan gaya “saya harap tidak ada masalah karena saya akan memulai layanan baru di port itu”, dan karena tidak ada jawaban, saya menjalankan server di port tersebut yang membaca
/dev/urandom, menyalakanTCP_NODELAYdan semacamnya, lalu mendorong data acak secepat mungkinKotak NT yang salah konfigurasi itu tersambung, menenggak data acak selama sekitar 5 detik lalu menghilang, kemudian 5 menit kemudian datang lagi, menelan obat buffer overflow, lalu menghilang lagi; pola itu berulang beberapa minggu sampai akhirnya lenyap sepenuhnya dari internet
Saya kadang membayangkan ada admin yang garuk-garuk kepala bertanya-tanya kenapa kotak NT itu terus reboot
Setiap request harus punya batas waktu sekaligus batas jumlah data yang akan dikonsumsi
Jadi saya membuat PDF 100 halaman yang setiap halamannya berupa persegi hitam besar, lalu mengirimnya lewat gateway email-ke-faks yang waktu itu masih baru; dalam satu jam ada telepon marah, dan faksnya berhenti
Bagian “saya mencoba menghubungi admin kotak itu dan itu hal yang umum” terasa sangat menarik
Setelah domainnya kedaluwarsa, RPi ini mati setiap 5 menit sehingga saya kira masalahnya pada daya, sampai kemudian saya teringat pekerjaan CRON itu
Dalam ribuan kasus, alasan layanan seperti ini dijalankan di kotak NT justru adalah “supaya tidak perlu administrator”, dan itu tidak boleh diremehkan
Pada era 90-an dan awal 2000-an, saya menaruh banyak server di internet, dan praktik standar di seluruh industri adalah memakai NT agar bisa dipakai tanpa admin
Saat kecil, secara bodoh saya pernah iseng memasang
ln -s /dev/zero index.htmldi homepage sayaBrowser pada masa itu tidak bisa menanganinya dengan baik sehingga hampir membeku, dan kadang bahkan ikut menjatuhkan sistem klien
Belakangan sepertinya browser mulai memeriksa konten sebenarnya dan menghentikan request semacam itu
Baru beberapa tahun kemudian akhirnya bisa dibuka
squashfs, memasukkan konten tak berujung tanpa tag penutup, lalu membuat server tidak melaporkan ukuran file sebelum downloadAda ide?
favicon.icoyang dulu membuat browser crashMungkin yang ini: https://freedomhacker.net/annoying-favicon-crash-bug-firefox...
/dev/zipbombSekarang hampir semua browser menerima zstd dan brotli, jadi bom seperti ini mungkin malah lebih efektif saat ini
Komentar lama This menunjukkan rasio kompresi mengesankan 1.2M:1, dan zstd seems to be doing even better
Namun bot mungkin tidak mendukung standar kompresi modern
Sebaliknya, itu juga bisa menjadi cara yang bagus untuk memblokir bot: karena semua browser modern mendukung zstd, jika dipaksakan pada browser agent yang tidak ada di allowlist, scraper bisa otomatis dibuat kebingungan
Demo itu sangat bergantung pada streaming seluruh tampilan pengguna pada setiap interaksi, dan dengan brotli di atas SSE, rasio kompresi 200:1[2] mudah dicapai
Masalahnya adalah aktor jahat bisa meminta stream tanpa kompresi
Karena brotli didukung oleh 98% browser, saya tidak mengirim data ke klien yang tidak mendukung kompresi brotli; banyak scraper dan bot juga tidak mendukungnya, jadi ini bekerja cukup baik
[1] demo checkboxes
https://checkboxes.andersmurphy.com
[2] artikel tentang brotli SSE
https://andersmurphy.com/2025/04/15/why-you-should-use-brotl...
Itu karena blok data
0yang sudah dikompresi oleh gzip generasi pertama sendiri memiliki entropi rendah, dan zst bertingkat dapat mengecilkan file 10G menjadi 99 byteSaya tidak ingin mencobanya sendiri
Bagian tentang bot yang menemukan kerentanan WordPress di tempat kerja lama lalu memasukkan skrip berbahaya ke server memang sedikit keluar topik, tapi menarik
Justru agak lega mengetahui bahwa bukan cuma saya yang mengalami PHP shell yang secara ajaib terpasang di server hanya 1 jam setelah WordPress diinstal
Tidak pernah kurang dari 3, selalu terjamin
Kalaupun bukan pada satu jam pertama, pada akhirnya akan meledak begitu suatu saat lupa patch
/wp-loginlangsung masukIni juga bisa jadi cara bagus untuk menemukan bot; begitu melihat IP yang meminta path terkait CMS terkenal, langsung saya masukkan ke lubang iptables
Saat berkata “coba deploy server nginx hello world pertama kalian”, tidak lama kemudian request aneh mulai terlihat di log
Saya pernah melakukan hal serupa juga di ssh: saya menemukan cara untuk membunuh klien ssh yang mencoba menebak kata sandi root
Sebagai gantinya, beberapa script kiddie melancarkan DDoS ke server kecil saya, dan akhirnya saya beralih ke cara mengidentifikasi pelaku yang jelas-jelas berniat buruk lalu memblokir IP mereka dengan aturan firewall
Namun di IPv6 ini menjadi lebih sulit
Jika Anda membuat halaman web sendiri, Anda juga bisa memasukkan zip bomb ke halaman melalui tautan yang tidak terlihat oleh mata manusia
Misalnya anchor berupa teks putih di latar putih tanpa highlight saat hover/click; bot akan mengunduh dan memeriksanya, begitu juga crawler dan scraper AI
Masalahnya adalah bot yang sangat sederhana, yang menjelajahi web dan mengirim spam kasar ke semua formulir yang terlihat seolah akan dipublikasikan
Awalnya saya menambahkan CAPTCHA sederhana berupa karakter terdistorsi, dan itu memblokir banyak bot, tapi tidak semuanya
Dari log server, bot-bot ini hanya mengirim tiga request secara cepat: halaman yang berisi formulir, gambar CAPTCHA, dan request POST data formulir; mereka sama sekali tidak memuat CSS atau JS
Jadi saya menambahkan beberapa field lagi ke formulir, menyembunyikannya dengan CSS, lalu membuat request gagal dan sesi diblokir jika ada apa pun yang dikirim di field tersebut
Selain itu, saya menjadikan gambar CAPTCHA sebagai background CSS dan mengganti
srcdengan gambar transparan; setelah itu spam berhenti total dan pengguna nyata tidak menyadari apa punhttps://github.com/skeeto/endlessh
Di antara keduanya, justru terlihat lebih mudah
Zip bomb itu menarik
Saya pernah menemukan kerentanan pada sebuah produk keamanan: jika sebuah arsip zip lebih besar dari ukuran tertentu, atau file berisi arsip seperti itu, produk tersebut tidak melakukan pemindaian malware dengan benar
Dalam praktiknya, jika zip bomb dimasukkan ke dalam dokumen Office XML, produk itu bisa meloloskan file OOXML meski berisi malware yang mudah diidentifikasi
Saya mencoba men-deploy ini sebagai ganti skrip honeypot yang biasa saya pakai, tapi sepertinya tidak bekerja dengan baik
Dari log web server, bot-bot tidak mengunduh seluruh racun 10MB itu; mereka berhenti di berbagai panjang
Sejauh ini saya belum melihat ada yang mengambil lebih dari sekitar 1,5MB
Atau mungkin sebenarnya sedang bekerja? Bisa saja mereka mati saat mendekode stream secara langsung
Misalnya jika tercatat membaca 1,5MB, mungkin mereka crash saat mendekodenya secara langsung menjadi 1,5GB di memori
Tidak ada cara untuk memastikannya
Bentuknya seperti konten yang dibuat tanpa henti dengan banyak referensi ke halaman generator lain
Ini bisa membantu sampai
wgetsederhana dan bot beradaptasiSebagai tambahan, saya sebenarnya berada di pihak bot, tapi tidak masalah membantu
Sepertinya sebagian bot punya hard limit untuk ukuran resource yang akan diunduh
Karena cukup banyak di antaranya adalah bot scraping/pelatihan LLM yang menyebalkan, meski zip bomb 800KB tidak membunuh mereka, setidaknya bisa memboroskan sumber daya komputasi pihak sana
Perlu dicatat bahwa ini bukan file zip klasik, melainkan gzip bomb
Ini bukan cara menjatuhkan antivirus dengan zip bersarang, melainkan bekerja seperti halaman web terkompresi biasa
Beberapa waktu lalu, sebagian infrastruktur circumvention milik Tor Project dijalankan dari situs yang sama dengan tulisan blog tentang zip bomb[0]
Salah satu file zip itu di-crawl oleh Google dan masuk ke daftar domain berbahaya, sehingga bagian yang cukup penting dari tool Snowflake milik Tor rusak
Butuh beberapa minggu untuk menyelesaikannya[1]
[0] https://www.bamsoftware.com/hacks/zipbomb/
[1] https://www.bamsoftware.com/hacks/zipbomb/#safebrowsing
Untuk melindungi upload di aplikasi saya, saya membuat partisi disk sementara berukuran tetap masing-masing sekitar 10MB dan mengekstrak arsip di sana
Kalau ada yang mengunggah sesuatu yang terlalu besar, dampaknya tetap terkurung di dalamnya
unzip -p | head -c 10MB