原文标题:《Menghindari Lapisan Nol: Mengapa Keamanan Terisolasi Bukanlah Keamanan》

Penulis: Krzysztof Urbański, anggota tim L2BEAT

Disusun oleh: Babywhale, Berita Tinjauan ke Depan

L2BEAT telah menginvestasikan banyak upaya sejak awal untuk menganalisis dan memahami risiko yang terkait dengan protokol Lapisan 2. Kami selalu bertindak demi kepentingan terbaik pengguna dan ekosistem kami, dan melakukan yang terbaik untuk menjadi pengawas yang tidak memihak dan independen, tanpa membiarkan preferensi pribadi kami terhadap proyek atau tim terkait memengaruhi fakta. Itu sebabnya, meskipun kami menghargai waktu dan upaya yang dilakukan tim proyek dalam proyek tersebut, kami mungkin “membunyikan alarm” atau menunjukkan kekhawatiran kami tentang potensi risiko protokol tertentu. Melakukan diskusi terkait keamanan sejak dini memungkinkan seluruh ekosistem lebih siap menghadapi potensi risiko dan bereaksi lebih awal terhadap perilaku mencurigakan apa pun.

Hari ini kami ingin membahas model keamanan bersama untuk aplikasi lintas rantai. Saat ini ada dua model keamanan: keamanan bersama dan keamanan aplikasi independen. Keamanan bersama sama seperti semua Rollup. Keamanan aplikasi mandiri terutama digunakan oleh proyek "omnichain", yang sebagian besar menggunakan LayerZero.

Keamanan bersama vs. keamanan independen

Keamanan bersama mengacu pada token atau aplikasi tertentu yang berjalan pada infrastruktur tertentu, dan daripada bebas memilih model keamanan, mereka harus mematuhi persyaratan keamanan apa pun yang diberlakukan oleh infrastruktur. Misalnya, Optimistic Rollup biasanya menerapkan jendela akhir 7 hari—aplikasi yang berjalan pada Rollup tersebut tidak dapat mengabaikan atau memperpendek periode ini begitu saja. Walaupun hal ini tampak seperti sebuah hambatan, ada alasannya. Periode ini memberikan jaminan keamanan kepada pengguna bahwa apa pun kebijakan keamanan internal aplikasi yang harus dipatuhi, aplikasi hanya dapat memperkuat keamanan Rollup, bukan melemahkannya.

Keamanan independen berarti bahwa setiap aplikasi bertanggung jawab untuk menentukan keamanannya dan tidak dibatasi oleh infrastruktur dengan cara apa pun. Ini mungkin tampak seperti ide yang bagus pada awalnya, karena pengembang aplikasi paling tahu langkah-langkah keamanan apa yang mungkin diperlukan oleh aplikasi. Namun pada saat yang sama, hal ini mengalihkan tanggung jawab penilaian risiko yang terkait dengan setiap kebijakan keamanan aplikasi kepada pengguna akhir. Selain itu, jika pengembang aplikasi bebas memilih kebijakan keamanannya, mereka juga dapat mengubahnya kapan saja. Oleh karena itu, tidak cukup hanya menilai risiko satu kali untuk setiap aplikasi, namun harus dilakukan setiap kali kebijakan aplikasi berubah.

Masalah

Kami percaya bahwa model keamanan independen di mana setiap aplikasi bebas menentukan kebijakan keamanannya akan menimbulkan masalah keamanan yang serius. Pertama, hal ini meningkatkan risiko bagi pengguna akhir karena mereka harus memverifikasi risiko untuk setiap aplikasi yang ingin mereka gunakan.

Keamanan mandiri juga meningkatkan risiko bagi aplikasi yang menggunakan model ini, misalnya menambahkan risiko tambahan terkait perubahan kebijakan keamanan - jika penyerang mengubah model keamanan aplikasi, mereka mungkin akan menonaktifkannya saja, sehingga kehabisan uang atau mengambil risiko menyerang dengan cara lain. Tidak ada lapisan keamanan tambahan di atas aplikasi untuk mencegah serangan.

Selain itu, karena kebijakan keamanan dapat berubah kapan saja dan dengan cepat, hampir tidak mungkin untuk memantau aplikasi secara real-time dan menginformasikan risiko kepada pengguna.

Kami menemukannya serupa dengan kemampuan peningkatan kontrak pintar, yang telah kami peringatkan di L2BEAT. Kami memberi tahu pengguna tentang Rollup dan jembatan lintas rantai yang memiliki mekanisme peningkatan dalam kontrak pintar mereka, dan mekanisme yang tepat untuk mengelola kemampuan peningkatan dalam setiap kasus. Hal ini sudah cukup rumit, dan penggunaan model keamanan terpisah akan melipatgandakan jumlahnya, sehingga hampir mustahil untuk dilacak secara efektif.

