Introdução
Nos dias de hoje, Buffer overflow vem se tornando cada vez mais raros, pois compiladores atuais possuem mecanismos de proteção de memória incluídos que dificultam a memória em ser corrompida ou de bugs acontecerem acidentalmente. Entretanto, em linguagens legadas, como C e C++, ainda possuem mecanismos de acesso direto a memória que podem ocasionar Buffer overflow.
Esses ataques não são limitados a arquivos binários. Isso também pode acontecer em aplicações web, especialmente em serviços embarcados que utilizam servidores web customizáveis.
Em resumo, um Buffer overflow é causado pela má administração de memória, onde programas não conseguem lidar com a grande quantidade de informação provida pela CPU e podem, consequentemente, manipular o processo da CPU. Suponha que muita informação é armazenada num buffer
ou num stack
que não é limitado. Nesse caso, registradores específicos seriam sobrescritos, o que pode permitir código malicioso ser executado.
Um Buffer overflow pode fazer que o serviço pare de responder, corrompa informações ou modifique estruturas de dados durante o tempo de execução de um serviço. O último deles, pode fazer com que o programa retorne endereços da memória de maneira arbitrária, permitindo que o atacante execute códigos com o privilégio do processo em execução.
Um alvo particular em sistemas Unix é o acesso ao root
, que tem todas as permissões do sistema. Entretanto, isso é frequentemente mal compreendido, pois isso não significa que um Buffer overflow que leva “apenas” para um nível de usuário não é perigoso. Se tornar root
já tendo um usuário em mãos é um corta caminho gigantesco.
A maior incidência de Buffer overflow são, principalmente, em linguagens que não monitoram automaticamente o limite de suas memórias de buffer
e stacks
para prevenir (CWE-121) Stack Overflow. Isso incluí linguagens como C e C++, que possuem foco principal de serem uma ótima performance e não possuem esses limitadores.
Por essa razão, desenvolvedores são forçados a definir esses conceitos durante a programação, o que aumenta significativamente o risco dessa vulnerabilidade. Essa preocupação é frequentemente deixada de lado por falta de cuidado e negligência.
Entretanto, nem todo ambiente de aplicação pode ter um Buffer overflow. Por exemplo, uma aplicação escrita somente em Java, muito provavelmente não vai ter nenhum tipo de Buffer overflow devido a maneira com que o Java lida com a memória. Java utiliza uma técnica chamada garbage collector que ajuda a prevenir Buffer overflow.