Ako hackeri útočia na zmluvy EOS a spôsoby, ako tomu zabrániť

EOS Bet - hazardná hra dApp, ktorá používa tokeny EOS, v poslednej dobe stratila hackerom hackerom 15. októbra najmenej 338 000 dolárov. Toto nie je prvýkrát, čo bol tento hacker napadnutý hackerom od tej istej katastrofy, ktorá sa stala pred 14. septembrom. EOS Bet, rovnaký problém majú aj iné EOS založené na Dapp.

Ako teda hackeri urobili útoky na EOS Dapps a ukradli token? V tomto článku nájdete podrobné vysvetlenie tohto problému a tiež niektoré skúsenosti pre vývojárov EOS pri ochrane ich Dapps pred hackermi.

Prehľad
1. Metóda Apply () používajúca inteligentnú zmluvu EOS
2. Ako dvakrát hackli EOSDice
3. Bežné spôsoby, ako zabrániť hackerstvu

Metóda apply () používajúca inteligentnú zmluvu EOS

Prečo sa zmienim o tejto metóde?

Ako vývojár DApp je bežnou úlohou kontrolovať platby a posielať token od používateľov na zmluvu a naopak. Aby sa to vyriešilo v rámci zmluvy EOS, mal by vlastník zmluvy použiť metódu apply () na dobehnutie akcie prevodu zo zmluvy o tokene. EOSIO však túto tému oficiálne nezaoberá. Z tohto dôvodu bola väčšina zmlúv EOS hackovaná touto funkciou: EOSBet, DEOS, EOS.WIN ... Budem o tom podrobne vysvetľovať a uzavriem s niekoľkými skúsenosťami od hackerov v EOSbet, ako aj iných DApps.

Ako funguje aplikovať ()?

Vo svojej zmluve definujte metódu apply () na dobehnutie oznámenia o transakcii od eosio.token. Keď niekto prevedie token EOS na vašu zmluvu, túto transakciu dobehne, potom vykoná funkciu mytransfer () s zabalenými údajmi. Pozrite sa na vývojový diagram nižšie:

Príklad metódy apply ()

Aby sme pochopili, ako táto funkcia funguje, diskutujme o príklade: V mojej zmluve o EOS chcem prijímať platby od EOS od používateľov a potom im poslať môj token späť s určitým pomerom. Podrobný kód je uvedený nižšie:

Ako sú hacknuté EOSDice dvakrát.

EOSBEet bol dvakrát napadnutý hackerom a hacker prevzal viac ako 100 000 EOS. Hoci majú bezpečnostné audity od 2 z tretích strán po prvom hacknutí. Druhý útok je veľmi inteligentný a zložitý.

Dnes vám ukážem podrobne, ako to hacker urobil krok za krokom. Tu je zmluvný kód EOSBet.

Pred hacknutím zvážte nasledujúce kódové funkcie EOSBet:

Hack číslo 1:

V očakávanom scenári zmluva akceptuje iba prevod zo zmluvy eosio.token a potom ju spracuje. Čo sa však stane, keď zavoláme transfer () priamo na zmluvu?

Absolútne by táto akcia bola uzlom odmietnutá, pretože súbor abi nepodporuje túto funkciu ani parametre údajov. Čo sa však stane, keď to nazveme inline funkciou alebo zmenou kódu uzla, aby sme priamo prijali akciu volania.

Vyberám si jednoduchý spôsob - napíšte jednoduchú zmluvu o prenose na inline funkciu, ako je uvedené nižšie:

Toto je výsledok potom, čo som zasiahol akciu na hackcontract s falošnými dátovými parametrami, potom by hackcontract volal funkciu transferu na hranie stávky.

$ cleos push action hackcontract hack '["hackcontract", "10000000.0000 SYS", "50"]' -p hackcontract
$ cleos získate stoly eosbettest12 eosbettest12 activebets {
"riadky": [{
"id": "3931680559943168590",
"bettor": "hackcontract",
„sprostredkovanie“: „eosbettest12“,
"bet_amt": "100000000000",
"roll_under": 50,
"semeno": "6799ccac87b63a34dcec107a860c2463b84b687ac5a8c88dca6970b58acf6bf1",
"bet_time": "2018-11-28T10: 10: 19"
}]}

Ako vidíte, poradie stávok je už vo fronte.

Riešenie pre hack číslo 1:

Ak chcete túto chybu opraviť, jednoducho pridajte jeden riadok podľa nižšie uvedeného kódu. To znamená, že zmluva prijíma funkciu prenosu hovorov iba zo zmluvy eosio.token, v opačnom prípade by bol odmietnutý. Alebo môžete pridať túto funkciu kontroly v expedícii.

Hack číslo 2

Hacker využil chybu vo funkcii odosielania prenosu. V tejto funkcii môžete získať zabalené údaje z eosio.token, ale nikdy nekontrolujte prenos z / do. V zásade má hacker 2 účty A a hackerskú zmluvu B. A pošle token B, B, ktorý túto akciu dobehne a pošle na eosbet účet prostredníctvom requ_recipient (). EOSBet by nepochopil, že táto akcia je z eosio.token a spracuje ju.

Tu je podrobný kód:

Po prevodovom tokene na hackcontract je stávková objednávka už vo fronte.

$ cleos transfer myaccount hackcontract "1234567.0000 SYS" "50" -p myaccount
$ cleos získate stoly eosbettest12 eosbettest12 activebets {
"riadky": [{
"id": "2817973050780582232",
"bettor": "myaccount",
„sprostredkovanie“: „eosbettest12“,
"bet_amt": "12345670000",
"roll_under": 50,
"semeno": "e2a32f55658ebfa76a9d335abe532253326b86910b52e1b8c81f319c3d71ab73",
"bet_time": "2018-11-29T04: 15: 27"
}]}

Riešenie pre hack číslo 2:

Nezabudnite skontrolovať, kam presun do expedície ().

Bežné spôsoby, ako zabrániť hackerom

Aktualizujte poslednú opravu funkcie „použiť“

Nájdete tu: https://medium.com/@eoscafeblock/contract-vulnerability-patch-57b948cacc3a

Použite odlišné povolenie v zmluve s požiadavkou_auth2

V súčasnosti vývojári spoločnosti DApp zvyčajne používajú na získanie povolenia od odosielateľa akcie metódu requ_auth (). V prípade, že akcia request_auth (self), by ste mali súkromný kľúč vlastníka zmluvy uložiť na server, ak to chcete urobiť automaticky. Čo sa však stane, ak hacker ukradne tento súkromný kľúč, je to úplne katastrofa ...

Ak chcete tento problém vyriešiť, mali by ste vo svojej zmluve oddeliť úroveň povolení.

Príklad: Povolenie aktívne pre dôležité akcie (nastaviť zmluvu, prenosový token ...) a táto akcia by sa mala vykonať manuálne. Kód povolení pre akcie je menej dôležitý, takže je pravdepodobnejšie, že sa vykoná automaticky, takže môžete súkromný kľúč kódu oprávnenia uložiť na server. Ak niekto ukradol tento kľúč, nemá čo stratiť.

Uistite sa, že vaša zmluva má režim udržiavania zmrazenia zmluvy, keď si všimne chybu

Kybernetická bezpečnosť je skutočne veľká vec, ktorú treba zvládnuť, najmä pre mladé technológie ako blockchain. Hore je všetko moje vysvetlenie a návrh pre súčasný problém s hackovaním. Ďakujeme vám za prečítanie a nezabudnite si vždy všimnúť svoju záruku kybernetickej bezpečnosti Dapp.

Autor: Quoc Le @ Lecle VietNam Blog