Inilah sebabnya kami menganggap model keamanan mandiri sebagai risiko keamanan tersendiri, dan kami berasumsi bahwa setiap aplikasi yang akan menggunakan model ini secara default harus dianggap berisiko hingga terbukti sebaliknya.

Buktikan bahwa kerentanan keamanan memang ada

Kami memutuskan untuk menguji hipotesis kami di mainnet. Kerangka kerja LayerZero dipilih untuk eksperimen karena merupakan salah satu solusi mandiri yang berfokus pada keamanan. Kami menerapkan token omnichain yang aman dan kemudian memperbarui konfigurasi keamanan untuk memungkinkan penarikan token yang berbahaya. Kode token didasarkan pada contoh yang diberikan oleh LayerZero dan sangat mirip atau identik dengan banyak token dan aplikasi omnichain lainnya yang diterapkan di kehidupan nyata.

Namun sebelum kita membahas detailnya, mari kita lihat sekilas seperti apa model keamanan LayerZero.

Seperti yang ditunjukkan oleh LayerZero dalam buku putihnya, “komunikasi antar-rantai yang tidak dapat dipercaya” bergantung pada dua aktor independen (oracle dan relayer) yang bertindak bersama untuk memastikan keamanan protokol.

LayerZero menyatakan di situs webnya bahwa konsep intinya adalah "aplikasi pengguna yang menjalankan ULN (UltraLightNode), terminal on-chain yang dapat dikonfigurasi." Komponen on-chain LayerZero bergantung pada dua komponen off-chain eksternal untuk menyampaikan pesan antar rantai – oracle dan relay.

Setiap kali pesan M dikirim dari rantai A ke rantai B, dua operasi berikut terjadi:

  • Pertama, oracle menunggu hingga transaksi pengiriman pesan M pada rantai A selesai, dan kemudian menulis informasi yang relevan pada rantai B, seperti nilai hash dari header blok rantai A yang berisi pesan M (nilai pasti antara rantai/Oracle yang berbeda Formatnya mungkin berbeda-beda).

  • Relai kemudian mengirimkan "bukti" (seperti Bukti Merkle) ke rantai B, membuktikan bahwa header blok yang disimpan berisi pesan M.

LayerZero berasumsi bahwa relay dan oracle adalah peserta yang independen dan jujur. Namun, LayerZero juga menyatakan dalam kertas putih bahwa jika asumsi ini tidak terpenuhi, misalnya, relai dan oracle berkolusi, mengakibatkan "header blok yang disediakan oleh oracle dan bukti transaksi yang diberikan oleh relai menjadi tidak valid, tetapi masih serasi."

LayerZero mengklaim bahwa "desain LayerZero menghilangkan kemungkinan kolusi." Namun kenyataannya, pernyataan ini tidak benar (kami membuktikannya dalam eksperimen yang ditunjukkan di bawah), karena setiap aplikasi pengguna dapat menentukan relay dan oraclenya sendiri. LayerZero tidak menjamin secara desain bahwa komponen-komponen ini independen dan tidak dapat berkolusi; melainkan terserah pada aplikasi pengguna untuk memberikan jaminan ini. LayerZero tidak memiliki mekanisme untuk menghentikan aplikasi jika mereka memilih untuk merusaknya.

Selain itu, secara default, semua aplikasi pengguna dapat mengubah relay dan oracle kapan saja, sehingga sepenuhnya mendefinisikan ulang asumsi keamanan. Oleh karena itu, memeriksa keamanan suatu aplikasi hanya sekali saja tidaklah cukup, karena dapat berubah sewaktu-waktu setelah pemeriksaan, seperti yang akan kami tunjukkan dalam eksperimen kami.

desain eksperimental

Untuk eksperimen kami, kami memutuskan untuk membuat token omnichain sederhana, CarpetMoon, yang berjalan pada Ethereum dan Optimism dan menggunakan LayerZero untuk berkomunikasi antara kedua rantai tersebut.

Token kami awalnya menggunakan model keamanan default yang disediakan oleh LayerZero, membuatnya identik dengan aplikasi LayerZero besar (mungkin tidak semua) yang saat ini diterapkan. Oleh karena itu, umumnya sama amannya dengan koin lain yang menggunakan LayerZero.

Pertama, kami menerapkan kontrak token kami pada Ethereum dan Optimisme:

https://ethtx.info/mainnet/0xf4d1cdabb6927c363bb30e7e65febad8b9c0f6f76f1984cd74c7f364e3ab7ca9/

https://optimistic.etherscan.io/tx/0xf41389d71fa3942de5225efb067072728c6c6de56c241574187781db7c73d221

