buffer overflow

termo

programaçãosegurançahacking

Escrever mais dados em um buffer do que ele comporta, de modo que o excesso cai na memória adjacente, que nunca deveria recebê-lo.

O mecanismo cabe em uma linha: um buffer de tamanho fixo, uma cópia sem verificação, e o que estivesse ao lado na memória é sobrescrito. Historicamente, o que ficava ao lado de um buffer na pilha era o endereço de retorno salvo, então uma entrada suficientemente longa podia redirecionar a execução no retorno da função, e foi isso que fez desta a classe de vulnerabilidade definidora dos anos 1990 e o motor do verme Morris e do Code Red. Todo o endurecimento moderno de processos é uma resposta a ela: canários de pilha para detectar a sobrescrita, NX/DEP para que dados sobrescritos não executem, ASLR para que o atacante não consiga prever endereços, e linguagens com verificação de limites ou seguras quanto à memória para que a escrita nem aconteça. É a CWE-787, ainda perto do topo do CWE Top 25 trinta anos depois.

Um estouro de buffer escreve além do fim da memória alocada, corrompendo o que estiver adiante. Na pilha isso frequentemente é o endereço de retorno salvo, e é por isso que a exploração clássica redireciona a execução para código fornecido pelo atacante.

Décadas de mitigação tornaram a versão clássica difícil, e não impossível: canários de pilha detectam a sobrescrita, memória não executável impede a carga de rodar onde foi escrita, e a aleatorização de endereços remove os alvos fixos. Cada uma foi respondida, respectivamente, por vazamento de canários, programação orientada a retorno e divulgação de informação, e é por isso que a resposta duradoura são linguagens seguras em memória, e não mais uma camada de defesa sobre uma insegura.

Também conhecido como: buffer overrun, stack smashing, CWE-787

Todos os verbetes do glossário