Compartilhar via


Evitando estouros de buffer

Um estouro de buffer é uma das fontes mais comuns de risco de segurança. Uma sobrecarga de buffer é essencialmente causada pelo tratamento de entrada externa desmarcada como dados confiáveis. O ato de copiar esses dados, usando operações como CopyMemory, strcat, strcpy ou wcscpy, pode criar resultados imprevistos, o que permite a corrupção do sistema. Na melhor das hipóteses, seu aplicativo será anulado com um despejo de núcleo, uma falha de segmentação ou uma violação de acesso. Na pior das hipóteses, um invasor pode explorar o estouro do buffer introduzindo e executando outros códigos mal-intencionados em seu processo. Copiar dados desmarcados e de entrada em um buffer baseado em pilha é a causa mais comum de falhas exploráveis.

Os estouros de buffer podem ocorrer de várias maneiras. A lista a seguir fornece uma breve introdução a alguns tipos de situações de estouro de buffer e oferece algumas ideias e recursos para ajudá-lo a evitar a criação de novos riscos e atenuar os existentes:

Estouros de buffer estático

Uma sobrecarga de buffer estático ocorre quando um buffer, que foi declarado na pilha, é gravado com mais dados do que foi alocado para manter. As versões menos aparentes desse erro ocorrem quando dados de entrada de usuário não verificados são copiados diretamente para uma variável estática, causando possível corrupção de pilha.

Estouros de heap

Os estouros de heap, como estouros de buffer estático, podem levar à corrupção de memória e pilha. Como os estouros de heap ocorrem na memória do heap em vez de na pilha, algumas pessoas as consideram menos capazes de causar problemas graves; No entanto, as sobrecargas de heap exigem cuidados de programação reais e são tão capazes de permitir riscos do sistema quanto estouros de buffer estático.

Erros de indexação de matriz

Os erros de indexação de matriz também são uma fonte de estouros de memória. A verificação cuidadosa de limites e o gerenciamento de índice ajudarão a evitar esse tipo de estouro de memória.

Evitar estouros de buffer é principalmente sobre escrever um bom código. Sempre valide todas as suas entradas e falhe normalmente quando necessário. Para obter mais informações sobre como escrever código seguro, consulte os seguintes recursos:

  • Maguire, Steve [1993], escrevendo código sólido, ISBN 1-55615-551-4, Microsoft Press, Redmond, Washington.
  • Howard, Michael e LeBlanc, David [2003], escrevendo código seguro, 2d ed., ISBN 0-7356-1722-8, Microsoft Press, Redmond, Washington.

Observação

Esses recursos podem não estar disponíveis em alguns idiomas e países.

 

O tratamento de cadeia de caracteres segura é um problema de longa data que continua a ser resolvido seguindo boas práticas de programação e, muitas vezes, usando e adaptando sistemas existentes com funções seguras de manipulação de cadeias de caracteres. Um exemplo desse conjunto de funções para o shell do Windows começa com StringCbCat.