Kami kemudian mengatur perutean sehingga LayerZero mengetahui kontrak mana yang sesuai dengan yang mana di kedua rantai.

https://ethtx.info/mainnet/0x19d78abb03179969d6404a7bd503148b4ac14d711f503752495339c96a7776e9/

https://optimistic.etherscan.io/tx/0x037b1bad33faa5607bb5835460a1d5caaf3a147dc3a09762ac7703befcdb3c3c

Token telah diterapkan dan terlihat persis seperti token omnichain lainnya yang menggunakan LayerZero, menggunakan konfigurasi default dan tidak ada yang mencurigakan.

Kami menyediakan 1 miliar token CarpetMoon di Ethereum kepada “pengguna uji” kami, Alice.

https://ethtx.info/mainnet/0x7e2faa8426dacae92830efbf356ca2da760833eca28e652ff9261fc03042b313/

Sekarang Alice menggunakan LayerZero untuk menghubungkan token ini ke Optimisme.

Kami mengunci token dalam kontrak escrow di Ethereum:

https://ethtx.info/mainnet/0xe4dc3757b86bfda8e7baddc088fb1a599e083ed77034c29e5dd8bd11f1e17771/。

Pesan yang berisi transaksi diteruskan ke Optimisme melalui LayerZero:

https://layerzeroscan.com/101/address/0xc6005ccc1de4b300d538903b74848bff881d5dc5/message/111/address/0x201fe0d843b546f2e24d4c8444318d1c71b7nonced10d/。

Token lintas rantai dicetak di Optimisme, dan Alice sekarang memiliki 1 miliar token MoonCarpet di Optimisme:

https://optimistic.etherscan.io/tx/0x5388ced88cf562acaff82d6798f791b0b38b90ee106df9bf91c0d86306ec302。

Semuanya berjalan seperti yang diharapkan, Alice menyatukan token dan melihat bahwa ada 1 miliar token MoonCarpet dalam kontrak escrow di Ethereum dan 1 miliar token MoonCarpet di akunnya di Optimism. Namun hanya untuk memastikan semuanya baik-baik saja, dia mentransfer setengah dari tokennya kembali ke Ethereum.

Kami memulai dengan transaksi Optimisme yang membakar 500 juta token:

https://optimistic.etherscan.io/tx/0x118a57106488ad0bae1f3b920b1fd98b187752ad966f3a901fc53cff47f2097f。

Informasi tentang transaksi diteruskan ke Ethereum:

https://layerzeroscan.com/111/address/0x201fe0d843b546f2e24d4c8444318d1c71b7d10d/message/101/address/0xc6005ccc1de4b300d538903b74848bff881d5dc5/nonce/1。

Seperti yang diharapkan, 500 juta token MoonCarpet dikembalikan dari kontrak escrow ke alamat Alice:

https://etherscan.io/tx/0x27702e07a65a9c6a7d1917222799ddb13bb3d05159d33bbeff2ca1ed414f6a18。

Sejauh ini, semuanya berfungsi dengan baik dan persis seperti yang diasumsikan. Alice telah memeriksa bahwa dia dapat melakukan cross-chain token dari Ethereum ke Optimisme dan kembali lagi, dia tidak punya alasan untuk khawatir tentang token MoonCarpet miliknya.

Namun hipotetis memiliki permasalahannya sendiri - misalnya, tim di belakang token kita mengalami masalah dan penjahat Bob mendapatkan akses ke konfigurasi LayerZero aplikasi kita.

Dengan cara ini, Bob dapat mengubah oracle dan relay dari komponen default ke komponen yang dia kendalikan.

Perlu dicatat bahwa ini adalah mekanisme yang disediakan untuk setiap aplikasi yang menggunakan LayerZero dan berakar pada arsitektur LayerZero. Ini bukan pintu belakang apa pun, tetapi mekanisme standar.

Jadi Bob mengubah oracle menjadi EOA di bawah kendalinya:

https://ethtx.info/mainnet/0x4dc84726da6ca7d750eef3d33710b5f63bf73cbe03746f88dd8375c3f4672f2f/。

Repeater juga diubah:

https://ethtx.info/mainnet/0xc1d7ba5032af2817e95ee943018393622bf54eb87e6ff414136f5f7c48c6d19a/。

Sekarang sesuatu yang aneh terjadi. Karena oracle dan relay sekarang berada di bawah kendali penuh Bob, dia mampu mencuri token Alice. Meskipun tidak ada tindakan yang diambil terhadap Optimisme (token MoonCarpet masih ada di dompet Alice), Bob mampu meyakinkan kontrak pintar MoonCarpet di Ethereum (menggunakan mekanisme LayerZero) bahwa dia menghancurkan token di rantai lain dan dia mampu melakukannya. tarik token pada token MoonCarpet di Ethereum.

