Slijede razlike između dviju inačica stranice.
Starije izmjene na obje strane Starija izmjena Novija izmjena | Starija izmjena | ||
racfor_wiki:razno:sigurnosne_prijetnje_solidity [2020/01/10 01:07] kcavar [Uvod] |
racfor_wiki:razno:sigurnosne_prijetnje_solidity [2024/12/05 12:24] (trenutno) |
||
---|---|---|---|
Redak 3: | Redak 3: | ||
===== Sažetak ===== | ===== Sažetak ===== | ||
- | The fact that we could even recover data from a formatted Hard Drive is kind of amazing. You choose (or not) to delete data, but it is still there, even if it is not that easy to read. | + | U zadnjih nekoliko godina jedno od najpopularnijih područja globalno bila je tehnologija blockchain i kakve teme vezane uz tehnologiju blockchain, s najvećim naglaskom na kriptovalute, |
- | The purpose of this paper is to understand how data recovery works. To do so, we explain the steps and some technics. We will go through how a sinister leading to a try for data recovery can occur. Then, we will see a method that could have been used by computer forensics experts in order to find traces. To finish, we will mention methods to definitely erase data from Hard Drives to avoid leaving traces. | + | S javljanjem pametnih ugovora pojavila se potreba za prilagođenim programskim jezicima koji bi olakšavali razvijanje istih u skladu sa zahtjevima tehnologije blockchain i pripadajuće platforme na kojoj se ugovor razvija. U tom je kontekstu nastao i programski jezik Solidity, jedan od vodećih svjetskih jezika za pametne ugovore. |
- | The reasons for those sinisters are numerous, but human mistakes are majorly involved. Peter Gutmann proposed through his papers an explanation of how this data could still be read on Hard Drives at that time, but also some advices | + | Ovaj će seminar kratko razraditi pitanje što je to Solidity i čemu služi, a koncentrirat će se na sigurnosne prijetnje unutar Solidity-ja. Seminar će potaknuti pitanje zašto treba obraćati pozornost na sigurnosne prijetnje te će se detaljno razraditi tri primjera postojećih sigurnosnih prijetnji, kako se protiv njih boriti i, ukoliko je moguće, kako ih spriječiti. Predstavit će se i primjeri iz stvarnog svijeta koji kazuju kakve su efekte upravo te prijetnje imale i kakvi su napadi proizašli iz njih . |
- | This paper is some kind of a warning to all those selling Hard Drives //via //eBay that once contained personal data. | + | Svrha seminara je upozoriti čitatelja na sigurnosne prijetnje te ga pozvati na aktivno razmišljanje o sigurnosti za vrijeme razvijanja pametnih ugovora. |
- | Keywords: **recovery**; **data**; traces | + | Ključne riječi: **Solidity, sigurnost**, sigurnosne prijetnje, pametni ugovori |
- | + | ||
- | Uredi | + | |
- | + | ||
- | Uredi | + | |
Redak 26: | Redak 22: | ||
Najpopularnije primjene pametnih ugovora programiranih u Solidity-ju su implementacije glasovanja, grupnog financiranja (crowdfunding), | Najpopularnije primjene pametnih ugovora programiranih u Solidity-ju su implementacije glasovanja, grupnog financiranja (crowdfunding), | ||
- | Iako je široko raširen, Solidity je još uvijek u ranoj razvojnoj fazi (trenutna najnovija verzija je 0.6.X), a to ukazuje na puno prostora za sigurnosne prijetnje. Ovaj će seminar razmotriti nekoliko zanimljiviih otkrivenih sigurnosnih propusta te službena ili potencijalna rješenja za sprječavanje istih. | + | Iako je široko raširen, Solidity je još uvijek u ranoj razvojnoj fazi (trenutna najnovija verzija je 0.6.1), a to ukazuje na puno prostora za sigurnosne prijetnje. Ovaj će seminar razmotriti nekoliko zanimljiviih otkrivenih sigurnosnih propusta te službena ili potencijalna rješenja za sprječavanje istih. Logo Solidity-ja vidljiv je na sljedećoj slici. |
{{ : | {{ : | ||
- | ===== Napad: | + | ===== Višestruki ulazak (Re-Entrancy) ===== |
Za razumijevanje ovog napada, potrebno se upoznati s pojmom fallback funkcije. Fallback funkcija je funkcija koja se izvršava kada neki ugovor primi ethere bez ikakvih drugih podataka povezanih s tom transakcijom. Također, izvršavaju se kad identifikator funkcije ne odgovara niti jednoj funkciji dostupnoj u pametnom ugovoru ili kada nikakvi podatci nisu dani pri pozivu funkcije. Fallback funkcije nemaju ime, ne mogu primati argumente, ne mogu vraćati ništa te u jednom ugovoru postoji najviše jedna fallback funkcija. | Za razumijevanje ovog napada, potrebno se upoznati s pojmom fallback funkcije. Fallback funkcija je funkcija koja se izvršava kada neki ugovor primi ethere bez ikakvih drugih podataka povezanih s tom transakcijom. Također, izvršavaju se kad identifikator funkcije ne odgovara niti jednoj funkciji dostupnoj u pametnom ugovoru ili kada nikakvi podatci nisu dani pri pozivu funkcije. Fallback funkcije nemaju ime, ne mogu primati argumente, ne mogu vraćati ništa te u jednom ugovoru postoji najviše jedna fallback funkcija. | ||
- | Ovaj je napad omogućen kada pametni ugovor šalje | + | Ovaj je napad omogućen kada pametni ugovor šalje |
- | Pogledajmo | + | Na sljedećim slikama nalazi se primjer. U primjeru su dva pametna ugovora - napadnuti ugovor EtherStore te ugovor napadača Attack. Detaljna objašnjenja nalaze se ispod slika. |
{{: | {{: | ||
Redak 45: | Redak 41: | ||
U ovom primjeru EtherStore je napadnuti ugovor, a Attack je ugovor napadač.Originalna željena funkcionalnost ugovora EtherStore je da pohranjuje riječnik stanja računa svojih klijenata. Neki klijent može pohraniti određenu količinu valute (wei-ja) koji će se dodati na njegovo stanje računa, te može podizati wei-je sa svog računa. Naravno, u metodi za podizanje novaca, pametni ugovor EtherStore provjerava je li iznos koji se pokušava podići manji od stanja računa klijenta (naravno, nije moguće podići više sredstava nego što postoji na računu) te postoji ograničenje da svaki klijent može podići sredstva maksimalno jednom u tjedan dana. Ova su ograničenja vidljiva u linijama 14 i 16 pametnog ugovora EtherStore. U liniji 17, EtherStore šalje sredstva klijentu te u linijama 18 i 19 osvježava stanje računa i vremensku oznaku zadnjeg podizanja novca. | U ovom primjeru EtherStore je napadnuti ugovor, a Attack je ugovor napadač.Originalna željena funkcionalnost ugovora EtherStore je da pohranjuje riječnik stanja računa svojih klijenata. Neki klijent može pohraniti određenu količinu valute (wei-ja) koji će se dodati na njegovo stanje računa, te može podizati wei-je sa svog računa. Naravno, u metodi za podizanje novaca, pametni ugovor EtherStore provjerava je li iznos koji se pokušava podići manji od stanja računa klijenta (naravno, nije moguće podići više sredstava nego što postoji na računu) te postoji ograničenje da svaki klijent može podići sredstva maksimalno jednom u tjedan dana. Ova su ograničenja vidljiva u linijama 14 i 16 pametnog ugovora EtherStore. U liniji 17, EtherStore šalje sredstva klijentu te u linijama 18 i 19 osvježava stanje računa i vremensku oznaku zadnjeg podizanja novca. | ||
- | Pogledajmo sada napadača. | + | Napadač prvo pohranjuje određena sredstva (1 wei) na svoj račun u EtherStore, a zatim pokreće funkciju za podizanje tih sredstava - također 1 wei. Zahtjev za podizanje sredstava uspješno prolazi sve provjere te se u liniji 17 ugovora EtherStore sredstva (1 wei) šalju napadaču. Upravo ovdje događa se sigurnosni propust. Linija 17 zapravo pokreće fallback funkciju ugovora Attack, a u fallback funkciji nalazi se zloćudni kod. Taj kod ponovno poziva funkciju EtherStore-a za podizanje sredstava (ponovno jednog wei-a). Problem je u činjenici što su sredstva prethodnog poziva već na računu napadača, a novi poziv funkcije withrawFunds kreće se izvršavati prije nego što je prethodni poziv stigao osvježiti potrebne varijable stanja na računu i vremenske oznake podizanja novca. Tu zapravo ulazimo u petlju koja, wei po wei, potpuno prazni ukupan račun ugovora EtherStore, uz uspješne provjere svih varijabli u svakom pozivu. |
- | Ovo je jedan od većih i važnijih sigurnosnih prijetnji koje treba imati na umu pri dizajniranju pametnih ugovora. Ovakvo neželjeno ponašanje može se spriječiti na više načina. Jedno od rješenja je korištenje funkcije transfer() pri slanju sredstava vanjskim ugovorima. Funkcija transfer sa svojim pozivom šalje dovoljno gas-a (platne jedinice za izvršavanje funkcija) da bi se sredstva poslala, ali nedovoljno da bi vanjski ugovor izveo operaciju poput zvanja nekog drugog ugovora - to automatski sprječava ponovno pozivanje napadnutog ugovora. Još jedno rješenje je koristiti " | + | Ovo je jedan od većih i važnijih sigurnosnih prijetnji koje treba imati na umu pri dizajniranju pametnih ugovora. Ovakvo neželjeno ponašanje može se spriječiti na više načina. Jedno od rješenja je korištenje funkcije transfer() pri slanju sredstava vanjskim ugovorima. Funkcija transfer sa svojim pozivom šalje dovoljno gas-a (platne jedinice za izvršavanje funkcija) da bi se sredstva poslala, ali nedovoljno da bi vanjski ugovor izveo operaciju poput zvanja nekog drugog ugovora - to automatski sprječava ponovno pozivanje napadnutog ugovora. Još jedno rješenje je koristiti " |
Najpoznatiji napad ove vrste je napad na The DAO organizaciju (Decentralized autonomous organization). U tom trenutku, njihov pametni ugovor držao je na sebi više od 150 milijuna dolara. Ovakvim napadom napadač je uspio trećinu svih sredstava prebaciti na vanjski račun. Kako bi ispravili grešku, Ethereum zajednica odlučila se na kontroverzno rješenje - napraviti granu na Ethereum blockchainu i virtualno vratiti sva sredstva na originalni ugovor. Kao posljedica, dan danas postoje dva službena Ethereum blockchaina - Ethereum i Ethereum Classic (na Ethereum classic još se vidi posljedica napada). | Najpoznatiji napad ove vrste je napad na The DAO organizaciju (Decentralized autonomous organization). U tom trenutku, njihov pametni ugovor držao je na sebi više od 150 milijuna dolara. Ovakvim napadom napadač je uspio trećinu svih sredstava prebaciti na vanjski račun. Kako bi ispravili grešku, Ethereum zajednica odlučila se na kontroverzno rješenje - napraviti granu na Ethereum blockchainu i virtualno vratiti sva sredstva na originalni ugovor. Kao posljedica, dan danas postoje dva službena Ethereum blockchaina - Ethereum i Ethereum Classic (na Ethereum classic još se vidi posljedica napada). | ||
Redak 56: | Redak 52: | ||
Ovaj se napad bazira na postojanju overflowa i underflowa. Overflow i underflow javljaju se kao posljedica načina na koji računalo zapisuje brojeve u memoriju. Za zapis svakog tipa podatka rezerviran je određen broj bitova u memoriji. Primjerice za tip podatka uint8 rezervirano je 8 bitova te je posljedično u taj tip podatka moguće zapisati samo brojeve u rasponu [0,255]. Kada bi u varijabli tipa uint8 bio zapisan broj 255 i kada bismo mu pribrojili 1, umjesto 256 u varijabli bi bila zapisana vrijednost 0. Analogno, kada bismo varijabli sa vrijednošću 0 pokušali oduzeti 1, dobili bismo 255, a ne -1. Ova je pojava dovela do nekih ozbiljnih sigurnosnih prijetnji u razvoju pametnih ugovora. | Ovaj se napad bazira na postojanju overflowa i underflowa. Overflow i underflow javljaju se kao posljedica načina na koji računalo zapisuje brojeve u memoriju. Za zapis svakog tipa podatka rezerviran je određen broj bitova u memoriji. Primjerice za tip podatka uint8 rezervirano je 8 bitova te je posljedično u taj tip podatka moguće zapisati samo brojeve u rasponu [0,255]. Kada bi u varijabli tipa uint8 bio zapisan broj 255 i kada bismo mu pribrojili 1, umjesto 256 u varijabli bi bila zapisana vrijednost 0. Analogno, kada bismo varijabli sa vrijednošću 0 pokušali oduzeti 1, dobili bismo 255, a ne -1. Ova je pojava dovela do nekih ozbiljnih sigurnosnih prijetnji u razvoju pametnih ugovora. | ||
- | Pogledajmo primjere. | + | Na sljedećoj slici nalazi se primjer objašnjen u tekstu ispod slike. |
{{: | {{: | ||
Redak 62: | Redak 58: | ||
Zamišljena funkcionalnost prikazanog pametnog ugovora TimeLock je pohrana novca te mogućnost podizanja uz minimalnu vremensku odgodu od jednog tjedna. Uporabom funkcije increaseLockTime, | Zamišljena funkcionalnost prikazanog pametnog ugovora TimeLock je pohrana novca te mogućnost podizanja uz minimalnu vremensku odgodu od jednog tjedna. Uporabom funkcije increaseLockTime, | ||
- | Sličan bi problem nastao kada bismo recimo | + | Sličan bi problem nastao kada bi se primjerice |
Trenutno rješenje za sprječavanje ovakvih napada je korištenje (ili razvoj) matematičkih paketa koji bi zamijenili standardne matematičke operacije te koji bi provjerama sprječavali pojavu overflowa i underflowa. Primjer takve knjižnice je Safe Math Library kojeg razvija OppenZeppelin. | Trenutno rješenje za sprječavanje ovakvih napada je korištenje (ili razvoj) matematičkih paketa koji bi zamijenili standardne matematičke operacije te koji bi provjerama sprječavali pojavu overflowa i underflowa. Primjer takve knjižnice je Safe Math Library kojeg razvija OppenZeppelin. | ||
- | Primjer ovog napada u stvarnom svijetu je konstrukcija ponzijeve sheme na Ethereumu (PoWHC - Proof of Weak Hands Coin), čiji su kreatori zaboravili na problem overflowa i underflowa te posljedično izgubili 866 ethera | + | Primjer ovog napada u stvarnom svijetu je konstrukcija ponzijeve sheme na Ethereumu (PoWHC - Proof of Weak Hands Coin), čiji su kreatori zaboravili na problem overflowa i underflowa te posljedično izgubili 866 Ethera |
- | ===== Chapter 3 ===== | + | ===== Vidljivosti funkcija |
- | Uredi | + | Vidljivost funkcije određuje skup pozivatelja koji imaju mogućnost pokrenuti funkciju. Standardna vidljivost funkcija u Solidity-ju je " |
- | Uredi | + | Ova je ranjivost prilično trivijalna i poznata i iz drugih programskih jezika, no svejedno programeri često smetnu s uma vidljivost funkcija te se posljedično događaju sigurnosni propusti. Problem je u činjenici što, ukoliko nismo specificirali vidljivost, vidljivost funkcije je public, upravo najopasnija verzija vidljivosti. Stoga se u slučaju nemara ili zaborava lako nađemo u problemu. |
- | ===== Chapter 4 ===== | + | Proučimo trivijalni primjer: |
- | Uredi | + | {{: |
- | Uredi | + | Svrha ovog ugovora je dodijeliti nagradu sretnim dobitnicima - korisnicima sa adresom čijih su zadnjih 8 hex znakova nule. Ukoliko se provjera uspješno izvrši, poziva se funkcija _sendWinnings koja šalje pobjedniku novčanu nagradu. Problem je u tome što je autor ugovora HashForEther zaboravio specificirati vidljivost funkcije _sendWinnings na privatnu te bilo tko može jednostavno pozvati izravno tu funkciju i dobiti novčanu nagradu. |
- | ===== Chapter 5 ===== | + | Kako bi se izbjegla ova neugodnost, dobra je praksa uvijek specificirati vidljivost svim funkcijama, čak i javnim funkcijama, kako bi programer uvijek razmislio koja funkcija treba imati kakvu vidljivost i rjeđe nailazio na ovakav problem. |
- | Uredi | + | Primjer iz stvarnog svijeta je napadač koji je uočio ovakav propust u Parity multi-signature novčaniku na Ethereum platformi te iskoristivši tu ranjivost prebacio vrtoglavih 31 milijun dolara vrijednosti u Etheru na svoj račun u samo nekoliko minuta. Da napad nije vrlo brzo uočen i da je napadač imao još nekoliko sati, uspio bi otići sa 180 milijuna dolara vrijednosti sa svih ranjivih novčanika na mreži. Napad je spriječen tako da je grupa dobroćudnih hakera, uočivši napad, brzo analizirala isti te su brzom reakcijom sami hakirali preostale novčanike s navedenom ranjivošću i sami ukrali preostalih 150 milijuna dolara prije nego što je to uspio učiniti napadač. Nakon reorganizacije ranjivog koda i uklanjanja sigurnosne prijetnje, dobroćudni su napadači vratili ukradene iznose prethodnim vlasnicima. Nažalost, preostalih 31 milijun dolara nije se mogao vratiti prvobitnim vlasnicima. |
+ | |||
+ | Iako ovaj sigurnosni propust zvuči trivijalno, ovaj primjer, a vjerojatno i drugi primjeri, ipak ukazuju na ozbiljnost ovog problema pogotovo u ovom kontekstu gdje pametni ugovori zaista drže novčana sredstva na sebi te postoje ozbiljne posljedice od napada. | ||
+ | |||
+ | |||
+ | ===== Zaključak ===== | ||
+ | |||
+ | Ovaj je seminar razradio samo tri sigurnosne prijetnje, međutim postoji mnoštvo drugih raznih sigurnosnih prijetnji u programskom jeziku Solidity. Neke su prijetnje već nađene te već postoje rješenja i preporučene dobre prakse kako bi se te probleme spriječilo, | ||
+ | |||
+ | Unatoč nekolicini sigurnosnih prijetnji, Solidity je popularan programski jezik u blockchain svijetu i svijetu pametnih ugovora te je donio puno više dobroga nego što je narušeno napadima. Kao i u svakoj tehnologiji, | ||
- | Uredi | ||
===== Literatura ===== | ===== Literatura ===== | ||
Redak 100: | Redak 104: | ||
[[https:// | [[https:// | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | [[https:// | ||
[[https:// | [[https:// | ||