@Dusk $DUSK
Saya mengira bukti pengetahuan nol (zero knowledge proof) pasti memeriksa semuanya atau sama sekali tidak memverifikasi. Tidak ada kepercayaan parsial. Ternyata kode proving milik Dusk sendiri meninggalkan empat angka tertentu sepenuhnya tidak diperiksa, dan itu saja sudah cukup untuk menghasilkan uang dari bukti yang tidak valid.
Saat pertama kali melihat ini, jujur saja saya mengira bukti palsu pasti memerlukan peretasan kriptografi yang benar-benar nyata. celahnya ternyata jauh lebih sederhana dari itu.
Begini alasannya. setiap transaksi Dusk yang dilindungi (shielded) membawa sebuah bukti, dan bukti tersebut harus meyakinkan jaringan tentang hal-hal seperti kepemilikan, saldo yang benar, dan input yang valid. hampir setiap angka di dalam bukti itu dikunci, diikat kembali ke komitmen yang tepercaya, supaya pembukti tidak bisa sekadar berbohong tentang angka-angka tersebut. tetapi empat angka spesifik, yang terkait dengan cara logika transaksi diperiksa, tidak pernah dibatasi dengan cara itu. angka-angka itu ada di dalam bukti, dipakai dalam matematika final, tetapi tidak ada yang pernah memverifikasinya terhadap nilai-nilai yang seharusnya mereka wakili.
Jadi, pembukti jahat bisa menghitung langsung nilai yang hilang. cuma satu pembagian. itu saja. peneliti keamanan mendemonstrasikan masalah ini terhadap sebuah node Dusk, menghasilkan 2000 DUSK tanpa apa pun, lalu mengirim 1337 darinya ke sebuah wallet normal melalui transaksi biasa. node tersebut menerima keduanya sebagai valid.
Yang membuat ini semakin sulit bagi saya adalah kode Dusk sudah melalui tiga audit terpisah sebelum masalah ini ditemukan.
Desain yang sama yang membuat bukti pengetahuan nol kuat—yaitu mempercayai satu vonis final daripada memeriksa ulang setiap klaim sendiri—justru yang memungkinkan empat angka yang tidak terkonstrain ini bersembunyi begitu saja dalam tampilan sehari-hari selama begitu lama.
Dusk memperbaiki masalah itu dalam waktu satu hari setelah diberi tahu, tetapi bug yang hampir identik ditemukan secara independen di sistem proving tim lain pada waktu yang hampir sama. kalau dua implementasi yang tidak berhubungan sama-sama merilis celah buta yang sama, saya tidak tahu berapa banyak implementasi lain yang masih duduk di sana tanpa terdeteksi.
#dusk $TUT $ZRO
#zkProofs
Saya mengira bukti pengetahuan nol (zero knowledge proof) pasti memeriksa semuanya atau sama sekali tidak memverifikasi. Tidak ada kepercayaan parsial. Ternyata kode proving milik Dusk sendiri meninggalkan empat angka tertentu sepenuhnya tidak diperiksa, dan itu saja sudah cukup untuk menghasilkan uang dari bukti yang tidak valid.
Saat pertama kali melihat ini, jujur saja saya mengira bukti palsu pasti memerlukan peretasan kriptografi yang benar-benar nyata. celahnya ternyata jauh lebih sederhana dari itu.
Begini alasannya. setiap transaksi Dusk yang dilindungi (shielded) membawa sebuah bukti, dan bukti tersebut harus meyakinkan jaringan tentang hal-hal seperti kepemilikan, saldo yang benar, dan input yang valid. hampir setiap angka di dalam bukti itu dikunci, diikat kembali ke komitmen yang tepercaya, supaya pembukti tidak bisa sekadar berbohong tentang angka-angka tersebut. tetapi empat angka spesifik, yang terkait dengan cara logika transaksi diperiksa, tidak pernah dibatasi dengan cara itu. angka-angka itu ada di dalam bukti, dipakai dalam matematika final, tetapi tidak ada yang pernah memverifikasinya terhadap nilai-nilai yang seharusnya mereka wakili.
Jadi, pembukti jahat bisa menghitung langsung nilai yang hilang. cuma satu pembagian. itu saja. peneliti keamanan mendemonstrasikan masalah ini terhadap sebuah node Dusk, menghasilkan 2000 DUSK tanpa apa pun, lalu mengirim 1337 darinya ke sebuah wallet normal melalui transaksi biasa. node tersebut menerima keduanya sebagai valid.
Yang membuat ini semakin sulit bagi saya adalah kode Dusk sudah melalui tiga audit terpisah sebelum masalah ini ditemukan.
Desain yang sama yang membuat bukti pengetahuan nol kuat—yaitu mempercayai satu vonis final daripada memeriksa ulang setiap klaim sendiri—justru yang memungkinkan empat angka yang tidak terkonstrain ini bersembunyi begitu saja dalam tampilan sehari-hari selama begitu lama.
Dusk memperbaiki masalah itu dalam waktu satu hari setelah diberi tahu, tetapi bug yang hampir identik ditemukan secara independen di sistem proving tim lain pada waktu yang hampir sama. kalau dua implementasi yang tidak berhubungan sama-sama merilis celah buta yang sama, saya tidak tahu berapa banyak implementasi lain yang masih duduk di sana tanpa terdeteksi.
#dusk $TUT $ZRO
#zkProofs