Pertama, dia memperbarui hash blok Ethereum menggunakan oracle yang dia kendalikan:

https://ethtx.info/0xde2edee2cc7f070120e96c9df90d86696970befcfc221e18c6ac4168bb5b1d92/。

Sekarang dia dapat menarik sisa token dari kontrak escrow:

https://ethtx.info/0xda695f374b375d5372efeca37aae4c5a17f114d5a76db1e86edebb0924bcdcc7/。

Hasil percobaan

Alice bahkan tidak tahu mengapa dan kapan kesalahan itu terjadi. Tiba-tiba, token MoonCarpet miliknya di Optimisme tidak lagi didukung oleh token di Ethereum.

Kontrak pintar tidak dapat diupgrade dan berfungsi seperti yang diharapkan. Satu-satunya aktivitas yang mencurigakan adalah perubahan oracle dan relay, tapi ini adalah mekanisme reguler yang dibangun di LayerZero, jadi Alice bahkan tidak tahu apakah perubahan ini disengaja. Bahkan jika Alice mengetahui perubahan tersebut, semuanya sudah terlambat - penyerang dapat menghabiskan dana sebelum dia dapat bereaksi.

Tidak ada yang bisa dilakukan LayerZero - ini semua adalah implementasi efisien dari mekanismenya, yang tidak dapat mereka kendalikan. Secara teori, aplikasi itu sendiri dapat mencegah dirinya mengubah oracle dan relay, namun sepengetahuan kami, belum ada aplikasi yang menerapkan hal tersebut.

Kami melakukan percobaan ini untuk menguji apakah ada yang memperhatikannya, tapi seperti yang kami perkirakan, tidak ada yang menyadarinya. Hampir tidak mungkin untuk memantau secara efektif semua aplikasi yang dibangun dengan LayerZero untuk memeriksa apakah kebijakan keamanannya telah berubah dan memperingatkan pengguna ketika hal ini terjadi.

Sekalipun seseorang dapat mengetahui pada waktunya bahwa oracle dan relay telah berubah dan menimbulkan risiko keamanan, itu sudah terlambat. Karena oracle dan relay baru sekarang bebas memilih pesan mana yang akan disampaikan atau sekadar menonaktifkan komunikasi antar-rantai, secara umum tidak banyak yang dapat dilakukan pengguna mengenai hal ini. Eksperimen kami dengan jelas menunjukkan bahwa meskipun Alice menyadari perubahan konfigurasi aplikasi, dia tidak dapat berbuat banyak dengan token lintas rantainya - oracle dan relay baru tidak lagi diterima pada pesan rantai komunikasi asli, sehingga pesan tersebut tidak akan dikembalikan ke Ethereum .

Kesimpulannya

Seperti yang bisa kami lihat, meskipun token kami dibuat dengan LayerZero dan menggunakan mekanismenya sebagaimana dimaksud, kami dapat mencuri dana dari escrow token. Tentu saja ini adalah kesalahan aplikasi (dalam kasus kami token CarpetMoon) dan bukan LayerZero itu sendiri, tetapi ini membuktikan bahwa LayerZero sendiri tidak memberikan jaminan keamanan apa pun.

Ketika LayerZero menjelaskan model keamanan mereka mengenai oracle dan relayer, mereka berasumsi bahwa pemilik aplikasi (atau siapa pun yang memiliki kunci pribadi) tidak akan melakukan sesuatu yang tidak masuk akal. Namun dalam lingkungan yang bermusuhan, anggapan ini tidak benar. Selain itu, pengguna harus memercayai pengembang aplikasi sebagai pihak ketiga yang tepercaya.

Jadi dalam praktiknya, seseorang tidak dapat membuat asumsi apa pun tentang keamanan aplikasi yang dibangun dengan LayerZero - setiap aplikasi harus dianggap berisiko hingga terbukti sebaliknya.

Sebenarnya, keseluruhan cerita dimulai dengan PR yang kami rencanakan untuk memasukkan semua token omnichain di situs web L2BEAT - kami kesulitan memikirkan cara menilai risikonya. Saat menganalisis risiko, kami mendapat ide eksperimen.

Jika L2BEAT diluncurkan, konsekuensinya adalah kami harus menempatkan peringatan pada setiap aplikasi yang dibangun dengan LayerZero untuk memperingatkan kemungkinan risiko keamanan. Namun kami ingin berdiskusi lebih luas tentang model keamanan karena kami yakin keamanan mandiri adalah model yang harus dihindari, terutama di bidang kami.

Kami percaya bahwa ketika model keamanan independen seperti LayerZero menjadi lebih populer, semakin banyak proyek yang akan menyalahgunakannya, sehingga menyebabkan kerusakan besar dan meningkatkan ketidakpastian di seluruh industri.