Como evitar ataques de estouro de buffer
Passo 1
Escreva o código de segurança para evitar ataques de estouro. Em C, há várias funções de vulnerabilidade que os hackers podem explorar para sobrecarregar os buffers. Minimize o uso de strcpy (), strcat (), sprintf () e vsprintf (), que não verifica limites. Se possível, evite usar gets (), que não especifica quantos caracteres devem ser lidos e, assim, deixar seu código vulnerável. Se você usar scanf (), especifique uma largura para o formato% s para evitar estouros.
Passo 2
Verifique se você pode usar trampolins para evitar o estouro de buffer. Como o estouro de buffer ocorre nas pilhas de memória e não no código, a solução mais simples parece ser impedir que as pilhas executem qualquer código inserindo um pequeno snippet de código para proibir essas ações. Isso é possível no Linux, mas é muito difícil. Apenas alguns compiladores usam os pequenos trechos de código chamados trampolins, que atuam como uma barreira entre o código de chamada da função e a própria função. Portanto, se o código malicioso tentar substituir um buffer, o trampolim pode interceptar e neutralizar as tentativas dos hackers.
Passo 3
Implemente ferramentas de compilação para fornecer avisos quando você usa um código que deixa você vulnerável a ataques. Algumas dessas ferramentas geram código que proíbe que pessoas de fora acessem endereços ilegais e desativem códigos que tentem tal execução. Produtos como o StackShield e o StackGuard são de grande ajuda. O StackSheild irá analisar o endereço de retorno de uma função e terminá-la no caso de uma irregularidade. O StackGuard coloca uma palavra Canary no endereço do remetente e verifica se a palavra foi alterada, encerrando uma função quando a tiver.
Passo 4
Instale ferramentas como libsafe para verificar a segurança em um ambiente dinâmico em tempo de execução. O Libsafe é executado no Linux e verifica o endereço de retorno mais próximo de um quadro de pilha, garantindo que o endereço não seja sobrescrito. O Libsafe também substituirá funções não seguras, como gets (), strcpy () e scanf ().