Um estouro de buffer ocorre quando um programa gravando dados em um buffer sobrecarrega a capacidade desse buffer. É como colocar 1 litro de de leite em um recipiente de 500 ml.
Após ler este artigo, você será capaz de:
Conteúdo relacionado
Segurança de aplicativos web?
Raspagem de dados
Cross-Site Request Forgery
Ataque de força bruta
Por que usar HTTPS?
Assine o theNET, uma recapitulação mensal feita pela Cloudflare dos insights mais populares da internet.
Copiar o link do artigo
O estouro de buffer é uma anomalia que ocorre quando o software gravando dados em um buffer estoura a capacidade do buffer, resultando na substituição de locais de memória adjacentes. Em outras palavras, muita informação está sendo passada para um container que não tem espaço suficiente e essa informação acaba substituindo os dados em containers adjacentes.
Os estouros de buffer podem ser explorados por invasores com o objetivo de modificar a memória de um computador para prejudicar ou assumir o controle da execução do programa.
Um buffer, ou buffer de dados, é uma área de armazenamento de memória física usada para armazenar dados temporariamente enquanto está sendo movida de um lugar para outro. Estes buffers normalmente vivem na memória RAM. Os computadores geralmente usam buffers para ajudar a melhorar a performance; a maioria dos discos rígidos modernos aproveitam o buffer para acessar dados de forma eficiente e muitos serviços on-line também usam buffers. Por exemplo, os buffers são geralmente utilizados em streaming de vídeos on-line para evitar a interrupção. Quando um vídeo é transmitido, o reprodutor de vídeo baixa e armazena, talvez, 20% do vídeo de cada vez em um buffer e depois transmite a partir desse buffer. Desta forma, pequenas quedas na velocidade da conexão ou interrupções rápidas de serviço não afetarão a performance do streaming de vídeo.
Os buffers são projetados para conter quantidades específicas de dados. A menos que o programa que utiliza o buffer tenha instruções incorporadas para descartar o excesso de dados enviados para o buffer, o programa substituirá os dados na memória adjacente ao buffer.
Estouros de buffer podem ser explorados por invasores para corromper software. Apesar de bem compreendidos, os ataques de estouro de buffer ainda são um grande problema de segurança que atormenta as equipes de segurança cibernética. Em 2014, uma ameaça conhecida como "heartbleed" expôs centenas de milhões de usuários a ataques devido a uma vulnerabilidade de estouro de buffer em software de SSL.
Um invasor pode alimentar deliberadamente uma entrada cuidadosamente elaborada em um programa que fará com que o programa tente armazenar essa entrada em um buffer que não seja grande o suficiente, substituindo porções de memória conectadas ao espaço do buffer. Se o layout de memória do programa for bem definido, o invasor poderá sobrescrever deliberadamente áreas conhecidas por conterem código executável. O invasor pode então substituir esse código por seu próprio código executável, o que pode alterar drasticamente a forma como o programa foi projetado para funcionar.
Por exemplo, se a parte sobrescrita na memória contiver um ponteiro (um objeto que aponta para outro local na memória), o código do invasor pode substituir esse código por outro ponteiro que aponta para uma carga de exploração. Isso pode transferir o controle de todo o programa para o código do invasor.
Certas linguagens de codificação são mais suscetíveis a estouro de buffer do que outras. C e C++ são duas linguagens populares com alta vulnerabilidade, pois não contêm proteções internas contra acesso ou substituição de dados em sua memória. Windows, Mac OSX e Linux contêm código escrito em uma ou ambas as linguagens.
Linguagens mais modernas como Java, PERL e C# têm recursos integrados que ajudam a reduzir as chances de estouro de buffer, mas não podem evitá-lo completamente.
Felizmente, os sistemas operacionais modernos têm proteções de tempo de execução que ajudam a mitigar os ataques de estouro de buffer. Vamos explorar duas proteções comuns que ajudam a mitigar o risco de exploração:
Os desenvolvedores de software também podem tomar precauções contra vulnerabilidades de estouro de buffer escrevendo em linguagens que tenham proteções internas ou usando procedimentos de segurança especiais em seu código.
Apesar das precauções, novas vulnerabilidades de estouro de buffer continuam a ser descobertas pelos desenvolvedores, às vezes após uma exploração bem-sucedida. Quando novas vulnerabilidades são descobertas, os engenheiros precisam corrigir o software afetado e garantir que os usuários do software tenham acesso ao patch.
Existem vários ataques de estouro de buffer que empregam estratégias diferentes e visam diferentes partes de código. Abaixo estão alguns dos mais conhecidos.
*Os computadores contam com dois modelos de alocação de memória diferentes, conhecidos como pilha e heap; ambos vivem na RAM do computador. A pilha é bem organizada e contém dados em um modelo Last-In, First-Out. Qualquer que seja o dado que foi colocado mais recentemente na pilha será o primeiro a sair, mais ou menos como a última bala inserida em um pente de munição será a primeira a ser disparada. O heap é um conjunto desorganizado de memória extra, os dados não entram ou saem do heap em nenhuma ordem específica. Como acessar a memória a partir da pilha é muito mais rápido do que acessar a partir do heap, o heap geralmente é reservado para dados maiores ou dados que um programador deseja gerenciar explicitamente.