Mikä on uudelleentulohyökkäys?
Uudelleentulohyökkäyksessä sopimus luovuttaa hallinnan toiselle sopimukselle kutsun aikana, ja tämä ulkoinen koodi palaa ensimmäiseen sopimukseen ennen kuin se ehtii päivittää kirjanpitonsa. Tämän ajoituskikan ansiosta hyökkääjä voi toistaa arkaluonteisia toimintoja, kuten nostoja, yhä uudelleen. Kuvittele pyytäväsi hyvitystä ja palaavasi sitten tiskille ennen kuin kassanhoitaja ehtii lukita kassalippaan.
”Vain vanhaan koodiin voi kohdistua uudelleentulohyökkäys.” Ei pidä paikkaansa. Mikä tahansa sopimus voi olla haavoittuva, jos se tekee ulkoisen kutsun ennen oman tilansa lukitsemista ja logiikka on huolimattomasti toteutettu.
Miten uudelleentulohyökkäys toimii
Pieni esimerkki. Tyypillisessä älysopimuksessa on nostotoiminto, joka lähettää varoja kutsun tekijälle. Jos varat lähetetään ensin ja saldo nollataan vasta myöhemmin, hyökkääjä voi ujuttaa väliin takaisinkutsun ja pyytää lisää ennen kuin saldo on nollattu.
- Aloitus: Hyökkääjä tallettaa varoja näyttääkseen luotettavalta.
- Kutsu: Hyökkääjä käynnistää noston kohdesopimuksessa.
- Varafunktio: Kohdesopimus lähettää varoja, mikä käynnistää hyökkääjän varafunktion.
- Toisto: Varafunktio kutsuu nostoa uudelleen ennen saldon päivittymistä.
- Tyhjennys: Silmukka jatkuu, kunnes sopimuksesta loppuvat varat tai kaasuyksiköt. Jep, siinä se juju on.
Yksi pieni järjestysvirhe, iso ongelma.
Miksi uudelleentulohyökkäyksellä on väliä
Tämä kannattaa ottaa vakavasti, koska ajoitusvirheet liikuttavat oikeaa rahaa nopeasti. Lisäksi tämä on yksi niistä klassisista hyväksikäyttötavoista, jotka jokaisen rakentajan ja asiasta kiinnostuneen käyttäjän tulisi tunnistaa heti.
- Hyöty: Kun tunnet toimintamallin, voit havaita riskialttiin koodin ja pitää varat turvassa.
- Näkökulma: Hyökkäys hyötyy julkisesta läpinäkyvyydestä, sillä kaikki lohkoketjussa on näkyvää ja kutsuttavissa.
- Ajankohtaisuus: Törmäät siihen DeFi-palveluissa, silloissa, kassoissa ja jopa DAO:iden hallintoon liittyvissä maksusuorituksissa.
Etene järjestyksessä tarkistukset, vaikutukset ja vuorovaikutukset. Päivitä saldot ensin ja tee ulkoiset kutsut vasta sitten. Lisää ylimääräiseksi suojaksi yksinkertainen uudelleentulon estävä lukitus.
Uudelleentulohyökkäyksen keskeiset ominaisuudet
Näin se toimii:
- Rekursio: Ulkoinen koodi kutsuu samaa sopimusta uudelleen ennen kuin sopimus ehtii suorittaa toimintonsa loppuun.
- Järjestys: Virhe syntyy, kun varat lähetetään tai ulkoinen kutsu tehdään ennen tilan päivittämistä.
- Sopimusten välinen: Hyökkäys voi kulkea useiden sopimusten kautta, ei vain yhden toiminnon sisällä.
- Varat: Hyökkäys toimii ETH:lla, tokeneilla ja jopa kirjanpidollisilla hyvityksillä, jos koodi on huonosti toteutettu.
Muunnelmat
Eri muotoja, sama päänvaiva huolimattomasti kirjoitetulle koodille:
- Yksittäinen: Samaan toimintoon palataan yhä uudelleen.
- Sopimuksen sisäinen: Sopimukseen palataan uudelleen saman sopimuksen toisen toiminnon kautta.
- Monisopimuksinen: Sopimuksiin palataan uudelleen kahden tai useamman sopimuksen muodostaman silmukan kautta.
- Vain lukuun kohdistuva: Näkymiin tai hintaoraakkeleihin vaikutetaan myöhempien kirjoitustoimintojen huijaamiseksi.
Uudelleentulohyökkäyksen korjaaminen ei tarkoita vain yhden toiminnon korjaamista. Tarkista kaikki ulkoiset kutsut, lisää testejä poikkeuksellisille kutsuketjuille ja ajoita säännöllisiä auditointeja.
Esimerkki
Vuoden 2016 The DAO -hyökkäyksessä käytettiin noston yhteydessä uudelleentulosilmukkaa, ennen kuin saldot oli nollattu. Näin valtava kassa tyhjennettiin minuuteissa.
Hauska fakta
Sanonta ”ensin tarkistukset, sitten vaikutukset ja lopuksi vuorovaikutukset” on peräisin varhaisista tietoturvaoppaista. Se jäi käyttöön, koska se on lyhyt, mieleenpainuva ja toimiva.
Yhteenveto
Lyhyesti, tämän voit pitää mielessä: jos ulkoinen koodi voi kutsua sopimusta ennen kuin se ehtii hoitaa oman kirjanpitonsa, oleta niin tapahtuvan – ja että saatat silloin antaa sille rahaa ilmaiseksi. Tätä tarkoittaa uudelleentulohyökkäys.