Kokonaisluku

Ylivuoto kokonaisluku ( kokonaisluvun ylivuoto ) on, ja laskemalla , tila, joka ilmenee, kun matemaattinen operaatio tuottaa numeerinen arvo on suurempi kuin esitettäväksi käytettävissä olevan tallennustilan. Esimerkiksi yhden lisääminen suurimpaan mahdolliseen kuvattavaan lukuun johtaa kokonaisluvun ylivuotoon. Kokonaisluvun ylivuoto on numeroitu CWE-190 Common Weakness Enumerationissa .

Tunnetuin kokonaisluku ylityksistä viime vuosina on hyvin mahdollisesti se, joka aiheutti tuhoaminen Ariane 5 raketin aikana ensilentonsa , The4. kesäkuuta 1996.

Alkuperä

Määrä bittejä varastotilassa määrittää maksimiarvo, joka voidaan esittää siellä. Tallennustilojen tavallisimmat bittimäärät ja niihin liittyvät enimmäisarvot ovat:

8 bittiä: enintään esitettävissä arvo = 2 8 - 1 = 255; 16 bittiä: suurin edustettava arvo = 2 16 - 1 = 65 535; 32 bittiä: yleisimpiä henkilökohtaisissa tietokoneissa, suurin edustettava arvo = 2 32 - 1 = 4 294 967 295; 64 bittiä: suurin edustettava arvo = 264 - 1 = 18446744077070555000; 128 bittiä: suurin edustettava arvo = 2128 - 1 = 340282366920938 500 000 000 000 000 000 000 000 000 000

Koska matemaattinen operaatio voi tuottaa tuloksen, joka on suurempi kuin suurin edustettava arvo, voi tapahtua kyvyttömyys tallentaa toiminnan tulos. Tämä virhetila johtaa virheilmoitukseen tai tuloksen katkaisuun, mikä on sitten virheellinen.

Esimerkiksi C-kieli käsittää useita numerotyyppejä, jotka mahdollistavat allokoitavan muistin koon valitsemisen suurimpien lukujen mukaan.

Esimerkki

Seuraava esimerkki on otettu todellisesta haavoittuvuudesta, joka vaikuttaa OpenSSH: iin (versiot 2.9.9-3.3) ja jolla on seuraava CVE- tunnistenumero : CVE-2002-0639.

Alla oleva OpenSSH: sta otettu lähdekoodikatkelma on C-kielellä , kommentteja on lisätty selkeyden vuoksi.

// extrait un entier d'un paquet reçu par OpenSSH. nresp = packet_get_int(); if (nresp > 0) { // alloue un tampon de: nresp * 4 octets response = xmalloc(nresp*sizeof(char*)); for (i = 0; i < nresp; i++) response[i] = packet_get_string(NULL); }

Edellä esitetyssä koodissa kokonaisluku otetaan OpenSSH: n vastaanottamasta paketista. Tämä kokonaisluku kerrotaan sitten koko ( sizeof ) on char osoitin , joka on yleensä 4 tavua on 32-bittinen järjestelmä. Tämän kertolaskun tulos välitetään sitten parametrina xmalloc-funktiolle (samanlainen kuin malloc ), jota käytetään puskurin varaamiseen .

Jos paketissa vastaanotetun kokonaisluvun ( muuttuja nresp) arvo on 1 073 741 824, operaation " nresp*sizeof(char*) " tulos  vastaa:

1 073 741 824 × 4 = 4294 967 296.

32-bittisen kokonaisluvun suurin edustettava arvo on 2 32 - 1, katkaisu tapahtuu siten arvossa 2 32 . xmallocKoodissa olevalle funktiolle välitetty parametri on sen vuoksi arvoinen (missä %on modulo- operaattori ):

(1073741824 * 4) % 232 = 0

joko tavallisessa matemaattisessa kirjoituksessa

(1 073 741 824 × 4) ≡ 0 [2 32 ]

Koska useimmissa tapauksissa muistin allokoinnit sallivat 0 tavun varaamisen, funktio xmallocpalauttaa kelvollisen osoittimen 0 tavun puskuriin. Suoraan allokointitoimintoa seuraava silmukka lisää tietoja tähän 0 tavun puskuriin aiheuttaen kasan ylivuotoa .

Viitteet

  1. (en) "  CWE-190: Kokonaislähtö tai ylitys  " , yleinen heikkouslaskenta .
  2. (sisään) "  CVE-2002-0639  " , Yleiset haavoittuvuudet ja altistukset .

Katso myös