Buffer Overflows: o que é e como evitar essa vulnerabilidade

O Buffer Overflow é uma vulnerabilidade resultante da sobrecarga do espaço de memória de um sistema, que pode ser online ou um aparelho com Sistema Operacional.

A sobrecarga acontece quando o buffer é forçado para isso, sendo incapaz de aguentar uma carga maior do que a qual foi programado. 

Quando isso acontece, os dados que deveriam estar nesse espaço de memória são sobrescritos, o que pode causar graves falhas à segurança do sistema.

Para prevenir essa ameaça de invasão, é possível tomar medidas reativas e proativas, como o uso de um scanner de vulnerabilidade, como o Insider.

Neste artigo, apresentamos os principais riscos de um Buffer Overflow, como pode acontecer e melhores práticas para se proteger.

 

O que é Buffer Overflows?

O Buffer Overflow, ou “transbordamento de dados” em tradução livre, ocorre quando o uso da memória designada para uma função é excedida. 

Ao forçar, por exemplo, um campo de 8 bytes com o uso de 10 bytes, o espaço de memória designada é excedido e abre caminho para comandos maliciosos no código

Esse ataque pode ser direcionado a uma máquina, com códigos arbitrários que modificam o funcionamento do sistema ou para executar um ataque de negação de serviço (DDoS).

Atualmente, o ataque de tipo Buffer Overflow está no ranking da Common Weakness Enumeration (CWE™) como uma das 25 vulnerabilidades mais perigosas para softwares

 

Tipos de Buffer Overflows

Há diversas formas de explorar a vulnerabilidade do código com o transbordamento de dados, atingindo diferentes sistemas operacionais e linguagens de programação.

Porém, o objetivo comum entre as práticas é a subversão ou o controle do software atacado. 

O que diferencia cada ataque de Buffer Overflow é a localização do buffer na memória do sistema. Os mais comuns são os transbordamentos em pilha (stack) e os transbordamentos baseados em heap

  • Stack Overflow: é a categoria mais comum, que ataca o call stack de ação em um programa;
  • Heap Overflow: o objetivo deste tipo de transbordamento é comprometer a estrutura heap (ou árvore de propriedades);
  • Integer Overflow: neste caso, o ataque funciona de forma matemática, produzindo um número superior à capacidade de armazenamento do buffer; 
  • Unicode Overflow: dentre os tipos de transbordamento, é considerado o ataque mais “sofisticado”, utilizando caracteres unicode em um sistema que espera ASCII.

 

Como funciona a sobrecarga do buffer?

Ao exceder o espaço de memória do sistema, o Buffer Overflow pode comprometer a execução dos comandos do sistema, causando instabilidade ou corrompendo informações.

Os dados inseridos para o transbordamento sobrescrevem os comandos originais, com dados importantes para a execução do sistema.

Quando isso acontece, os dados originais são substituídos, causando instabilidade ou executando comandos arbitrários. 

Nos ataques de Buffer Overflow, os efeitos mais comuns são os de execução de códigos arbitrários e os de negação de serviço ou DoS (Denial of Service).

 

Execução de código arbitrária e escalação de privilégios

Ao executar o transbordamento de dados, uma das possibilidades de objetivo do ataque é a de execução de código arbitrário e a escalação de privilégios.

Nesses casos, a vulnerabilidade é usada para gravar comandos mal-intencionados no buffer, permitindo que o invasor controle determinadas ações do sistema. 

Dessa forma, o Buffer Overflow se torna um grave problema de segurança, podendo ser explorado por hackers para ter o controle remoto de um host ou realizar comandos de altos privilégios. 

Entre as possibilidades de acesso do invasor, estão o fornecimento de shell do sistema operacional com privilégios administrativos, podendo até mesmo adicionar um usuário administrador ao sistema.

Com o acesso administrativo, o invasor pode instalar e desinstalar recursos da máquina, além do acesso ilimitado aos dados presentes no sistema.

 

Negação de Serviço ou DoS (Denial of Service)

Porém, nem todas as vulnerabilidades do Buffer Overflow são usadas para obtenção de acesso e execução de códigos arbitrários. 

Outro ataque muito comum é o de negação de serviço ou DoS (Denial of Service), executado durante a interrupção da execução do código invadido. 

A diferença desse ataque é que, diferente da execução de códigos arbitrários, o DoS não se limita à invasão da máquina.

Ao executar o DoS, os invasores podem acessar roteadores, firewalls, dispositivos IoT e outros recursos com SO. É possível, inclusive, a invasão de redes domésticas.

O uso mais comum de DoS é mais “simples”, com objetivo de apenas travar o sistema por alguns minutos. 

Mas, no caso de alguns grandes servidores online, o tempo de inatividade pode resultar em prejuízos financeiros e desconfiança dos usuários.

 

Como evitar o Buffer Overflows?

O transbordamento do buffer pode acontecer em qualquer tipo de linguagem de programação ou sistema. Porém, alguns são mais propensos às vulnerabilidades do que outros. 

As linguagens de programação C e C ++, por exemplo, não possuem proteção contra acessos ou subscrição de dados na memória. Isso os tornam mais vulneráveis aos ataques de Buffer Overflow.

Já as linguagens mais modernas, como C #, Java e Perl, são menos propensas às brechas, com menos chances de erros de codificação e sobrecarga do buffer.

Todavia, é importante ressaltar, mais uma vez, que o transbordamento do buffer pode ocorrer em qualquer sistema que esteja vulnerável, com a possibilidade de manipulação da memória no código.

As falhas mais comuns nesses casos estão presentes no compilador do sistema, bibliotecas de tempo de execução ou até mesmo em recursos próprios da linguagem utilizada.

Para proteger o sistema de um Buffer Overflow, é possível agir de forma proativa e reativa.

 

Prevenção proativa e reativa de Buffer Overflow

A melhor, e mais efetiva, prevenção ao Buffer Overflow é fazer uma boa gestão de vulnerabilidade, ou seja, garantir que o código não possui brechas. 

Ao escrever um código que preveja essa vulnerabilidade, o código automaticamente impede que a sobrecarga aconteça. Algumas práticas que podem ajudar são as implementações de DEP, ASLR ou SEHOP.

O uso de proteção de ponteiros como ação reativa também pode trazer bons resultados para a segurança do código, evitando que invasores possam editar os comandos ou executar códigos no sistema.

E para garantir que esses comandos estão funcionando, sem deixar nenhuma abertura para os invasores, outras ações proativas podem ser tomadas.

Um bom exemplo é o uso de scanner de vulnerabilidade do código, que realiza a busca por diversas ameaças possíveis, não somente de Buffer Overflow. 

Com o scanner, é possível ter mais agilidade ao revisar o código. Dessa forma, atualizações e outras medidas protetivas podem ser executadas com mais praticidade e segurança. 

Os testes de segurança também são indispensáveis para encontrar dados que possam dar abertura para uma sobrecarga da memória.

Com o scanner de vulnerabilidade Insider é possível prever e corrigir brechas e bugs do código. 

São mais de nove linguagens de programação suportadas pelo sistema Insider, atendendo às aplicações web e mobile. Solicite já o seu teste gratuito e mantenha seus sistemas protegidos contra o Buffer Overflow e outras vulnerabilidades.

Receba novidades:







    Deixe um comentário

    O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *