Os hackers podem assumir o controle de um sistema maximizando a capacidade de armazenamento de um serviço. Então, como os hackers realizam esses ataques de estouro de buffer?
Como os hackers atacam sistemas usando vírus e malware? Às vezes, pode ser ransomware; às vezes, pode ser um ataque que consome os requisitos do sistema. O estouro de buffer é um desses métodos de ataque, mas o que realmente é? Como funcionam esses ataques?
O que é estouro de buffer?
Então, o que realmente são um buffer e uma pilha? O buffer é um campo onde algumas informações de entrada que você fornece ao computador aguardam antes de chegarem à memória. Recuperar dados da memória é uma operação que cansa o sistema. Então, quando houver espaço suficiente na área do buffer, você chama os dados diretamente daqui. Isso significa um aumento de desempenho para o seu dispositivo. Obviamente, quando o espaço disponível para o buffer estiver cheio, torna-se necessário gravá-lo na memória.
A pilha é essencialmente uma estrutura de dados na qual ocorrem as operações de push (adicionar) e pop (remover) de dados. Os conceitos de buffer e pilha são bastante semelhantes; no entanto, o buffer funciona como uma pilha que armazena temporariamente os dados recebidos.
Estouros de buffer podem ser um tópico desafiador, mas, como o nome sugere, ocorrem quando há uma sobrecarga de dados. Por exemplo, você deseja fazer login em um sistema. Os desenvolvedores podem alocar 250 bytes de espaço para o nome de usuário. Se você inserir 300 bytes de dados, o buffer transborda. Esse estouro pode afetar outros dados na memória, causando danos.
Isso é ótimo para hackers. Os cibercriminosos podem combinar essa confusão com diferentes vetores de ataque, por exemplo, para invadir o sistema e fazer login como administrador.
Para entender o estouro de buffer, os principais tópicos que você precisa reconhecer serão o Arquitetura interna da CPU, registros de memória e como a memória processa os dados. Aqui estão alguns termos sobre a CPU que você precisa conhecer.
Código de montagem |
Uma linguagem de programação de baixo nível, ou seja, próximo à linguagem de máquina. |
Amortecedor |
Um tamanho fixo espaço de memória alocado. |
código de bytes |
Uma forma de código de linguagem intermediária compilável escrita em uma linguagem de alto nível. |
Compilador |
Um programa que converte linguagem de programação em código de máquina. |
pilha |
Espaço de memória dinâmico e variável. |
Os fundamentos da teoria da memória
Sem entender a teoria da memória, pode ser difícil lidar com problemas de estouro de buffer na prática. Você pode pensar nisso como tentar construir uma casa sem saber fazer uma parede.
Imagine que você deseja executar um estouro de buffer do ponto de vista de um hacker. Para isso, você precisa manipular a memória e fazer com que a CPU execute seu código. Se você fosse alguém com intenção maliciosa, seu objetivo aqui seria sobrecarregar a memória e manipular áreas de memória contíguas também.
Mas, antes de tudo, você precisa se concentrar nos conceitos de heap, pilha e segmento de texto.
Enquanto a pilha está sendo criada, a memória usa muitos endereços de memória. Endereços de memória alta significam a área de memória estendida. Em seguida, os valores de endereço começam a diminuir. A pilha de memória usa um método chamado LIFO (Last In, First Out) durante o uso da memória. As variáveis na memória da pilha são válidas apenas dentro do escopo em que são definidas. Se estiverem fora desse escopo, ocorrerá um erro.
A memória de pilha, por outro lado, funciona dinamicamente e não precisa começar em endereços altos. Não há limite definido na memória heap; todos os limites são definidos pelo sistema operacional. É possível alterar a memória do heap dinamicamente e esses limites podem alterar de acordo com as necessidades do usuário durante o uso do heap. Os limites da memória heap dependem de fatores determinados pelo sistema operacional e hardware. Ou seja, oferece um uso dinâmico dentro desses limites.
O segmento de texto contém o código do programa e os segmentos de dados contêm dados globais. Compartilhamento de endereços altos pilha e memória heap entre eles. O sistema aloca ambas as memórias em tempo de execução.
Para entender melhor o estouro de buffer, você deve examinar os registradores de dados de uso geral que a arquitetura do seu computador usa para armazenar dados. Em vez de analisar cada registro individualmente, concentre-se no essencial.
- ESP (Extended Stack Pointer): Este registrador contém o endereço no topo da pilha.
- EBP (Ponteiro Base Estendido): Isso mantém o ponteiro base.
- EIP (Ponteiro de Instrução Estendido): E este registrador contém o endereço da próxima instrução a ser executada.
Esses termos técnicos podem parecer um pouco confusos, mas imagine todos eles como pequenas partições na memória.
Como funcionam os ataques de estouro de buffer?
Quando você adiciona novos dados a qualquer pilha, esses dados serão inseridos no topo. Todos os novos dados são movidos para baixo. ESP está no topo da pilha. Portanto, neste caso, o ESP vai para um endereço de memória inferior. Imagine os dados adicionados acima empurrando o ESP para baixo.
Quando um programa inicia a execução, o sistema cria um quadro de pilha com variáveis locais. O principal objetivo de um ataque de estouro de buffer é obter acesso ao EIP ou endereço de retorno. Um hacker com acesso a esse endereço pode comandá-lo para apontar para qualquer código malicioso que desejar, o que afetará o sistema mais amplo.
Com cada novo bit de dados, a pilha cresce em direção ao EBP. A verdadeira questão aqui é, se inserirmos muitos dados, podemos empurrar o EBP para o EIP? Dessa forma, os dados ou códigos que você deseja estão localizados no EIP e você pode ver os resultados desejados. Tudo o que resta é executá-lo. Quando você executa o programa, ele aponta para o seu código EIP e inicia a execução. Como resultado, se você for um hacker, terá executado seu primeiro ataque de estouro de buffer.
Para pegar o exemplo de um ângulo diferente, você pode considerar líquidos de diferentes densidades, chamados ESP, EBP e EIP, em um recipiente. Imagine que o ESP está localizado na parte superior do contêiner porque sua densidade é menor. Assim como o azeite e a água, eles não devem se misturar. O código malicioso, então, é outro líquido – quando você o adiciona ao contêiner, ele desordena esse equilíbrio, desloca um pouco do líquido e se mistura com o EIP. Isso indicará um estouro de buffer.
Como se proteger contra ataques de estouro de buffer
Então, como você impede que isso aconteça?
Em primeiro lugar, é importante adotar boas práticas de codificação em todo o processo de desenvolvimento de software para minimizar as vulnerabilidades de segurança. Código escrito com cuidado pode reduzir a probabilidade de estouros de buffer.
Outro passo é utilizar mecanismos de defesa que permitam monitorar regiões de memória, verificar limites de buffers e detectar ataques. Finalmente, você precisa atualizar regularmente os sistemas e aplicar patches. As atualizações que corrigem vulnerabilidades tornam mais difícil para os invasores explorar vulnerabilidades conhecidas. Além disso, o uso de ferramentas de defesa, como software e firewall, fornece uma camada adicional de segurança.
Tome medidas contra estouros de buffer
Os ataques de estouro de buffer representam uma ameaça significativa à sua segurança cibernética e tomar precauções contra eles é naturalmente importante. Felizmente, é possível bloquear esses ataques e fortalecer os mecanismos de defesa. Muitas boas práticas de segurança, como manter o software atualizado para corrigir patches, ajudam a proteger contra esses ataques, bem como outras vulnerabilidades.