Introdução ao estouro de buffer

O estouro de buffer também é conhecido como saturação de buffer, é um estado do computador em que um aplicativo tenta armazenar mais dados na memória buffer do que o tamanho da memória. Isso faz com que os dados sejam armazenados no armazenamento adjacente, que às vezes substitui os dados existentes, causando perda potencial de dados e, às vezes, travamento do sistema. É um erro de programação comum que a maioria dos desenvolvedores comete sem saber. Isso costuma ser explorado por hackers para obter acesso a dados não solicitados.

O que é memória buffer?

Excelente pergunta. Uma memória buffer, ou buffer, é simplesmente uma parte seqüencial da RAM reservada para armazenar dados temporariamente enquanto estão sendo transferidos de um local para outro - o local geralmente sendo um dispositivo de entrada ou saída. Isso é feito para compensar a diferença nas velocidades nas quais os dispositivos operam.

Por exemplo, quando você fornece alguns documentos para impressão, o seu processador i7 mais recente é rápido o suficiente para executar o comando de impressão em nanossegundos, enquanto a impressora antiga e pobre não está equipada com esse processador rápido. Portanto, os documentos são mantidos na memória buffer e passados ​​para a impressora na velocidade que a impressora aceita. Isso libera a RAM da sua CPU para outras tarefas.

Ataque de estouro de buffer

Agora que uma vulnerabilidade foi identificada com os computadores, os hackers devem explorá-la e tentar atacar vários sistemas através de ataques de buffer overflow. Agora surge a pergunta: como um hacker executa esse ataque e quais são as consequências?

Em um ataque de estouro de buffer, os dados extras incluem instruções destinadas a acionar atividades prejudiciais, como corrupção de arquivos, alteração de dados, envio de informações privadas pela Internet etc. insira e injete dados excedentes no buffer.

O ataque de estouro de buffer pode ser classificado principalmente em dois tipos

  • Baseado em pilha : quando o ataque ocorre na alocação de memória baseada em pilha. Isso é mais simples de explorar e, portanto, mais propenso a ataques.
  • Baseado em heap : quando o ataque ocorre na alocação de memória baseada em heap. Isso não é tão fácil de explorar e, portanto, é muito menos frequente.

Os idiomas mais vulneráveis ​​a ataques de estouro de buffer são C, C ++, Fortran e Assembly, pois usam técnicas de alocação de memória baseada em pilha.

A cura

Uma vez que os dados estão corrompidos, simplesmente não há cura para restaurar os dados originais. Além disso, a intensidade do ataque determina em grande parte a cura. Se o ataque é escasso e afeta apenas uma parte da memória de uma máquina isolada, um formato simples do sistema pode ser a solução. Visto que, se o ataque for generalizado e comprometer os dados em várias máquinas, a formatação de toda a rede não ajudaria, a menos que o programa que injeta o código malicioso seja corrigido.

Prevenção é melhor que a cura

Como desenvolvedores, é nossa responsabilidade verificar se há estouros de buffer em nosso código. Se os estouros de buffer forem tratados no próprio código, a segurança do sistema não será prejudicada por ataques de estouro de buffer.

A seguir, algumas etapas simples de precaução podem ajudar a evitar estouros de buffer.

  • O tratamento de exceções deve ser aproveitado para detectar estouros de buffer e impedir a execução de código no evento.
  • Aloque tamanho grande o suficiente para armazenar em buffer, para que grandes volumes de dados não pretendidos sejam tratados de maneira adequada.
  • Evite usar funções de biblioteca ou métodos de terceiros que não sejam verificados por limites para estouros de buffer. Exemplos comuns de tais funções a serem evitadas são gets (), scanf (), strcpy (). Estes são principalmente na linguagem C / C ++.
  • O teste de código deve levar em conta essas vulnerabilidades e testar rigorosamente o código e corrigir bugs que podem levar ao estouro.
  • Linguagens de programação modernas, sistemas operacionais e compiladores de código evoluíram para interromper a execução de comandos no caso de um estouro de buffer. Essa se tornou a maneira mais confiável de detectar automaticamente estouros de buffer.

Tente você mesmo…

Entendeu muito sobre o Buffer Overflow e o Buffer Attacks, por que não tentar codificar algo malicioso?

Isenção de responsabilidade - O programa a seguir é apenas para fins ilustrativos e não deve ser usado para causar danos de qualquer espécie. Qualquer semelhança com código malicioso é apenas coincidência. Além disso, os sistemas operacionais hoje em dia são inteligentes o suficiente para ter verificações preventivas contra ataques de buffer.

Abaixo está o programa C que pode causar uma potencial saturação de buffer. Por que a escolha do idioma C? Isso ocorre porque as linguagens de programação mais avançadas foram desenvolvidas para lidar com saturações de buffer apenas durante o tempo de compilação. Embora hoje em dia os compiladores de C também tenham certas verificações para evitar detectar o estouro de buffer. Portanto, você só verá uma mensagem de erro indicando que uma saturação de buffer foi detectada.

#include
#include
#include
int main(int argc, char *argv())
(
char mybuffer(8);
// copy the user input to mybuffer, without any bound checking
printf("Storing user input to mybuffer…\n");
strcpy(mybuffer, argv(1));
printf("mybuffer content= %s\n", mybuffer);
return 0;
)

O que aconteceu quando 123456789 foi fornecido como argumento de linha de comando para o programa? O programa gerou um erro que é lançado quando o compilador detecta o estouro de buffer. Atualmente, os compiladores e sistemas operacionais possuem uma camada de proteção adicional. Essa camada não é nada, mas variáveis ​​chamadas Canárias, que são iniciadas com certos valores no momento da compilação. Essas variáveis ​​são então armazenadas em unidades de memória adjacentes ao buffer. Assim, sempre que o buffer transborda, os dados extras fluem para a memória adjacente e corrompem o valor das Canárias. Assim que qualquer canário corrompido for detectado, o sistema interrompe a execução.

Outro exemplo na linguagem C ++:

#include
using namespace std;
int main()
(
char buf(8);
cin>>buf;
return 0;
)

Entrada - 123456789

Saída -

Conclusão - Estouro de Buffer

Portanto, agora tenho certeza de que você entenderia a importância do tratamento de buffer em seu programa. Inclua essa prática para verificar os limites do buffer durante a gravação e testar seu código. Isso ajudará você a escrever um código seguro.

Artigos recomendados

Este foi um guia para o que é o estouro de buffer. Aqui discutimos a definição, prevenção, memória, ataque no estouro de buffer. Você também pode consultar nossos outros artigos sugeridos para saber mais -

  1. O que é JavaScript?
  2. O que é o Django?
  3. O que é o SQL Developer?
  4. O que é o Azure?