
Artikel ini akan memeriksa beberapa kerentanan nyata dalam blockchain EOS (salah satu pesaing Ethereum) dan bagaimana mereka diintegrasikan ke
dalam kontes
Mesin Slot Aman Generasi Baru di ZeroNights 2018. Jika Anda tertarik untuk mengetahui bagaimana situasi keamanan di jaringan blockchain ini, lalu selamat datang di bawah cat.
Entri
Semuanya dimulai dengan fakta bahwa baru-baru ini, selama audit kontrak pintar Etherium untuk keamanan, salah satu teman kami melempar kami
artikel tentang kerentanan dalam kontrak pintar di jaringan EOS. Ini sangat menarik bagi kami, dan kami memutuskan untuk menyelidiki kerentanan secara lebih rinci.
Semua ini pada akhirnya menyebabkan terciptanya kompetisi untuk ZeroNights 2018 yang disebut "Satu-bersenjata bandit" dengan kerentanan dalam kontrak yang cerdas.
Mari kita mulai secara langsung dengan melihat jaringan blockchain EOS, bagaimana bekerja dengannya, dan bagaimana semuanya diatur di dalamnya. Ada banyak artikel yang menggambarkan teknologi di Internet, jadi kemungkinan besar tidak akan ada detail teknis, tetapi kami akan mencoba menyampaikan makna umum sehingga pengguna rata-rata bisa mendapatkan ide dasar tentang mekanisme kerja blockchain EOS.
Deskripsi Teknologi EOS
EOS.io adalah blockchain generasi baru dari
Block.one , berdasarkan konsep PoS (
Proof of stake ).
Dari deskripsi pencipta jaringan itu sendiri: "EOS adalah perangkat lunak jaringan blockchain open-source gratis yang menyediakan pengembang dan pengusaha platform untuk membuat, menyebarkan, dan menjalankan aplikasi desentralisasi berkinerja tinggi (DAPP)."
Jika singkatnya mencoba menjelaskan konsep, maka itu tercermin dengan baik kutipan dari artikel Wikipedia:
Gagasan proof-of-stake (PoS) adalah untuk menyelesaikan masalah proof-of-work (PoW) yang terkait dengan konsumsi energi yang tinggi. Alih-alih kekuatan komputasi peserta, jumlah cryptocurrency yang mereka miliki di akun mereka penting. Jadi, alih-alih menggunakan sejumlah besar listrik untuk menyelesaikan masalah PoW, peserta PoS memiliki persentase terbatas dari kemungkinan cek transaksi. Batas sesuai dengan jumlah cryptocurrency di akun peserta
Jaringan ini benar-benar baru, dan peluncuran pertama dari jaringan utama (mainnet) berlangsung pada 10 Juni 2018. Cryptocurrency utama adalah EOS, dan portal utama untuk pengembang adalah
developers.eos.ioEOS.io blockchain mendukung aplikasi yang dibuat oleh pengguna menggunakan kode WebAssembly (WASM), standar web baru dengan dukungan luas untuk perusahaan besar seperti Google, Microsoft, Apple dan lainnya.
Saat ini, toolkit terbaru untuk membuat aplikasi yang mengkompilasi kode dalam WASM adalah clang / llvm dengan kompiler C / C ++ mereka.
Untuk kompatibilitas yang lebih baik, pengembang merekomendasikan untuk menggunakan EOSIO CDT (Contract Development Toolkit) - satu set utilitas dari pengembang sendiri untuk pekerjaan yang mudah dan benar dalam menciptakan kontrak yang cerdas.
Kompiler eosiocpp sebelumnya sudah usang dan tidak didukung, jadi semua orang disarankan untuk meningkatkan ke EOSIO CDT 1.5 yang baru (pada saat penulisan).
Tidak seperti eter
Eter dalam konsepnya menggunakan PoW (Proof of Work), yang membutuhkan perhitungan mahal dan hadiah diberikan kepada orang pertama untuk menyelesaikan masalah matematika. Yaitu, mereka yang memutuskan secara paralel, tetapi tidak punya waktu untuk memutuskan, menghabiskan energi. Dalam situasi ini, para penambang berjuang di antara mereka sendiri untuk teknologi dan peralatan yang lebih maju. Untuk menghasilkan blok lebih cepat dan karenanya menghasilkan.
Tidak seperti Ether, dalam jaringan EOS, sistem akan memilih pencipta blok baru sesuai dengan konsep PoS, dan ini ditentukan oleh jumlah status pribadi - sebagian kecil dari total jumlah cryptocurrency. Dengan demikian, orang yang memiliki lebih banyak kekayaan memiliki peluang lebih baik untuk dipilih oleh sistem. Tetapi tidak seperti PoW (ether), pada prinsipnya tidak ada imbalan karena menghasilkan blok baru, dan pendapatan penambang semata-mata adalah komisi dari transaksi.
Kesimpulan - cryptocurrency berdasarkan PoW dapat 1000 kali lebih hemat energi.
Kami mengembangkan lingkungan pengembangan
Jadi, sepertinya kita telah menyelesaikan teorinya, kita beralih ke praktik. Namun dalam praktiknya, semuanya terlihat jauh lebih menarik. Dengan dokumentasi pada saat mereka mencoba mencari tahu di musim panas dan mulai melakukan sesuatu untuk ZeroNights 2018, semuanya sangat buruk, dan portal pengembangan utama buggy, setengah kosong dan kadang-kadang bahkan tidak berhasil.
Jaringan uji belum benar-benar diluncurkan, jadi saya harus menggunakan node saya. Ngomong-ngomong, tidak seperti pendapat di Internet, ternyata tidak terlalu sulit. Menggunakan dokumentasi resmi, kami meluncurkannya dari docker
developers.eos.io/eosio-nodeos/docs/docker-quickstartMari kita bicara tentang utilitas utama, program untuk bekerja dengan blockchain EOS, yang harus saya tangani pada saat mengerjakan kompetisi:
- Nodeos - pada kenyataannya, layanan dari node EOSIO itu sendiri; Anda dapat mengonfigurasi dan mengonfigurasi berbagai plugin, misalnya CORS, histori, dan lainnya.
- Cleos adalah utilitas konsol untuk bekerja dengan sebuah simpul, memanggil metode kontrak dan berinteraksi dengan dompet, kunci, dan akses. Alat paling umum saat bekerja dengan EOS.
- Keosd adalah dompet konsol, atau lebih tepatnya, layanan dompet, toko kunci pribadi.
- Eosio.cdt - Kontrak Pengembangan Toolkit, yang disebut set alat pengembang untuk debugging dan menyusun kontrak, menghasilkan file ABI dan banyak lagi.
- Eos.js - Pustaka Javascript API untuk pekerjaan yang nyaman dengan simpul dan kontrak melalui web, tertanam di situs.
- Scatter adalah dompet desktop untuk penyimpanan yang aman dari kunci akun Anda. Ada sebar perpustakaan web, yang berinteraksi dengan dompet desktop Scatter di soket web dan karenanya membantu bekerja dengan aplikasi DAPP di browser.
Uff! .. Ya, ada banyak program, memahaminya juga tidak sepenuhnya mudah. Penjelasan dari semua ini layak mendapat posting terpisah dan berada di luar cakupan artikel ini. Tetapi mari kita bayangkan bahwa kita menginstal sebuah node di server kita dan bahkan belajar bagaimana menggunakan metode kontrak untuk memanggil metode kontrak jika kita memilikinya.
Ya, hal yang paling penting. Kita perlu membuat sketsa kontrak pintar itu sendiri. Kami akan menulisnya dalam C ++ dan, untuk melakukan setidaknya sesuatu yang masuk akal, saya harus membaca banyak dokumentasi.
Untuk memahami kontrak di mana-mana, berikan contoh kontrak
Hello . File utama adalah hello.cpp dan seluruh kontrak dijelaskan di dalamnya.
#include <eosiolib/eosio.hpp> using namespace eosio; class hello : public eosio::contract { public: using contract::contract; /// @abi action void hi( account_name user ) { print( "Hello, ", name{user} ); } }; EOSIO_ABI( hello, (hi) )
Jika singkatnya mencoba menjelaskan, maka di sini -
semuanya sederhana . Kami memuat pustaka eosio.hpp, lalu membuat kelas hello (juga dikenal sebagai kontrak) dan mewarisi kontrak kelas. Kami membuat void hi method dan memasukkan variabel pengguna tipe account_name ke dalam parameter, itu juga uint64_t. Dalam metode ini, cetak "Halo," dan nama yang kita tentukan saat metode dipanggil. Baris terakhir tempat EOSIO_ABI berada adalah makro bantu yang menerima kelas dan metode publik kami dari kelas ini, dan juga berpartisipasi dalam pembentukan file .abi, di mana semua metode publik kontrak ditunjukkan.
Menjelajahi kerentanan
Jadi, dalam kerangka artikel itu , beberapa kerentanan dijelaskan - sekarang mari kita pertimbangkan secara lebih rinci.Numerical Overflow - Numerical Overflow
Ketika kontrak dipanggil, simpul memeriksa jenis parameter, dan jika data yang kami coba berikan tidak cocok, maka simpul akan mulai bersumpah dan kekejaman semacam itu tidak akan terlewatkan. TAPI! Jika di dalam kontrak ada beberapa jenis algoritma untuk mengubah angka, jumlah angka atau, katakanlah, perkalian, maka angka tersebut dapat berubah sudah ada di dalam kontrak. Ini berarti bahwa Anda dapat menentukan nomor yang akan dilompati oleh node, tetapi gandakan kontraknya, dan jumlah tersebut akan melampaui tipe data yang valid, yang akan mengarah pada overflow.
Apa yang bisa diberikannya? Misalnya, ada pemeriksaan untuk beberapa jenis parameter numerik, misalnya int Nomor <0, dan diketahui bahwa int adalah nomor yang ditandatangani, dan jika jumlahnya meluap, maka tanda angka untuk nilai besar akan berubah menjadi negatif. Dengan demikian, cek akan meluap. Dan di sini, tentu saja, semuanya tergantung pada kekritisan pemeriksaan ini.
Misalnya, dalam artikel yang sama tentang kerentanan, ada
kasus nyata di mana penyerang dapat mempengaruhi parameter keseimbangan, sehingga menipu sistem. Komentar kode menjelaskan secara lebih rinci mekanisme interaksi dengan kontrak:
Peretasan kemungkinan besar dilakukan sebagai berikut. Penyerang membuat lebih dulu 4 akun dan memanggil metode
batchtransfer secara langsung, seperti ini:
cleos push action contractname batchtransfer \'{"symbol ":"EOS", "from":”attacker”, "to":{ “name0”:”acc0”, “name1”:”acc1”, “name2”:”acc2”, “name3”:”acc3”}, "balance":"111111111111111111 EOS"}' -p attacker@active

