Igara - Sintegra
quinta-feira, 2 de setembro de 2010
Busca  
Porta 80 Web Hosting
 :: Acessibilidade
Ir para conteúdo principal: ALT + 1
 :: Participe
Seja um autor de CD/DVD de Treinamento
Publique um artigo
Publique uma oportunidade
Publique uma notícia
Publique um curso
Publique uma dica
Publique um código
 :: Informativo
Receba nossos informativos por e-mail.
E-mail:   
 
Digite a palavra abaixo:  
 
 
 :: Oportunidades
Cadastrar oportunidades
Gerenciar suas oportunidades
Cadastrar nova empresa
 :: Especiais
Básico de C++
C++ Builder
Curso ASP.NET 3.5 em VB.NET e C#
Guia Prático de HTML
Testes com Visual Studio Team System 2008
 :: Desenvolvimento
ActionScript
ADO.NET
ASP
ASP.NET
Automação Comercial
C#
C/C++
Coldfusion
CSS
Delphi
Disp. Móveis
HTML
Java
Javascript
LSL (Second Life)
Modelagem
PHP
Python
Sharepoint
Silverlight
SQL
VBA (Office)
Visual Basic
Visual Basic .NET
Visual Fox Pro
WCF/WPF
Web Services
XML
 :: Infra
BizTalk Server
CRM
Exchange Server
ForeFront / Antigen / IAG
Interoperabilidade
ISA Server
Linux
MOF
MS Dynamics CRM
Network
OCS / LCS
Outlook
Powershell e Scripts
Redes
Segurança
System Center e Gerenciamento
Virtualização
Windows
Windows Server
 :: Banco de Dados
Access
Caché
Firebird
Interbase
MySQL
Oracle
SQL Server
Sybase
 :: Gerência
Arquitetura
Ciclo de Vida de Desenvolvimento
Controle de Versão
Estimativas
Metodologias
MOF
Qualidade e Testes
 :: Design
Corel
Flash
Photopaint
Photoshop
 :: Livros
Análise Sistemas
Aplicativos
Banco de Dados
Certificação
Design e CAD
Gerência
Hardware
Internet
Programação
Programação Web
Rede
Segurança
Servidores
Sistemas Operacionais
 :: CDs/DVDs
Desenvolvimento
Infra
Design
 :: E-Books
.NET 2.0 (VS 2005)
.NET 1.1 (VS 2003)
SQL Server
Excel 2007
Excel 2003
Access 2003
ASP 3.0
Delphi
Java
Artigos
Detectando buffer over/underflows em C e C++ com ferramentas OpenSource
Por: Adenilson Cavalcanti da Silva
[Entre em contato com o autor ]
Adenilson (a.k.a. Savago) desenvolve sistemas há 10 anos, utilizando diversas linguagens de programação e sistemas operacionais. Tendo se especializado em C++, está sempre a procura de novos desafios com características multidisciplinares. Mestre pela USP, possui interesse especial por visão artificial, *nix, programação baixo nível.
Feed de artigos.
Feed de artigos deste autor.
Gere seu feed personalizado  

Detectando buffer over/underflows em C e C++ com ferramentas OpenSource
Publicado em: 27/01/2007

O problema

Quem programou em C ou C++ já esbarrou nesta categoria de erro: buffer overflows. Muito utilizados em ataques de seguranca, este tipo de erro acontece quando se acessa um ponto além (over) ou abaixo (under) do segmento de memória alocado para um dado buffer/vetor.

Este tipo de erro lógico pode ser ainda mais patológico se ocorre overflow por somente 1 a 3 bytes, pois o programa pode continuar executando normalmente sem sinais de problema. Acrescente a combinação de arquiteturas, compiladores, opções de otimização e o resultado é um erro difícil de ser descoberto.

Mas existe esperança, pois hoje existem ferramentas que auxiliam no processo de debugação e detecção deste tipo de erro (além de outros, como uso de ponteiros não inicializados, memory leaks, etc).

