jeni duke lexuar...
Leksione

Buffer Overflow … Ja një nga arsyet perse ndodh!

A e keni pare

Nuk eshte e para here qe e shikoni ... besoj!

“Buffer overflow” ose “buffer overrun” eshte nje anomali qe ndodh kur nje program, gjate procesit te shkrimit ne nje “buffer”, kapercen kufijte e  percaktuar te tij duke shkruar ne kujtesen bashkangjitur buferit.

Ka shume arsye perse mund te ndodhe nje fenomen i tille. Ketu me poshte do te trajtojme rastin kur nje “buffer overflow” shkaktohet nga nje “overflow” gjate veprimeve arithmetike me numrat.

Gjate shumezimit ose mbledhjes se dy numrave te plote (integer) rezultati mund te jete nje numer me vlere te gabuar dhe shume te vogel. Ne rast se ky numer perdoret per te percaktuar madhesine e nje bufferi, atehere ai do te jete me i vogel se sa duhet duke u bere keshtu shkak per nje “buffer overflow” te mundshem.

Shembull

Si shembull do te na sherbeje nje dobësi reale ne kodin (“vulnerability“) e OpenSSH (version 2.9.9 – 3.3).Ketu me poshte eshte nje cope kod ne gjuhen C i OpenSSH.

// nxirret nje numer i plote prej nje pakete te mare prej OpenSSH.
nresp = packet_get_int();
if (nresp > 0) {
    // percaktohet nje buffer me madhesi : nresp * 4 byte
    response = xmalloc(nresp*sizeof(char*));
    for (i = 0; i > nresp; i++)
        response[i] = packet_get_string(NULL);
}

Ne kodin e mesiperm, nje numer i plote nxirret nga nje pakete (frame) ethernet e kapur prej OpenSSH. Ky numer shumezohet me madhesine e nje shenjuesi “char” (sizeof(char) , qe zakonisht eshte 4 byte). Rezultati i shumezimit sherben si parameter per funksionin xmalloc (memory allocation), i cili krijon nje bufer ne kujtese.

Ne se numri i plote qe merret nga nje frame ethernet eshte 1 073 741 824, atehere rezultati i operacionit nresp*sizeof(char*) do te kete vleren :  1073741824 * 4 = 4294967296

Vlera maksimale e nje numri te plote qe mund te paraqitet me 32 bite eshte 232 – 1 = 4 294 967 295.

Rrjedhimisht do te kemi nje “overflow” te nresp*sizeof(char*), duke bere qe vlera e madhesise se buferit te jete :  nresp*sizeof(char*) = 0

Si perfundim funksionin xmalloc do te krijoje nje bufer inekzistent pasi ai do te kete madhesi 0 byte. Pra, “buffer overflow” eshte i paevitueshem.

Ja si eshte korrigjuar kjo dobësi ne versionin 3.4 te OpenSSH.

        nresp = packet_get_int();

+       if (nresp > 100)

+              fatal(“input_userauth_info_response: nresp too big %u”, nresp);

        if (nresp > 0) {

               response = xmalloc(nresp * sizeof(char*));

               for (i = 0; i < nresp; i++)

Shëmbuj të tjerë :  Pac-Man, spleet-screen

Shikoni edhe kete : Code Red Worm

Diskutim

Ende pa komente.

Lini një Përgjigje

Ju lutemi, bëni hyrjen me një nga këto metoda që të postoni komentin tuaj:

Stema e WordPress.com-it

Po komentoni duke përdorur llogarinë tuaj WordPress.com. Dilni /  Ndryshoje )

Foto Google

Po komentoni duke përdorur llogarinë tuaj Google. Dilni /  Ndryshoje )

Foto Twitter-i

Po komentoni duke përdorur llogarinë tuaj Twitter. Dilni /  Ndryshoje )

Foto Facebook-u

Po komentoni duke përdorur llogarinë tuaj Facebook. Dilni /  Ndryshoje )

Po lidhet me %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Regjistroni adresën tuaj e-mail për të marrë artikujt e rinj nëpërmjet mesazheve ...

Kategori

Intel CPU Architectures

Procesore Apple Ax

Apple A12 Bionic
Këtë e pëlqejnë %d blogues: