Olemme juuri nähneet, kuinka pieni porsaanreikä johtaa taloudelliseen menetykseen (vaihtelevassa laajuudessa), samalla tavalla kuin vakavuuden yli kehitetyt älykkäät sopimukset ovat alttiita erilaisille tunnetuille ja tuntemattomille hyökkäyksille. Hyödyntäjät hyödyntävät vikoja ja porsaanreikiä kurkistaakseen älykkäitä sopimuksia ja manipuloiden heitä hyökkäysten tekemiseksi. Tässä esitämme kattavan luettelon viidestä parhaasta tavallisimmasta virheestä Solidity-ohjelmointikielessä.
Seuraamme QuillAuditsissa mukautuvaa metodologiaa saadaksemme jokaisen hakkeroinnin ytimen ja toteuttaaksemme sen oppimisen tulevista älykkäistä sopimuksista mahdollisten uhkien välttämiseksi.
Virheet vakauden ohjelmointikielessä
1. Valitsematon ulkoinen puhelu
Olemme vetämässä tätä ongelmaa ensinnäkin, koska se on yksi yleisimmin havaituista vakavuuden karhuista. Yleensä eetterin lähettäminen ulkoiselle tilille tapahtuu siirtää() toiminto. Tämän lisäksi kaksi yleisimmin käytettyä toimintoa ulkoisen puhelun soittamiseen ovat; puhelu()ja lähettää(), täällä pääasiassa puhelu() -toimintoa käytetään laajasti kehittäjien suorittamaan monipuolisia ulkoisia puheluita.
Vaikka puhelu() ja lähettää() function palauttaa loogisen arvon, joka määrittää, onnistuiko puhelu vai ei. Näin ollen tässä tapauksessa, jos jokin toiminnoista puhelu() or lähettää() ei onnistu suorittamaan tehtävää, he palaavat a: lla väärä. Näin ollen, jos kehittäjä ei tarkista palautusarvoa, siitä tulee kuoppa.
Haavoittuvuus
Harkitse alla olevaa esimerkkiä:
sopimus Lotto {
boolpublic payedOut = false;
osoite julkinen voittaja;
uintpublic winAmount;
//… lisätoiminnot täällä
function sendToWinner () public {
vaatia (! payedOut);
voittaja.lähetä (winAmount);
payedOut = tosi;
}
function cancelLeftOver () public {
vaatia (payedOut);
msg.sender.send (tämä tasapaino);
}
}
Yllä olevassa Lotto-tyyppisessä sopimuksessa voimme havaita, että a voittaja vastaanottaa winAmount eetteriä, jättäen vähän jäännöstä poistettavaksi mistään ulkoisesta aineesta.
Tällöin sopimuksen kuoppa on olemassa rivillä [11], jossa a lähettää käytetään ilman vastauksen ristivalidointia. Edellä olevassa esimerkissä a voittaja jonka liiketoimi epäonnistuu (joko kaasun puutteen vuoksi tai jos kyseessä on sopimus, joka tarkoituksellisesti heittää varatoiminnon), valtuuttaa maksettu asetettava arvoon totta riippumatta siitä, onnistuiko eetterikauppa vai ei. Tässä tapauksessa kuka tahansa hyväksikäyttäjä voi peruuttaa voittajan voitot drawLeftOver toiminto.
QuillAuditin lähestymistapa
Sisäinen kehittäjätiimimme korjaa tämän virheen käyttämällä [siirtää] -toiminnon sijaan [lähettää] toiminto, koska [siirto] palautuu, jos ulkoinen tapahtuma palaa. Ja jos käytät [lähetä], tarkista aina palautusarvo.
Yksi vankka lähestymistapa, jota seuraamme, on [vetäytymismallin] käyttö. Tällöin eristämme loogisesti ulkoisen lähetystoiminnon muusta koodikannasta ja asetamme potentiaalisesti epäonnistuneiden tapahtumien rasituksen loppukäyttäjälle, koska hän kutsuu peruutustoimintoa.
2. Uudelleen sisäänkäynti
Ethereumin älykkäät sopimukset kutsuvat ja käyttävät muiden ulkoisten sopimusten koodeja, ja tämän suorittamiseksi sopimusten on lähetettävä ulkoiset puhelut. Nämä ulkoiset puhelut ovat haavoittuvia ja alttiita hyökkäyksille, yksi tällainen hyökkäys tapahtui äskettäin DAO-hakkeroinnin yhteydessä.
Haavoittuvuus
Hyökkääjät tekevät tällaisia hyökkäyksiä, kun sopimus lähettää eetterin tuntemattomaan osoitteeseen. Tällöin hyökkääjä voi luoda sopimuksen ulkoiseen osoitteeseen, jolla on haitallista koodia varatoiminnossa, ja tämä haitallinen koodi käynnistetään, kun sopimus lähettää eetterin tähän osoitteeseen.
Fakta: Termi "uudelleenkäynnistys" on luotu siitä, että kun ulkoinen haitallinen sopimus kutsuu haavoittuvassa sopimuksessa olevan toiminnon ja koodin suorituspolku "syöttää" sen uudelleen.
Harkitse alla olevaa esimerkkiä, se on Ethereum-holvi, jonka avulla tallettajat voivat nostaa vain yhden eetterin viikossa.
sopimus EtherStore {
uint256 julkinen peruutusraja = 1 eetteri;
kartoitus (osoite => uint256) public lastWithdrawTime;
julkisten saldojen kartoitus (osoite => uint256);
function depositFunds () ulkoinen maksettava {
saldot [viestin lähettäjä] + = viestin arvo;
}
function cancelFunds (uint256 _weiToWithdraw) public {
vaatia (saldot [msg.sender]> = _weiToWithdraw);
// rajoita nostoa
vaatia (_weiToWithdraw <= peruutusraja);
// rajoittaa peruuttamisaikaa
vaativat (nyt> = lastWithdrawTime [msg.sender] + 1 viikko);
vaatia (msg.sender.call.value (_weiToWithdraw) ());
saldot [msg.sender] - = _weiToWithdraw;
lastWithdrawTime [msg.sender] = nyt;
}
}
Yllä olevassa sopimuksessa meillä on kaksi julkista toimintoa, [depositFunds] ja [cancelFunds]. [DepositFunds] -maksua käytetään lähettäjän saldon korottamiseen, kun taas [drawFunds] määrittää nostettavan summan. Tässä tapauksessa on menestys, jos poistettava määrä on alle 1 eetteri.
Kuoppa on tässä linjassa [17], jossa eetterin siirto tapahtuu. Hyökkääjä voi luoda haitallisen sopimuksen [EtherStores]: n sopimusosoitteen kanssa ainoana rakentajan parametrina. Tämä tekisi [etherStore] -palvelusta julkisen muuttujan, joten se on alttiimpi hyökätä.
QuilllAuditin lähestymistapa
Seuraamme erilaisia tekniikoita välttääksesi mahdolliset uudelleenkäynnistyshaavoittuvuudet älykkäissä sopimuksissa. Aivan ensimmäinen ja paras mahdollinen tapa on sisäänrakennetun [siirto] -toiminnon käyttö siirrettäessä eetteriä mihin tahansa ulkoiseen sopimukseen.
Toiseksi on tärkeää varmistaa, että kaikki tilamuuttujien loogiset muutokset tehdään ennen eetterin lähettämistä sopimuksesta. [EtherStore] -esimerkissä rivit [18] ja [19] tulisi laittaa rivin [17] eteen.
Kolmatta tekniikkaa voidaan käyttää myös puhelujen estämiseen; mutexin käyttöönoton kautta. Se on tilamuuttujan lisäys, joka lukitsee sopimuksen koodin suorituksen aikana.
3. Oletusnäkymät
Solidityssä käytetyille toiminnoille on näkyvyysmäärittelyjä, ja ne määrittelevät tavan, jolla niitä voidaan kutsua. Näkyvyys määrää toimintojen kutsun; käyttäjien ulkoisesti, muilla johdetuilla sopimuksilla, vain sisäisesti tai vain ulkoisesti. Katsotaanpa, kuinka näkyvyysmäärittäjien virheellinen käyttö voi aiheuttaa valtavan haavoittuvuuden älykkäissä sopimuksissa.
Haavoittuvuus
Oletuksena toiminnon näkyvyys on [julkinen], joten ulkopuoliset käyttäjät voivat kutsua toimintoja ilman erityistä näkyvyyttä. Virhe syntyy, kun kehittäjät unohtavat määritellä näkyvyyden toiminnoille, joiden tulisi olla yksityisiä (tai joita voidaan kutsua itse sopimuksessa). Esimerkiksi;
sopimus HashForEther {
funktio drawWinnings () {
// Voittaja, jos osoitteen viimeiset 8 hex-merkkiä ovat 0
vaatia (uint32 (viestin lähettäjä) == 0);
_sendWinnings ();
}
function _sendWinnings () {
msg.sender.transfer (tämä tasapaino);
}
}
Yllä oleva sopimus on yksinkertainen osoite-arvauspalkkio. Tässä voimme nähdä, että toimintojen näkyvyyttä ei ole määritelty, varsinkin [_sendWinnings] -toiminto on [julkinen] (oletusarvoisesti), joten tätä voidaan kutsua minkä tahansa osoitteen kautta palkkion varastamiseksi.
QuillAuditin lähestymistapa
Sisäinen tiimimme koostuu kokeneista kehittäjistä, jotka noudattavat aina parhaita tarkastuskäytäntöjä. Tällöin toimintojen näkyvyys on määriteltävä erikseen, vaikka ne olisi tarkoitus pitää julkisina, se on mainittava.
4. Rakentajien käytön turvaaminen
Rakentajia kutsutaan yleensä erityistoiminnoiksi, joita käytetään kriittisten ja etuoikeutettujen tehtävien suorittamiseen sopimuksia alustettaessa. Ennen vakautta [v0.4.22] rakentajilla oli sama nimi kuin niitä sisältävässä sopimuksessa. Tarkastellaan nyt tapausta, jossa sopimuksen nimeä muutetaan kehitysvaiheessa, mutta rakentajan nimi pysyy samana, tämä porsaanreikä voi myös tarjota hyökkääjille helpon pääsyn älykkääseen sopimukseesi.
Haavoittuvuus
Se voi johtaa vakaviin seurauksiin, jos sopimuksen nimeä muutetaan, mutta rakentajan nimi ei muutu. Esimerkiksi:
sopimus OwnerWallet {
osoite julkinen omistaja;
// rakentaja
function ownerWallet (osoite _omistaja) public {
omistaja = _omistaja;
}
// Perääntyä. Kerää eetteri.
function () maksettava {}
funktio exit () public {
vaatia (msg.sender == omistaja);
msg.sender.transfer (tämä tasapaino);
}
}
Edellä olevassa sopimuksessa voimme nähdä, että vain omistaja voi vetää eetteriä kutsumalla [perua] -toimintoa. Tässä haavoittuvuus ilmenee, kun rakentaja on nimetty sopimuksesta poikkeavaksi (ensimmäinen kirjain on erilainen!). Siksi hyväksikäyttäjä voi kutsua [ownerWallet] -toiminnon ja valtuuttaa itsensä omistajaksi ja peruuttaa sitten kaiken eetterin sopimuksessa kutsumalla [cancel].
QuillAuditin lähestymistapa
Noudatamme Solidity-kääntäjän versiota [0.4.22]. Tämä versio on ottanut käyttöön avainsanan; [konstruktori], joka vaatii funktion nimen vastaamaan sopimuksen nimeä.
5. Tx.Origin-todennus
Tässä [Tx.Origin] on Solidityn maailmanlaajuinen muuttuja, joka sisältää puhelun tai tapahtuman alun perin suorittaneen tilin osoitteen. Tätä muuttujaa ei voida käyttää todentamiseen, koska se tekee sopimuksen haavoittuvaksi tietojenkalasteluhyökkäyksille.
Haavoittuvuus
Sopimukset, jotka valtuuttavat käyttäjät [tx.origin] -muuttujan kautta, ovat alttiina ulkoisille hyökkäyksille, jotka saavat käyttäjät suorittamaan todennetut toimet virheelliselle sopimukselle. Harkitse seuraavaa esimerkkiä:
sopimus phishable {
osoite julkinen omistaja;
rakentaja (osoite _omistaja) {
omistaja = _omistaja;
}
function () ulkoinen maksettava {} // kerää eetteri
function cancelAll (osoite _vastaanottaja) public {
vaatia (tx.origin == omistaja);
_vastaanottaja.siirto (tämä tasapaino);
}
}
Täällä rivillä [11] sopimus valtuuttaa [peruuttaa kaikki] -toiminnon [tx.origin] -apuohjelman avulla.
QuillAuditin lähestymistapa
Vältämme yleensä [tx.origin] -palvelua valtuutuksissa älykkäissä sopimuksissa. Vaikka [tx.origin] -palvelun käyttö ei ole ehdottomasti kielletty, sillä on joitain erityisiä käyttötapauksia. Voimme estää [tx.origin] estää ulkopuoliset sopimukset kutsumasta nykyistä sopimusta, se voidaan suorittaa [vaatia] -lomakkeella [vaatia (tx.origin == msg.sender)]. Vältetään välisopimusten soittaminen nykyisen sopimuksen kutsumiseksi, joka rajoittaa sopimuksen tavallisiin koodittomiin osoitteisiin.
Viimeinen käärintä
Olemme käsitelleet kattavasti viisi yleistä vakavuuden kielen karhua. Älykkäitä sopimuksia kehittäessämme emme saa unohtaa, että ne ovat muuttumattomia suunnittelunsa vuoksi, mikä tarkoittaa, että kun olemme luoneet ne, lähdekoodia ei voida korjata.
Tämä asettaa kehittäjille suuren haasteen hyödyntää käytettävissä olevia tietoturvatestaus- ja tarkastustyökaluja ennen käyttöönottoa.
Sisäinen tilintarkastusasiantuntijaryhmä havaitsee älykkäille sopimuksille mahdollisesti aiheutuvat haitalliset uhat ja riskit, joista osa mainitsimme edellä. Me QuillAuditsilla teemme parhaamme tietoturvatutkimuksessa pitääkseen sopimuksesi ajan tasalla kaikilla ohjelmistojen tietoturvakäytännöillä, jotta sopimuksesi pysyy turvassa.
Tavoita QuillHash
Alalla on ollut vuosia QuillHash on toimittanut yritysratkaisuja ympäri maailmaa. QuillHash asiantuntijaryhmän kanssa on johtava blockchain-kehitysyritys, joka tarjoaa erilaisia teollisuuden ratkaisuja, mukaan lukien DeFi-yritys. Jos tarvitset apua älykkäiden sopimusten tarkastuksessa, ota rohkeasti yhteyttä asiantuntijoihimme täällä!
Seuraa QuillHashia saadaksesi lisää päivityksiä
Lähde: https://blog.quillhash.com/2021/06/04/top-5-common-errors-in-solidity-programming-language/
- 11
- Tili
- Etu
- Kaikki
- tilintarkastus
- Authentication
- lupa
- PARAS
- blockchain
- Vika
- Bugs
- soittaa
- tapauksissa
- Aiheuttaa
- haaste
- koodi
- Yhteinen
- yritys
- sopimus
- sopimukset
- Nykyinen
- DAO
- defi
- Malli
- Kehittäjä
- kehittäjille
- Kehitys
- yritys
- Eetteri
- ethereum
- tapahtuma
- asiantuntijat
- taloudellinen
- Etunimi
- seurata
- muoto
- Ilmainen
- toiminto
- tulevaisuutta
- peli
- GAS
- Global
- suuri
- hakata
- tätä
- Miten
- HTTPS
- valtava
- Mukaan lukien
- teollisuus
- IT
- Kieli
- johtaa
- johtava
- linja
- Lista
- ottelu
- Muut
- omistaja
- läikkä
- Kuvio
- Phishing
- tietojenkalasteluhyökkäykset
- määrätä
- esittää
- yksityinen
- Ohjelmointi
- julkinen
- vetämällä
- tutkimus
- vastaus
- REST
- turvallista
- turvallisuus
- Palvelut
- setti
- Yksinkertainen
- pieni
- fiksu
- älykäs sopimus
- Smart-sopimukset
- So
- Tuotteemme
- kiinteys
- Ratkaisumme
- Osavaltio
- menestys
- Testaus
- Lähde
- uhat
- aika
- ylin
- top 5
- kauppa
- Liiketoimet
- us
- Käyttäjät
- arvo
- Holvi
- näkyvyys
- haavoittuvuuksia
- alttius
- Haavoittuva
- viikko
- KUKA
- sisällä
- vuotta