Você está na página 1de 0

Em segurana computacional e programao um transbordamento de dados ou

estouro de buffer (do ingls buffer overflow ou buffer overrun) uma anomalia
onde um programa, ao escrever dados em um buffer, ultrapassa os limites do
buffer e sobrescreve a memria adjacente. Esse um caso especial de violao
de segurana de memria. Estouros de buffer podem ser disparados por entradas
que so projetadas para executar cdigo, ou alterar o modo como o programa
funciona. Isso pode resultar em comportamento errado do programa, incluindo
erros de acesso memria, resultados incorretos, parada total do sistema, ou uma
brecha num sistema de segurana. Portanto, eles so a base de muitas
vulnerabilidade de software e pode ser explorados maliciosamente. Linguagens de
programao comumente associadas com transbordamentos de dados incluem C
e C++, as quais no proveem proteo contra acesso ou sobrescrita de dados em
qualquer parte da memria e no checam automaticamente se dados escritos em
um array (cadeia de elementos o tipo de buffer dessas linguagens) esto nos
limites do array. Checagem de limites pode prevenir transbordamentos de dados.
Um estouro de buffer ocorre quando dados escritos em um buffer, devido a checagem de
limites insuficiente, corrompe valores de dados no endereo de memria adjacente ao
buffer alocado. Isso ocorre mais comumente quando se copia strings (cadeias de
caracteres) de um buffer para outro.
Exemplo bsico
No exemplo a seguir um programa define dois itens de dados que so adjacentes na
memria: um buffer de strings A de tamanho de 8 bytes, e um inteiro B de tamanho de 2
bytes. Inicialmente A no contm nada alm de bytes zero, e B contem o nmero 1979. O
tamanho dos caracteres 1 byte.

