Transbordamento de dados: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
Removendo afluente eliminado
m Correção de um "um" para um "ou". Substituição da palavra checagem e outras semelhantes pela palavra verificação e respetivas conjugações verbais.
Linha 4:
Estouros de ''buffer'' podem ser disparados por entradas que são projetadas para executar código, ou alterar o modo como o programa funciona. Isso pode resultar em comportamento errado do programa, incluindo erros de acesso à memória, resultados incorretos, parada total do sistema, ou uma brecha num sistema de segurança. Portanto, eles são a base de muitas vulnerabilidade de ''software'' e pode ser explorados maliciosamente.
 
[[Linguagem de programação|Linguagens de programação]] comumente associadas com transbordamentos de dados incluem [[C (linguagem de programação)|C]] e [[C++]], as quais não proveem proteção contra acesso ou sobrescrita de dados em qualquer parte da memória e não checamverificam automaticamente se dados escritos em um ''[[array]]'' (cadeia de elementos – o tipo de ''buffer'' dessas linguagens) estão nos limites do ''array''. ChecagemVerificação de limites pode prevenir transbordamentos de dados.
 
== Descrição técnica ==
Um estouro de ''buffer'' ocorre quando dados escritos em um ''buffer'', devido a checagemverificação de limites insuficiente, corrompe valores de dados no endereço de memória adjacente ao ''buffer'' alocado. Isso ocorre mais comumente quando se copiam ''[[string]]s'' (cadeias de caracteres) de um ''buffer'' para outro.
=== Exemplo básico ===
No exemplo a seguir, um programa define dois itens de dados que são adjacentes na memória: um ''buffer'' de ''strings'' A de tamanho de 8 ''bytes'', e um inteiro B de tamanho de 2 bytes. Inicialmente, A não contém nada além de ''bytes'' zero, e B contém o número 1 979. O tamanho dos caracteres é 1 ''byte''.
Linha 70:
 
=== Escolha de linguagem de programação ===
A escolha da linguagem de programação pode ter um efeito profundo na ocorrência de estouros de buffer. Como em 2008, entre as linguagens mais populares estão C e sua derivativa C++, com uma ampla gama de ''softwares'' sendo escritos nessas linguagens. C e C++ não proveem proteção embutida contra acesso indevido ou sobrescrita de qualquer parte da memória. Mais especificadamente, elas não checamverificam se um dado escrito em um ''buffer'' está nos limites do ''buffer''. Entretanto, as bibliotecas de C++ padrão proveem muitas maneiras de copiar dados para um ''buffer'' de forma segura, e técnicas para evitar estouros de ''buffer'' também existem em C.
 
Muitas outras linguagens de programação proveem checagemverificação em tempo de execução e em alguns casos até checagensverificações em tempo de compilação, que enviam um alerta umou lançam uma exceção quando C ou C++ iriam sobrescrever os dados e continuar a executar instruções até que resultados errados fossem obtidos, os quais poderiam ou não fazer o programa parar. Exemplos de tais linguagens incluem [[Ada (linguagem de programação)|Ada]], [[Eiffel (linguagem de programação)|Eiffel]], [[Lisp]], [[Modula-2]], [[Smalltalk]], [[Objective Caml]] e derivadas de C como Cyclone e [[D (linguagem de programação)|D]]. Os ambientes de bytecodes de Java e do .Net Framework também requerem checagemverificação de limites em todos os arrays. Quase todas as linguagens interpretadas irão proteger contra estouros de buffer, sinalizando uma condição de erro bem definida.
 
Na maioria das vezes, quando uma linguagem proveem informação de tipos suficiente para se fazer checagemverificação de limites de ''arrays'', é dada a opção de habilitar ou desabilitar a checagemverificação. Análise estática de código pode remover muitas checagensverificações de limites e tipos dinâmicas, mas implementações pobres e casos estranhos podem diminuir significativamente o desempenho. Engenheiros de ''software'' devem considerar cuidadosamente os ganhos e perdas de segurança versus custos de desempenho ao decidirem qual linguagem e configuração de compilador utilizar.
 
=== Uso de bibliotecas seguras ===
O problema de estouro de ''buffer'' é comum em C e C++ porque elas expõem detalhes de baixo nível de implementação dos ''buffers'' como conteúdos e tipos de dados. Estouros de ''buffer'' devem ser evitados para se manter um alto nível de correção no código que executa o gerenciamento de buffer. Também é recomendado há muito tempo que se evitem as funções de bibliotecas padrão que não fazem checagemverificação de limites, como gets, scanf e strcpy. O ''[[worm]]'' de Morris explorou uma chamada de gets no fingerd.
 
Bibliotecas de tipos de dados abstratos bem escritas e testadas que centralizam e checamverificam automaticamente o gerenciamento de ''buffer'', incluindo checar os limites, podem reduzir a ocorrência e impacto de estouros de ''buffer''. Os dois principais tipos de dados básicos nessas linguagens nos quais estouros de ''buffer'' geralmente ocorrem são strings e arrays. Então, bibliotecas que previnem estouro de ''buffer'' nesses tipos podem prover a grande maioria da segurança necessária. Ainda assim, falhas em se usar bibliotecas seguras podem resultar em estouros de ''buffer'' e outras vulnerabilidades, e naturalmente, qualquer erro na própria biblioteca é uma vulnerabilidade em potencial. Implementações "seguras" de bibliotecas incluem ''The Better String Library'', Vstr e Erwin. A biblioteca C do sistema operacional OpenBSD provê as funções strlcpy e strlcat, mas elas são mais limitadas que a implementação completa da biblioteca segura.
 
== História ==