Desbordament del buffer de pila

Anomalia del programari

Al programari, es produeix un desbordament de la memòria intermèdia de pila o un desbordament de la memòria intermèdia de pila quan un programa escriu en una adreça de memòria a la pila de crides del programa fora de l'estructura de dades prevista, que sol ser una memòria intermèdia de longitud fixa.[1][2] Els errors de desbordament de la memòria intermèdia de la pila es produeixen quan un programa escriu més dades en una memòria intermèdia situada a la pila de les que realment s'assigna a aquesta memòria intermèdia. Això gairebé sempre provoca la corrupció de les dades adjacents a la pila i, en els casos en què el desbordament es va activar per error, sovint farà que el programa es bloquegi o funcioni incorrectament. El desbordament de la memòria intermèdia és un tipus de mal funcionament de programació més general conegut com a desbordament de la memòria intermèdia (o desbordament de la memòria intermèdia).[1] L'excés d'ompliment d'un buffer a la pila és més probable que descarrili l'execució del programa que l'excés d'ompliment d'un buffer a la pila perquè la pila conté les adreces de retorn de totes les crides de funcions actives.

Imatge que mostra la pila del programa abans del desbordament de la memòria intermèdia

Un desbordament de la memòria intermèdia de pila es pot provocar deliberadament com a part d'un atac conegut com a trencament de pila. Si el programa afectat s'executa amb privilegis especials, o accepta dades d'amfitrions de xarxa no fiables (per exemple, un servidor web), l'error és una vulnerabilitat de seguretat potencial. Si la memòria intermèdia de la pila s'omple de dades subministrades per un usuari no fiable, aquest usuari pot corrompre la pila de manera que injecti codi executable al programa en execució i pren el control del procés. Aquest és un dels mètodes més antics i més fiables per als atacants per obtenir accés no autoritzat a un ordinador.[3][4]

Aprofitant els desbordaments de memòria intermèdia de pila

modifica

El mètode canònic per explotar un desbordament de memòria intermèdia basat en la pila és sobreescriure l'adreça de retorn de la funció amb un punter a les dades controlades per l'atacant (normalment a la pròpia pila).[5] Això s'il·lustra amb strcpy() a l'exemple següent:

#include <string.h>

void foo(char *bar)
{
 char c[12];

 strcpy(c, bar); // no bounds checking
}

int main(int argc, char **argv)
{
 foo(argv[1]);
 return 0;
}
 
A. - Abans de copiar les dades.
 
B. - "hola" és el primer argument de la línia d'ordres.
 
C. - "AAAAAAAAAAAAAAAAAAAA\x08\x35\xC0\x80" és el primer argument de la línia d'ordres.

Aquest codi pren un argument de la línia d'ordres i el copia a una variable de pila local c. Això funciona bé per a arguments de línia d'ordres de menys de 12 caràcters (com es pot veure a la figura B següent). Qualsevol argument de més d'11 caràcters provocarà la corrupció de la pila. (El nombre màxim de caràcters segur és un menys que la mida de la memòria intermèdia aquí perquè en el llenguatge de programació C, les cadenes s'acaben amb un caràcter de byte nul. Per tant, una entrada de dotze caràcters requereix tretze bytes per emmagatzemar, l'entrada seguida pel byte zero del sentinella. Aleshores, el byte zero acaba sobreescriure una ubicació de memòria que està un byte més enllà del final de la memòria intermèdia).

A la figura C anterior, quan es proporciona un argument més gran que 11 bytes a la línia d'ordres foo() sobreescriu les dades de la pila local, el punter de fotograma desat i, el més important, l'adreça de retorn. Quan foo() torna, treu l'adreça de retorn de la pila i salta a aquesta adreça (és a dir, comença a executar instruccions des d'aquesta adreça). Així, l'atacant ha sobreescrit l'adreça de retorn amb un punter al buffer de pila char c[12], que ara conté dades subministrades per l'atacant. En un desbordament de memòria intermèdia de pila real, l'explotació de la cadena de "A" seria un codi d'intèrpret adequat per a la plataforma i la funció desitjada. Si aquest programa tenia privilegis especials (per exemple, el bit SUID configurat per executar-se com a superusuari), l'atacant podria utilitzar aquesta vulnerabilitat per obtenir privilegis de superusuari a la màquina afectada.[6]

Esquemes de protecció

modifica

Al llarg dels anys, s'han desenvolupat una sèrie d'esquemes d'integritat de flux de control per inhibir l'explotació maliciosa del desbordament de la memòria intermèdia de la pila. Normalment es poden classificar en tres categories:

  • Detecteu que s'ha produït un desbordament de memòria intermèdia de pila i, per tant, eviteu la redirecció del punter d'instruccions a codi maliciós.
  • Eviteu l'execució de codi maliciós de la pila sense detectar directament el desbordament de la memòria intermèdia de la pila.
  • Aleatoritzeu l'espai de memòria de manera que trobar codi executable esdevingui poc fiable.

Referències

modifica
  1. 1,0 1,1 Fithen, William L. «VT-MB. Violation of Memory Bounds» (en anglès). US CERT, 27-03-2007.
  2. Dowd, Mark. The Art Of Software Security Assessment (en anglès). Addison Wesley, November 2006, p. 169–196. ISBN 0-321-44442-6. 
  3. Levy, Elias Phrack, 7, 49, 08-11-1996, pàg. 14.
  4. Pincus, J.; Baker, B. IEEE Security and Privacy Magazine, 2, 4, 7-2004, pàg. 20–27. DOI: 10.1109/MSP.2004.36.
  5. Levy, Elias Phrack, 7, 49, 08-11-1996, pàg. 14.
  6. Levy, Elias Phrack, 7, 49, 08-11-1996, pàg. 14.