Saya akan segera memesan, ini hanya asumsi; bagaimana tepatnya mereka melakukan peretasan - kita tidak tahu, dan jika ada pemikiran lain tentang ini atau informasi yang lebih akurat, tulis di komentar.
Pemeriksaan autherization
Kurangnya verifikasi metode kontrak require_auth () untuk otorisasi pengguna akan mengarah pada kenyataan bahwa siapa pun yang tidak memiliki hak yang diperlukan dapat menggunakan metode istimewa kontrak, misalnya, menarik uang dari kontrak.
Kurangnya verifikasi pemanggilan metode
Saat mengirim uang ke kontrak (EOS), Anda dapat menunjukkan dalam makro khusus apa yang akan terjadi selanjutnya dan apa yang harus dilakukan. Katakanlah, ketika Anda menerima uang, algoritma tertentu akan dipanggil, misalnya, untuk memulai roulette atau yang lainnya, serta cek:
if( code == self || code == N(eosio.token) || action == N(onerror) ) { \ TYPE thiscontract( self ); \ switch( action ) { \ EOSIO_API( TYPE, MEMBERS ) \ } }
Dalam pemeriksaan ini, tidak ada batasan untuk memanggil metode transfer, itulah sebabnya Anda dapat memanggil metode transfer secara langsung, tanpa mengirim uang ke kontrak. Dan ini berarti memulai mekanisme dengan keuntungan lebih lanjut, tanpa mengeluarkan uang receh.
Kompetisi ZeroNights 2018
Gagasan kontes lahir dengan sendirinya: karena semuanya terhubung dengan game dan tiga kerentanan, oleh karena itu, kami akan membuat game berdasarkan mekanisme kontrak pintar di blockchain EOS.io. Permainan harus sesederhana mungkin, tetapi menarik.
Mesin slot "Bandit satu tangan"! Orang-orang yang mendambakan uang mudah selalu mengejutkan saya - ingat, tidak ada yang gratis di dunia, atau hampir tidak ada. Di sini, omong-omong, itu ada di sana, atau lebih tepatnya, itu akan muncul ketika kerentanan digunakan.
Frontend
Mereka memutuskan untuk membuat game front-end yang modis, cantik, dan tiga dimensi. Terima kasih
vtornik23 karena tidak menolak untuk berpartisipasi dan membantu kami membuat tampilan depan sepenuhnya pada mesin Unity3d.