O teste

Recentemente eu buscava uma ferramenta/biblioteca que pudesse me ajudar a achar este tipo de erro. Então escrevi um pequeno programa para testar as condições:

  • Overflow 1 byte em leitura
  • Overflow 1 byte em escrita
  • Underflow 1 byte em leitura
  • Underflow 1 byte em escrita

O código de teste, resumido é algo como:

  void buff_reader(char *v, int size)
  {
  	char tmp;
  	for (int i = 0; i < size; ++i)
  		tmp = v[i];
  }
  void buff_writer(char *v, int size)
  {
  	for (int i = 0; i < size; ++i)
  		v[i] = 0;
  }
  
  void corruption(char *v, int size)
  {
  	/* Overflows reading/writing */
  	v++;
  	buff_reader(v, size);
  	buff_writer(v, size);
  
  	/* Underflows reading/writing */
  	--v;
  	--v;
  	buff_reader(v, size);
  	buff_writer(v, size);
  
  }

O programa principal chama a função corruption para testar o comportamento em memória alocada dinamicamente (heap) e também estática (stack).

Como são 4 condições de teste com 2 tipos de memória (estática e dinâmica) teremos um total de 8 testes no programa.

Antes dos flames, não estou dizendo que esta é a melhor maneira de testar o problema ou que este fragmento de código é perfeito. Somente queria algo simples para poder tirar minhas próprias conclusões sobre este problema bem definido de overflows. Críticas e sugestões são bem vindos desde que você tenha lido este parágrafo antes...

As ferramentas

O critério de seleção das ferramentas tinha alguns requisitos extras. Era necessário que a ferramenta fosse gratuíta ou tivesse uma licença livre, pois nem sempre o(s) projeto(s) tem a possibilidade de adquirir ferramentas pagas. A ferramenta deveria ser não intrusiva, dispensando modificações no código fonte para os testes. Finalmente, eu tinha interesse que a ferramenta fosse capaz de funcionar com C++, além de linguagem C.

