Transbordamento de dados: diferenças entre revisões

m
Revertidas edições por 200.199.204.201 para a última versão por !Silent, de 17h12min de 23 de abril de 2012 (UTC)
m (Revertidas edições por 200.199.204.201 para a última versão por !Silent, de 17h12min de 23 de abril de 2012 (UTC))
{{Sem-fontes|data=abril de 2012| angola=| arte=| Brasil=| ciência=| geografia=| música=| Portugal=| sociedade=|1=|2=|3=|4=|5=|6=}}
Em segurança computacional e programação um transbordamento de dados ou estouro de [[Buffer (ciência da computação)|buffer]] (do inglês buffer overflow ou buffer overrun) é uma anomalia onde um programa, ao escrever dados em um buffer, ultrapassa oos limitelimites do buffer e sobrescreve a memória adjacente. Esse é um caso especial de violação de segurança de memória.
Estouros de buffer podem ser disparados por entradas que são projetadas para executar codigocó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.
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 checam automaticamente se dados escritos em um array (cadeia de elementos – o tipo de buffer dessas linguagens) estão nos limites do array.. Checagem de limites pode prevenir transbordamentos de dados.
 
== Descrição técnica.. ==
Um estouro de buffer ocorre quando dados escritos em um buffer, devido a checagem de limites insuficiente, corrompe valores de dados no endereço de memória adjacente ao buffer alocado. Isso ocorre mais comumente quando se copia strings (cadeias de caracteres) de um buffer para outro..
=== ExemplosExemplo básicosbásico ===
No exemplo a seguir um programa define dois itens de dados que são adjacentes na memória ucb: 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 contem o número 1979. O tamanho dos caracteres é 1 byte.
 
{| class="wikitable" style="width:30em; text-align:center;"
|}
 
Embora o programador não tenha intensão alguma de mudar B, o valor de B foi substituído pelo número formado por parte de uma cadeira de caracteres. Neste exemplo, em um sistema big-endian que usa ASCII, “e” seguido por um byte zero se tornam o número 25856. Se Be fosse a única outra variável definida pelo programa, escrever uma string ainda maior que ultrapassasse B poderia causar um erro como uma falha de segmentação, terminando o processo..
 
== Exploração ==
As técnicas para se explorar uma vulnerabilidade de estouro de buffer podem variar de acordo com a arquitetura, sistema operacional e região da memória.. Por exemplo, explorar um heap (usado para alocar memória dinamicamente) é muito diferente de explorar uma pilha de chamadas..
 
=== Exploração baseada em pilha ===
Um usuário malicioso e com habilidades técnicas pode explorar estouro de buffer em pilhas para manipular o programa de uma das seguintes maneiras::
* Sobrescrever uma variável local que está próxima do buffer na memória da pilha para mudar o comportamento do programa de modo a beneficiar o atacante..
* Sobrescrever o endereço de retorno da pilha. Uma vez que a função retorna, a execução irá continuar no endereço de retorno especificado pelo atacante, geralmente um buffer preenchido por entrada do usuário.
* Sobrescrever um ponteiro de função, ou tratador de exceção, que é posteriormente executado.