Mesin game tiga dimensi "bandit satu tangan"; mengirimkan 1 EOS di atasnya dan menarik tuas pintar, pemain mendapat kesempatan untuk memulai roda keberuntungan dan tekan jackpot!
Kerentanan kontrak
Menurut ide permainan, kemenangan dianggap sebagai kehilangan dari tiga boneka ZeroNights, yang dalam koefisien numerik akan menjadi 777 atau 0. Peluang menang disamakan dengan 0,02%, dan beberapa programmer yang lalai mencoba menyulitkan algoritma acak dengan menambahkan hanya penggandaan multiplikasi pada boneka tersebut. jumlah uang yang dikirim, dan terlalu malas untuk memikirkan kondisi secara lebih rinci, jadi saya hanya menulis jika (hasil == 777 || hasil <1), yang memungkinkan untuk menyelipkan nilai negatif.
int rnd = random(999); int result = rnd * price.amount; uint64_t prize = 0; print("Result:", result);
Kontrak pintar itu sendiri diletakkan di
github , sehingga semua orang dapat melihatnya dari semua sisi dan mengidentifikasi kerentanan lainnya. Mereka telah ditulis tentang mereka sedikit lebih tinggi, sehingga seharusnya tidak ada kesulitan untuk menemukannya.
Aturan untuk partisipasi
Aturan partisipasi sangat sederhana: perlu untuk memenangkan atau meretas mekanisme sistem. Saat 3 matryoshkas jatuh - Jackpot !!! Sistem ini mengisi 100 unit cryptocurrency. Jika seorang peserta menerima jackpot 3 kali berturut-turut, ia menjadi pemenang dan menerima hadiah dari panitia - hoodies bermerek, lencana, berbagai merchandise.
Tentu saja, Anda bisa menang dengan menarik tuas untuk waktu yang lama dan berharap untuk keberuntungan, tetapi keberuntungan tidak dapat diprediksi, dan persentase kemenangan sangat kecil, sehingga lebih mudah untuk diretas.
Hasil Kompetisi
Hasilnya, kompetisi, menurut kami, sempurna. Hadiah direncanakan untuk 3 orang, dan hanya tiga yang berhasil mengatasi persaingan sebelum tanggal akhir yang dijadwalkan. Kompetisi diadakan selama 2 hari, di mana para peserta harus menyelesaikan tugas. Penghargaan resmi dan presentasi hadiah ada pada penutupan konferensi di panggung utama ZeroNights 2018.
Penekanan utama ditempatkan pada pengetahuan tentang teknologi blockchain EOS, dan kami meninggalkan beberapa tips, salah satunya tidak ada yang bisa menemukannya. Kami akan meninggalkan teka-teki ini untuk nanti ...
Ulasan peserta
Alexey (1 tempat)
ZeroNights adalah salah satu konferensi favorit saya, dimulai dengan yang pertama, di St. Petersburg saya tidak melewatkan satu pun. Itu selalu memberikan antusiasme selama enam bulan pasti, dan ada di musim semi PHDays :). 3 tahun terakhir saya telah melakukan pengembangan blockchain. Tahun ini, blockchain mencapai ZeroNights (di masa lalu, kebenarannya tampaknya sama, itu ada di hackvest, tapi saya melewatkannya). Pertama-tama, setelah mendaftar untuk konferensi, saya pergi untuk melihat apa dan bagaimana ada dengan blockchain. Saya pikir itu akan menjadi sesuatu seperti PHDays, semacam kurva acak atau kondisi balapan di udara. Tetapi di sini ada EOS, yang dengannya saya memiliki sedikit kenalan pada hackathon EOS pertama, tetapi itu tidak lama, dan selain itu, semua pengaturan untuk pengembangan hilang. Semangat juang jatuh, dan saya pergi menunggu konferensi dimulai. Tapi rasa ingin tahu menjadi lebih baik, setelah semua, apa yang salah dengan EOS!
Stanislav Povolotsky (2 tempat)
Bagi saya itu adalah kontes yang panjang tapi menarik. Dan itu adalah kesempatan besar untuk mengenal arsitektur blockchain EOS. Kontes dimulai dengan kejutan bahwa Anda tidak akan mendapatkan di jaringan EOS (mainnet) - hanya untuk $$$. Setelah mendorong bahwa kontrak dikerahkan ke jaringan pengujian, mendaftar di jaringan ini, menyiapkan pencar dan melihat riwayat transaksi untuk kontrak game, segera menjadi jelas bagaimana cara curang mesin slot (penulis kontrak melakukan ini beberapa kali selama pengujian). Tetapi keyakinan bahwa kompetisi ini begitu cepat dan mudah dikelola dengan cepat menghilang segera setelah jaringan tidak menyetujui semua transaksi saya dengan parameter yang identik dengan transaksi yang menang.
Irina (peringkat ketiga)
Sebelum berpartisipasi dalam kompetisi, ia mempresentasikan karya kontrak pintar hanya dalam teori, jadi sangat menarik untuk “bertemu langsung”, melihat kode sumber, mencoba alat (dan sekali lagi memastikan bahwa python adalah yang terbaik)). Tugas itu ternyata sangat menarik. Terima kasih
Dan sebagai kesimpulan
Bukan untuk mengatakan bahwa semua orang diatasi dengan mudah. Bagi seseorang itu adalah 2 hari yang sulit, dan hanya pada akhirnya yang beruntung berhasil menang menggunakan kekurangan blockchain - jika informasi masuk ke blockchain, maka itu dapat diakses oleh semua orang, dan jika seseorang telah meretas sesuatu, maka yang lain dapat menontonnya jalan.
Kami berterima kasih kepada semua peserta dan mereka yang membantu dalam menyelenggarakan kontes.
Sampai jumpa di ZeroNights 2019, petualangan baru menanti Anda!