variable name A B
value [null string] 1979
hex value 00 00 00 00 00 00 00 00 07 BB
variable name A B
value 'e' 'x' 'c' 'e' 's' 's' 'i' 'v' 25856
hex 65 78 63 65 73 73 69 76 65 00
Agora, o programa tenta guardar a string terminada em nulo excessive no buffer A. Ao
falhar em checar o comprimento da string, ele sobrescreve o valor de B.
Embora o programador no tenha inteno alguma de mudar B, o valor de B foi
substitudo pelo nmero formado por parte de uma cadeia de caracteres. Neste exemplo,
em um sistema big-endian que usa ASCII, e seguido por um byte zero se tornam o
nmero 25856. Se B fosse a nica outra varivel definida pelo programa, escrever uma
string ainda maior que ultrapassasse B poderia causar um erro como uma falha de
segmentao, terminando o processo.
Explorao
As tcnicas para se explorar uma vulnerabilidade de estouro de buffer podem
variar de acordo com a arquitetura, sistema operacional e regio da memria.
Por exemplo, explorar um heap (usado para alocar memria dinamicamente)
muito diferente de explorar uma pilha de chamadas.
Explorao baseada em pilha
Um usurio malicioso e com habilidades tcnicas pode explorar estouro de buffer
em pilhas para manipular o programa de uma das seguintes maneiras:
Sobrescrever uma varivel local que est prxima do buffer na memria da pilha
para mudar o comportamento do programa de modo a beneficiar o atacante.
Sobrescrever o endereo de retorno da pilha. Uma vez que a funo retorna, a
execuo ir continuar no endereo de retorno especificado pelo atacante,
geralmente um buffer preenchido por entrada do usurio.
Sobrescrever um ponteiro de funo, ou tratador de exceo, que
posteriormente executado.
Com um mtodo chamado trampolining, se um endereo de um dado fornecido pelo
usurio desconhecido, mas a sua localizao guardada em um registrador, ento o
endereo de retorno pode ser sobrescrito com um opcode que far a execuo saltar para
os dados fornecidos pelo usurio. Se a localizao guardada num registrador R, ento um
salto de execuo para a localizao contendo o opcode para um salto para R, chamada
para R ou uma instruo similar, causar a execuo de dados fornecidos pelo usurio. A
localizao de opcodes adequados, or bytes na memria, podem ser encontradas em DLLs
ou no prprio executvel. Entretnato, o endereamento de opcodes tipicamente no pode
conter nenhum caractere nulo e as localizaes desses opcodes podem mudar entre
aplicaes e verses do sistema operacional. O Projeto Metasploit um banco de dados de
opcodes, apesar de apenas os opcodes encontrados nos sistemas Windows estarem
listados. No se deve confundir estouro de buffer baseado em pilha com estouro de pilha.
Essas vulnerabilidade so descobertas geralmente com uso de um fuzzer. (Um fuzzer de
segurana uma ferramenta usada por pentesters (profissionais de teste de invaso),
analista de segurana e hackers, para testar parmetros de vrias aplicaes. Fuzzers
testam softwares em busca de buffer overflows, format string vulnerabilities e error handling.
Explorao baseada em heap
Um estouro de buffer que ocorre na rea de dados da heap chamado de
estouro de heap e explorado de forma diferente do estouro de buffer baseado
em pilha. A memria na heap alocada dinamicamente pela aplicao em tempo
de execuo e contem tipicamente dados do programa. A explorao se d
corrompendo-se esses dados de modos especficos para fazer a aplicao
sobrescrever estruturas internas como listas encadeadas e ponteiros. A tcnica
de estouro de heap cannica sobrescreve a linkagem de alocao de memria
dinmica (como o malloc) e usa a troca de ponteiro resultante para sobrescrever
um ponteiro de funo do programa. A vulnerabilidade do GDI+ da Microsoft em
tratar JPEGs um exemplo do perigo que um estouro de heap pode apresentar.
Barreiras explorao
Manipulao do buffer, que ocorre antes que ele seja lido ou executado, pode levar
falha de uma tentativa de explorao. Essas manipulaes podem mitigar a
ameaa de explorao, mas no pode faz-la se tornar impossvel. Manipulao
pode incluir converso de maiscula em minscula, remoo de caracteres
especiais e filtragem de strings no alfanumricas. Entretanto, existem tcnicas
para burlar esses filtros e manipulaes: cdigos alfanumricos, cdigos
polimrficos, cdigos auto-deslocveis, e ataques return-to-libc. Os mesmo
mtodos podem ser usado para evitar deteco em sistemas de deteco de
invaso. Em alguns casos, incluindo onde o cdigo convertido para Unicode, a
ameaa da vulnerabilidade tem sido erroneamente confundida pelos divulgadores
como apenas negao de servio, quando de fato a execuo remota de cdigo
arbitrrio possvel.
Aspectos prticos da explorao
Em exploraes do mundo real existe uma variedade de desafios que precisam
ser superados para as exploraes operarem de fato. Esses fatores incluem
bytes nulos em endereos, variao na localizao do shellcode, diferenas
entre ambientes e vrias contra-medidas em operao.
Medidas de proteo
Vrias tcnicas foram utilizadas para detector ou prevenir estouros de buffer,
com vantagens e desvantagens. O modo mais confivel de evitar ou prevenir
estouros de buffer usar proteo automtica a nvel de linguagem. Esse tipo de
proteo, entretanto, no pode ser aplicado a cdigos legados. As seguintes
sees descrevem as opes e implementaes disponveis.
Escolha de linguagem de programao
A escolha da linguagem de programao pode ter um efeito profundo na ocorrncia de
estouros de buffer. Como em 2008, entre as linguagens mais populares esto C e sua
derivativa C++, com uma ampla gama de softwares sendo escritos nessas linguagens. C
e C++ no proveem proteo embutida contra acesso indevido ou sobrescrita de
qualquer parte da memria. Mais especificadamente, elas no checam se um dado
escrito em um buffer est nos limites do buffer. Entretanto, as bibliotecas de C++ padro
proveem muitas maneiras de copiar dados para um buffer de forma segura, e tcnicas
para evitar estouros de buffer tambm existem em C. Muitas outras linguagens de
programao proveem checagem em tempo de execuo e em alguns casos at
checagens em tempo de compilao, que enviam um alerta um lanam uma exceo
quando C ou C++ iriam sobrescrever os dados e continuar a executar instrues at que
resultados errados fossem obtidos, os quais poderiam ou no fazer o programa parar.
Exemplos de tais linguagens incluem Ada, Eiffel, Lisp, Modula-2, Smalltalck, Objective
Caml e derivadas de C como Cyclone e D. Os ambientes de bytecodes de Java e do
.Net Framework tambm requerem checagem de limites em todos os arrays.
Quase todas as linguagens interpretadas iro proteger contra estouros de buffer,
sinalizando uma condio de erro bem definida. Na maioria das vezes, quando
uma linguagem prove informao de tipos suficiente para se fazer checagem de
limites de arrays, dada a opo de habilitar ou desabilitar a checagem. Anlise
de cdigo esttica pode remover muitas checagens de limites e tipos dinmicas,
mas implementaes pobres e casos estranhos podem diminuir significativamente
o desempenho. Engenheiros de software devem considerar cuidadosamente os
ganhos e perdas de segurana versus custos de desempenho ao decidirem qual
linguagem e configurao de compilador utilizar.

Uso de bibliotecas seguras
O problema de estou de buffer comum em C e C++ porque elas expem
detalhes de baixo nvel de implementao dos buffers como contedos e tipos de
dados. Estouros de buffer devem ser evitados para se manter um alto nvel de
corretude no cdigo que executa o gerenciamento de buffer.
Tambm recomendado h muito tempo que se evite as funes de bibliotecas
padro que no fazem checagem 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 checam
automaticamente o gerenciamento de buffer, incluindo checar os limites, podem
reduzir a ocorrncia e impacto de estouros de buffer. Os dois principais tipos de
dados bsicos nessas linguagens nos quais estouros de buffer geralmente
ocorrem so strings e arrays. Ento, bibliotecas que previnem estouro de buffer
nesses tipos podem prover a grande maioria da segurana necessria. Ainda
assim, falhas em se usar bibliotecas seguras podem resultar em estouros de
buffer e outras vulnerabilidades, e naturalmente, qualquer erro na prpria
biblioteca uma vulnerabilidade em potencial. Implementaes seguras de
bibliotecas incluem The Better String Library, Vstr e Erwin. A biblioteca C do
sistema operacional OpenBSD prove as funes strlcpy e strlcat, mas elas so
mais limitadas que a implementao completa da biblioteca segura.
Histria
Estouros de buffer foram entendido e parcialmente documentados publicamente
em 1972, quando o Computer Security Technology Planning Study divulgou a
tcnica: O cdigo que executa essa funo no checa os endereos de origem e
destino devidamente, permitido que pores do monitor sejam sobrepostas pelo
usurio. Isto pode ser usado para injetar cdigo no monitor que permitir ao
usurio tomar controle da mquina. (Pgina 61) Hoje, o monitor seria chamado
de kernel. A primeira explorao hostil documentada de um estouro de buffer foi
em 1988. Era uma de vrias exploraes usadas pelo worm criado por Morris para
se propagar pela internet. O programa explorado era um servio do Unix chamado
finger. Depois, em 1995, Thomas Lopatic redescobriu independentemente o
estouro de buffer e publicou suas descobertas na lista de mensagens de
segurana Bugtraq. Um ano depois, em 1996, Elias Levy (tambm conhecido
como Aleph One) publicou na revista Phrack o artigo Destruindo a Pilha por
Diverso e Lucro, uma introduo passo-a-passo para explorar vulnerabilidades
de estouro de buffer baseado em pilha.
Desde ento, no mnimo dois grandes worms de internet exploraram estouro de
buffer para comprometer um grande nmero de sistemas. Em 2001 o worm
Code Red explorou um estouro de buffer no Internet Information Services (ISS)
5.0 da Microsoft e em 2003 o worm SQL Slammer comprometeu mquinas
ruando o Microsoft SQL Server 2000. Em 2003 estouros de buffer presents em
jogos licenciados do Xbox foram explorados para permitir que softwares no-
licenciados, incluindo jogos caseiros, rodassem no console sem a necessidade
de modificaes de hardware, tambm conhecidas como modchips. O PS2
Indepentence Exploit tambm usou um estouro de buffer para fazer o mesmo
com o Playstation 2. O hack Twilight consegui o mesmo no Wii usando um
estouro de buffer no jogo The Lengend of Zelda: Twilight Princess.
BIBLIOGRAFIA
http://pt.wikipedia.org/wiki/Transbordamento_de_dados, acessado em 23/03/13

Você também pode gostar