Ini adalah jenis bug yang membuat tim protokol terjaga di malam hari. Eksploitasi $5 juta di ZKSwap, diaktifkan oleh satu pernyataan yang ditinggalkan di tempat yang salah. Berikut adalah penyelaman mendalam tentang bagaimana hal itu terjadi, dan bagaimana pemantauan onchain dapat menghentikannya. 🧵
1/ Pada 9 Juli, GMX diretas seharga $42 juta. Tetapi sesuatu yang lain terjadi hari itu dan hampir tidak ada yang menyadarinya: jembatan ZKSwap diam-diam dikeringkan seharga $ 5 juta. Bagian yang menarik? Tidak ada eksploitasi mewah yang terlibat. Hanya fungsi penting yang melakukan... tidak apa-apa.
2/ ZKSwap adalah zk-rollup yang dibangun di atas Ethereum. Seperti banyak rollup, ia menggunakan jembatan untuk memindahkan aset antara L1 dan L2. Sebagai perlindungan, jembatan ini menyertakan "Mode Keluaran", cara bagi pengguna untuk mendapatkan kembali dana tanpa memerlukan operator. Secara teori, itu ide yang bagus. Dalam praktiknya...
3/ Mode Keluaran memungkinkan pengguna secara manual membuktikan bahwa mereka memiliki token dalam status L2 terakhir yang diverifikasi. Ini adalah mekanisme penggantian: tanpa kepercayaan, penyimpanan diri, non-interaktif. Tetapi implementasi ZKSwap memiliki satu kelemahan fatal: Fungsi yang bertanggung jawab untuk memverifikasi bukti tidak memverifikasi apa pun. Secara harfiah.
4/ Inilah kode yang seharusnya menghentikan serangan 👇 Sekilas, itu terlihat seperti verifikator zk-proof nyata. Tapi perhatikan baik-baik baris pertama: kembali benar; Itu saja. Tidak ada lagi yang berjalan.
5/ Hasilnya? Setiap "bukti" penarikan (tidak peduli seberapa palsu) lulus validasi. Kontrak menerima klaim sewenang-wenang tentang saldo token... dan memuji mereka seolah-olah itu nyata. Itu mengubah mekanisme penggantian yang tidak dapat dipercaya menjadi keran yang tidak dijaga.
6/ Penyerang tidak membutuhkan eksploitasi mewah - hanya panggilan berulang untuk keluar() dengan data yang dibuat-buat. Mereka melewati pemeriksaan saldo, menarik diri di beberapa token, dan menyalahgunakan logika pembatalan yang lemah untuk menghindari deteksi. Sementara kontrak mengatakan: ✅
7/ Ini bukan kasus tepi yang tidak jelas. Ini adalah logika inti untuk pemulihan aset, dibiarkan terbuka sepenuhnya. Dan karena Mode Keluaran jarang dipicu, jalan yang rusak tidak diperhatikan... selama berbulan-bulan.
8/ Inilah yang seharusnya memicu alarm: • Mode Keluaran dipicu setelah dormansi lama • Lusinan panggilan penarikan terjadi sekaligus • Lonjakan mendadak dalam saldoToWithdraw berubah Semua itu terlihat dan bisa dihentikan dengan pemantauan onchain waktu nyata.
9/ Jadi apa pelajarannya? • Kode darurat masih merupakan kode produksi • Jalur penggantian tidak membantu jika tidak berhasil • Pemantauan waktu nyata bukan opsional, ini penting untuk bertahan hidup
37,3K