Mikä on kokonaislukujen ylivuotohyökkäys?
Kokonaislukujen ylivuotohyökkäys tapahtuu, kun ohjelman luku saavuttaa enimmäisarvonsa ja kiertyy takaisin alkuun, jolloin hyökkääjä voi manipuloida saldoja tai rajoituksia. Kryptossa tällainen kiertyminen voi muuttaa tarkistuksen ”onko sinulla tarpeeksi tokeneita?” myöntäväksi, vaikka vastauksen pitäisi olla kielteinen. Kuvittele vanhan auton matkamittari, joka vaihtuu lukemasta 999999 lukemaan 000000 — mutta nyt pelissä on rahaa.
”Nykyaikaiset kääntäjät tekevät tämän mahdottomaksi.” Ei aivan. Monissa älysopimuksissa käytetään yhä paikoin tarkistamatonta aritmetiikkaa, mukautettua matematiikkaa tai assembly-koodia, jotka voivat tuoda ylivuotovirheet takaisin.
Näin kokonaislukujen ylivuotohyökkäys toimii
Tässä nopea läpikäynti, jossa näyttämönä on token-sopimus.
- Vaihe 1: Sopimus tallentaa saldot kiinteän kokoisina kokonaislukuina, ja siinä on toiminto, joka lisää, vähentää tai kertoo määriä.
- Vaihe 2: Hyökkääjä valitsee syötteet, jotka kasvattavat luvun sen enimmäisarvon yli ja saavat sen kiertymään hyvin pieneksi tai lähelle nollaa.
- Vaihe 3: Kiertyminen muuttaa tarkistuksen tuloksen. Esimerkiksi kiertymisen jälkeen saldo näyttää valtavalta tai siirtoraja hyvin pieneltä, jolloin require-ehto täyttyy.
- Vaihe 4: Hyökkääjä luo ansaitsemattomia tokeneita, kiertää ylärajan tai siirtää varoja, joita hänen ei pitäisi pystyä liikuttamaan.
- Vaihe 5: Hän siirtelee voitot kaupoilla tai siltojen kautta ja poistuu ennen kuin kukaan huomaa tapahtunutta.
Tositarina: useissa ERC 20 -tokeneissa oli aikoinaan eräkäsittelyn ylivuotovirhe, jonka avulla hyökkääjät pystyivät luomaan järjettömän suuren määrän tokeneita ja sitten myymään ne exchangessa. Kyllä, niin todella tapahtui.
Miksi kokonaislukujen ylivuotohyökkäyksellä on väliä
Jos omistat tokeneita, kehität sovelluksia tai käyt kauppaa DeFi-markkinoilla, tähän kannattaa kiinnittää huomiota. Kyse on luvuista, ja kryptossa kaikki perustuu lukuihin.
- Hyöty: Kun ymmärrät, miten tämä toimii, huomaat varoitusmerkit ajoissa ja pystyt suojaamaan rahasi.
- Näkökulma: Aritmeettiset virheet eivät vanhene. Uusia ketjuja ja työkaluja tulee, mutta ammattilaiset hyödyntävät yhä matemaattisia virheitä.
- Ajankohtaisuus: Tällaisia virheitä voi esiintyä tokenien tarjontalaskennassa, palkkiojärjestelmissä, NFT-laskureissa ja suosituissa dAppeissa, jotka käsittelevät käyttäjien saldoja.
Solidityssä aritmetiikan tarkistusten kannattaa olla oletusarvoisesti käytössä, ja unchecked-lohkojen tulee olla pieniä ja auditoituja. Lisää fuzz-testejä, joissa kokeillaan ääriarvoja eikä vain suotuisia tapauksia.
Kokonaislukujen ylivuotohyökkäyksen keskeiset ominaisuudet
Mikä erottaa sen muista virheistä:
- Kiertyminen: Luvut palaavat enimmäisarvosta nollaan kuin ympyrää kiertävä laskuri.
- Huomaamattomuus: Tarkistamattomasta laskutoimituksesta ei tule natiivia virheilmoitusta, joten virheelliset tulokset näyttävät kelvollisilta.
- Laukaistavuus: Käyttäjän hallitsemilla syötteillä voidaan usein saada virhe tapahtumaan juuri halutulla hetkellä.
- Toistettavuus: Kun hyökkääjät löytävät virheen, he voivat automatisoida sen ja käyttää sitä moniin kohteisiin.
Muunnelmat
Tavallisimmat muodot: samaa virhetyyppiä, mutta eri toteutustapoja:
- Alivuoto: Vähennyslasku alittaa nollan ja kiertyy valtavan suureksi arvoksi.
- Yhteenlasku: Saldoon tai tarjontaan tehtävä lisäys ylittää enimmäisarvon ja kiertyy takaisin pieneksi luvuksi.
- Kertolasku: Palkkiokertoimet tai skaalauskertoimet kasvattavat arvon rajoitusten yli.
- Laskuri: Tokenin tunnisteen tai tarjonnan laskuri kiertyy ympäri, jolloin tokeneita voidaan luoda ylärajan yli.
Kokonaislukujen ylivuotohyökkäys ei koske vain Solidityä. Sitä voi esiintyä Vyperissä, Rustissa, Movessa tai mukautetussa assembly-koodissa, ja monet julkisuuteen nousseet hyväksikäytöt ovat pohjimmiltaan johtuneet saldojen tai tarjonnan tarkistamattomasta laskennasta.
Esimerkki
Palkkiotoiminto kertoo käyttäjän antaman luvun suurella bonuksella, arvo kiertyy ympäri ja ylärajan tarkistus menee läpi. Näin kokonaislukujen ylivuotohyökkäys antaa hyökkääjän luoda paljon enemmän tokeneita kuin oli tarkoitus.
Hauska fakta
Kolikkopelien klassikkopelin tason 256 tapporuutu? Tuo kuuluisa jumittuminen johtui kokonaislukujen ylivuodosta. Se todistaa, että myös retropeleissä voi vahingossa nähdä esimakua kryptovirheistä.
Yhteenveto
Ajattele kokonaislukujen ylivuotohyökkäystä niin, että luvut kiertävät täyden kierroksen ja varkaat syöksyvät syntyneestä aukosta läpi. Pidä laskutoimitukset tarkistettuina, niin nukut yösi paremmin.