Seguindo estes critérios, foram testadas 3 ferramentas contra este programa

  1. gcc stack smashing protector: implementado como patch no gcc 3.x, faz parte oficial do gcc 4.1. A técnica básica é modificar o stack de forma a incluir um valor especial (stack canary) junto aos buffers para monitorar overflows. A vantagem desta técnica é um overhead desprezível na execução dos aplicativos. Já se esperava um resultado ruim para memória alocada dinamicamente, uma vez que a ferramenta foi concebida somente para stack.

    Dependência: gcc
  1. DUMA (Detecting Unintended Memory Access): é um fork do electric fence de Bruce Perens, trata-se de um malloc/new e free/delete sobrecarregados. Exige a linkagem com a biblioteca e gera um overhead considerável para executar o aplicativo (portanto, somente válido para testes). Por trabalhar com memória dinâmica, não se esperava sucesso para detecção de falhas na memória estática (http://duma.sourceforge.net/).

    Dependência: libduma
  1. mudflap: pelo que li do artigo do autor desta extensão do gcc (http://gcc.fyxm.net/summit/2003/mudflap.pdf), ele analisa as estruturas (árvores) geradas pelo primeiro estágio de compilação do gcc à procura de padrões de operações com ponteiros potencialmente perigosas. Quando encontradas, insere expressões que retornem o mesmo valor, porém com referências a biblioteca libmudflap para detectar operações inválidas. Tem considerável impacto na execução, porém serviria para detectar falhas no heap e no stack.

    Dependência: libmudflap, gcc > 4.0

Portanto, para ser capaz de compilar o programa utilizando o makefile incluído, deve-se ter instaladas no sistema as dependências (duh!).

Antes que comentem, conheço o Valgrind e acho ele bem legal. Em fato, acredito que ele merece um artigo próprio, por isso não inclui ele aqui neste comparativo. Testei ele com o programa e com as opções default ele pegou 4/8 erros (os problemas com memória estática não foram detectados). Acredito que talvez ele tenha maiores opções para melhorar este índice e pretendo investigar melhor a questão no futuro. Se alguém souber o que poderia/deveria ser feito, fico no aguardo de sugestões.

Sobre a disponibilidade das ferramentas, a DUMA oferece versão para para os compiladores gcc (linux), devcpp (windows), Microsoft Visual C++ (6.0, .net, 2005). A 'stack smashing protector' está vinculado ao gcc 4.1, disponível nos *nix e com os primeiros 'ports' para windows (mas especificamente, relacionado ao mingw). A biblioteca mudflap não parece ter versão disponível para windows no presente momento.

Os resultados

Os resultados são apresentados da melhor performance para a pior.

Mudflap performance (8/8 tests)

memory overflow overflow underflow underflow
read write read write
static * * * *
dynamic * * * *

Comentários: o mudflap conseguiu pegar todos os erros no programa, resultado acima das minhas expectativas. O programa de teste gerado flap deve imprimir informações de violação de acesso à memória no terminal. Opções de compilação: -lmudflap -fmudflap.

DUMA performance (3/8 tests)

memory overflow overflow underflow underflow
read write read write
static ! ! ! !
dynamic * * ! *

Comentários: como esperado, DUMA somente funcionou para memória dinâmica. Porém no teste de underflow de leitura ele não apontou o erro (ver comentários extras nas conclusões). O arquivo de core gerado pode ser utilizado pelo gdb para gerar um backtrace onde se localiza precisamente o ponto onde ocorre violação de memória (dica: após compilar e rodar o programa de teste target duma, no terminal faça '$gdb duma core'). Opções de compilação: -lduma.

GCC (-fstack-protector-all) performance (0/8 tests)

memory overflow overflow underflow underflow
read write read write
static ! ! ! !
dynamic ! ! ! !

Comentários: esta opção de compilação falhou para apontar todas as falhas de acesso a memória estática com overflow de 1 byte, somente funcionando quando o overflow superava 3 bytes (programa gerado stacker. Esta é uma prova de como overflows/underflows por 1 byte podem aparecer em programas aparentemente corretos, sem qualquer sinal de erro. Opções de compilação: -fstack-protector-all.

Environment

Linux 2.6.17, g++ 4.1.2, mudflap 4.1.1, DUMA 2.4.27

Conclusão

Das alternativas testadas, a de melhor desempenho foi o mudflap, obtendo êxito para detectar falhas em todos os testes. Trata-se de um projeto novo e somente suporta versões mais recentes do gcc (este pode ser um fator negativo dependendo do projeto).

dica: pode-se obter uma lista de opções do mudflap ao se executar um programa linkado à libmudflap. Tente rodar "$MUDFLAP_OPTIONS=-help ./flap"

Entretanto, o mudflap possui alguns problemas, segundo a documentação, pode apresentar falhas em alguns códigos C++ muito complexos.

A DUMA obteve desempenho bom e o fato de não apontar o underflow de leitura pode ser considerado um feature, pois nem sempre é um erro no programa fazer um acesso de leitura em 1 posição abaixo do começo do buffer (e.g. no livro Numerical Recipes in C, para acesso a vetores/matrizes com base em índice 1 i.e. v[1], usa-se passar o endereço de memória 1 posição abaixo da memória alocada).

A opção de proteção de stack do gcc foi criada para ser leve e apontar falhas mais graves de acesso à memória, impedindo ataques por overflow. Por estes motivos, pode ser relevada sua baixa performance nos testes, porém é curioso saber que na implementação testada do gcc somente apareceram falhas usando-se overflows superiores a 3 bytes.

Acredito que o uso destas ferramentas pode aumentar sensivelmente a qualidade do software gerado, sendo uma técnica muito útil para desenvolvedores.

Código fonte







 

Inclua um comentário sobre o artigo Topo
Elogios e críticas são muito bem vindos, porém o comentário deve ter referência ao artigo em pauta.
O portal e o autor agradecem.
Nome:    
E-mail:      
Comentários:    
Digite a palavra abaixo:  
Para dúvidas técnicas, NÃO UTILIZE ESTE ESPAÇO, utilize nosso fórum de discussão.
http://linhadecodigo.com.br/cs2/forum
 
Comentários sobre o artigo Ver Todos comentários
Amigo, vc poderia me ajudar? posso declarar variáveis de vetor do tipo float? como? pois fiz um programa para calcular média, mas, não consigo entrar com notas do tipo 2.5, 5.5,... vc poderia me ajudar?
Quem enviou: Francinilso de Lima Barroso
Postado em: 05/02/2008 00:00:00
Outros artigos do autor Topo
Programação multithread em ambiente Unix: como criar e sincronizar 2 tarefas paralelas
O software livre e oportunidades
Estudo comparativo da velocidade dos programas gerados por 3 compiladores utilizando Open GL: C++ Builder vs. Visual C++ vs. Dev-C++
Programação multithread no Windows 32bits: como fazer 2 tarefas ao mesmo tempo
Usando o debugador do Visual C++ 6.0
Acesso multiplataforma a banco de dados com o C++ utilizando DTL (Database template library)
Artigos relacionados Topo
Reutilizando Código Nativo no .NET
Polimorfismo estático (C++)
Desenvolvedor Profissional. Será?
Sobrecarga de função às avessas
Proteção dos membros protected
Ponteiros de método: conceito fundamental
O que acontece quando o contador estoura
Como pegar o sizeof de um membro de um struct...
Classe do dia: HResult
Bugs difíceis de achar
Drag and drop no Cpp Builder - parte 6
Desenhando em Cpp Builder - parte 5
Gerenciamento de janelas em Cpp Builder - parte 4
Conceitos básicos na programação com Cpp Builder - parte 3
Interação entre controles no Cpp Builder - parte 2
Conhecendo o Cpp Builder - parte 1
Aquisição de recurso é inicialização
A inteligência do if
Instalando o Dev-C++ com MinGW e GDB atualizados
Por que aprender C/C++?
Básico de C++: Diretivas de pré-processador
C++ Tutorial: 5.4: Advanced Class Type-casting
Básico de C++: Tratamento de exceções
Básico de C++: Namespaces
Básico de C++: Templates
Compiladores: Revisão dos Princípios, Técnicas e Ferramentas
.Net Framework 2.0: Delegates
Básico de C++: Membros Virtuais. Abstração. Polimorfismo
Básico de C++: Relacionamentos entre classes: friend. Herança
Básico de C++: Sobrecarga de Operadores, this, Membros estáticos
Produtos relacionados Topo
Livro: ALGORITMOS O Guia Essencial
Livro: Programando em C - Volume I - Fundamentos - Inclui o padrão ISO C99
Livro: Redes Neurais - Fundamentos e Aplicações com Programas em C
Livro: Gerenciamento de Projetos Guia do Profissional Vol. 1: Abordagem Geral e Definição de Escopo
© Copyright 2001-2010 Codeline Editora, Comércio e Tecnologia Ltda. | Política de privacidade e de uso | Anuncie | Fale conosco

» Site hospedado na Porta 80 Web Hosting «
Nossos números
Dicas: 1.314
Códigos/scripts: 279
Funções de VBScript : 90
Funções JScript : 05
Livros: 1.805
Notícias: 2.623
Artigos: 3.020
Cases: 14
Oportunidades: 4.591
Vídeos .Net: 484
Publicidade

Conheça a loja do Linha de Código.

Microsoft indica Linha de Código.

Assine a Revista Mundo .NET
Portal de Vídeos .NET - os melhores vídeos .NET estão aqui
O que você fará com o Visual Studio 2010?
Revista Codificando .Net

Siga-nos no Twitter

Linha de Código no Orkut
Fórum de discussão do portal Linha de Código
Feeds
Oportunidades
Notícias
Artigos
Artigos personalizado
       (Por assunto)
Artigos personalizado
       (Por autor)
Portal Vídeos .NET
Portal Vídeos Delphi
LC Blog
       (Onde você faz a notícia)
Promoções
Promoção Wordpress + Tabless (válido somente para pagamento via boleto bancário)
Promoção Wordpress + Tabless (válido somente para pagamento via boleto bancário)
De: R$ 149,70
Por: R$ 99,80
Promoção PHP + MYSQL Intelimax (válido somente para pagamento via boleto bancário)
De: R$ 308,00
Por: R$ 219,00
Promoção Especial Infra
De: R$ 175,95
Por: R$ 136,00
Promoção: Portal de Vídeos .Net + CD Novidades das Linguagens (válido somente para pagamento via boleto bancário)
De: R$ 162,00
Por: R$ 89,00
Promoção VSTS (válido somente para pagamento via boleto bancário)
De: R$ 219,00
Por: R$ 146,00
CDs/DVDss
DVD Desenvolvimento de Games - Programando Jogos com o 3D Game Studio
DVD Desenvolvimento de Games - Programando Jogos com o 3D Game Studio
Por: R$ 59,00
DVD Curso de CorelDraw X4
Por: R$ 79,90
DVD Curso de Fireworks CS4
Por: R$ 49,90
DVD Curso de Indesign CS4
Por: R$ 55,00
DVD Curso de Efeitos Digitais
Por: R$ 49,90
Livros
MSProject 2007 - Metodologia e Critérios de Qualidade para o Gerenciamento de Projetos
MSProject 2007 - Metodologia e Critérios de Qualidade para o Gerenciamento de Projetos
De: R$ 129,00
Por: R$ 77,40
Foundation FLASH CS3 para Designers
Ciência Moderna
De: R$ 139,00
Por: R$ 83,40
ALGORITMOS O Guia Essencial
Alta Books
De: R$ 64,90
Por: R$ 58,40
Treinamento Prático em Dreamweaver
Digerati Books
Por: R$ 14,95
Estudo Dirigido de Adobe Photoshop CS4 em português - Para Windows
Erica
De: R$ 88,00
Por: R$ 74,80
E-Books
Manual Completo de Estudos MCSE 70-270 - Instalando, Configurando e Administrando o Windows XP (506 páginas) - Entrega via download
Manual Completo de Estudos MCSE 70-270 - Instalando, Configurando e Administrando o Windows XP (506 páginas) - Entrega via download
Por: R$ 30,00
Manual de Estudos - Exame 70-291 - Windows Server 2003 (606 páginas) - entrega via download
Por: R$ 30,00
Dominando MS – Visio ® em 20 Passos - Melhores Práticas em Gestão de Projetos (entrega via download)
Por: R$ 30,00
MS-Project® 2007 - Melhores Práticas de Gestão de Projetos - Dominando MS – Project ® em 20 Passos (e-book com entrega via download)
Por: R$ 20,00
Banco de dados com C# e Visual Studio .Net 2005 (entrega via download)
Por: R$ 20,00
Os 10+ | Autores do dia
Israel Aéce
Júlio Cesar Fabris Battisti
Anderson Patricio
Luiz Felipe de Freitas
Marcio Franco
Eric C M Oliveira
Robert Martim
Ramon Durães
Alessandro de Oliveira Faria
Alfred Reinold Baudisch
Os 10+ | Artigos do dia
HTML Básico
HTML Avançado
Criando aplicativos para o Orkut
PL/SQL - Procedures e Funções
Tutorial de Tabelas Dinâmicas no Excel – Parte 1
Como configurar Conexão Remota no SQL Server 2005
WCF – Gerenciamento de Instância
Básico de C++: Estrutura de um programa em C++
ASP.NET 2.0 - Explorando o GridView
Tutorial: Desenhando com o Corel Draw