Buffer Overrun Detection using Linear Programming and Static Analysis

Slides:



Advertisements
Apresentações semelhantes
(Buffer Overflow…) Tópicos de Engenharia de Computação B
Advertisements

AULA 02 PROGRAMAÇÃO LINEAR INTEIRA
Prof. M.Sc. Fábio Francisco da Costa Fontes Maio
Curso de aprofundamento na linguagem C
Programação em Java Prof. Maurício Braga
C/C++ para Sistemas Operacionais Professor: André Luis Meneses Silva /msn: Página:
Introdução à Ciência da Computação Linguagens de Programação.
Paulo Marques Hernâni Pedroso
Métodos para representação de estruturas hierárquicas
MPI – Comunicações Com. Colectiva esquecida Barrier não há troca de dados, apenas sincroniza os processos int MPI_Barrier( MPI_Comm, comm) T com = T lat.
Modelos Matemáticos utilizados na PO
TADS – Tipos Abstratos de Dados
Algoritmos e Programação Linguagens de Programação Teoria Aula (09/06)
PARTIÇÃO DE BENDERS Secundino Soares Filho Unicamp.
Componentes: A Abordagem Catalysis
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Medida do Tempo de Execução de um Programa
Medida do Tempo de Execução de um Programa
Recursividade Conceitos e Aplicações.
1 Professor Rogério B. de Andrade - Aula 001- Dez/2008 Técnicas e Linguagem de Programação.
7 Abstração Genérica Unidades genéricas e instanciação.
Linguagens de Programação
Segurança em Aplicações 5. Melhores Práticas de Programação
Classes e objetos Arrays e Sobrecarga
Especialização em Segurança da Informação Segurança em Aplicações 5. Melhores Práticas de Programação Márcio Aurélio Ribeiro Moreira
RUPinho Qualidade de Software
Tipos Agregados Homogêneos e Listas
Programação Orientada a Objetos com Java
Aula prática - análise contextual
IAED Tagus, 2009/2010 Introdução à Programação em C (I)
PROGRAMAÇÃO ESTRUTURADA II
INPE / CAP-315 Airam J. Preto, Celso L. Mendes Aula 27 (1) Programação com MPI Tópicos: Modelo de Programação Funções de Ambiente Funções Básicas.
© 2003 Introdução à programaçãoComputadores e programação I Linguagens de programação Introdução ao C (continuação)
Tipos Abstratos de Dados
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Tópicos em redes e sistemas distribuídos Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Rodrigo de Carvalho.  Introdução ◦ Descrição do Problema  Algoritmos ◦ GRASP ◦ S.A ◦ AG  Planejamento Experimental ◦ Objetivo ◦ Instância e métricas.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Introdução e Busca Cega
Estudo dos Conceitos e Paradigmas de Programação
Tipos Abstratos de Dados
Detalhes sobre o curso
Faculdade de Informática e Tecnologia de Pernambuco ESTRUTURA DE DADOS
Introdução à Programação Orientada a Objetos com Java Paulo Borba Centro de Informática Universidade Federal de Pernambuco Programação Imperativa (e Ponteiros.
13/07/2007 Saulo Andrade Pessoa Simulação de Iluminação Volumétrica Apresentação de Andamento Computação Gráfica.
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Estruturas de Dados Aula 11: TAD Pilha
Algoritmos - Profa. Alciléia1 Profa. Maria Alciléia Alves Rocha Funções em C 2011.
Regras de escopo Escopo: trecho de codificação no qual o identificador possui significado Escopo de função: identificador válido dentro do trecho de uma.
2002/2003 Programação Orientada para Objectos 1 Aula 2 Noção de lista e de iterador Operações com listas e iteradores Classes embutidas.
Linguagem de Programação II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Decorator POO - Avançado.
Algoritmos de Agrupamento (Clustering): Métodos Hierárquicos e k-médias Marcílio C. P. de Souto DIMAp/UFRN.
Utilizando UML e Padrões Prof. Fábio Botelho, MSc Redes e Sistemas Distribuídos Recife, Março de 2010.
13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Evolução de Software A Survey of Software Refactoring Reconstruction of Successful Software Evolution.
Removing Unnecessary Synchronization in Java Sérgio Soares Gente.
Teste de Software 14: Geração de teste baseado em modelos: MBT
Metaprogramação Estática André Knabben Pricilla Padaratz.
A Linguagem Formal de Especificação VDM-SL
Problemas NP-completos e Programação Dinâmica
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional)‏ Baseado na estrutura do programa (estrutural)‏ Baseado.
Buffer Overrun Detection using Linear and Static Analysis Rodrigo Diego Melo Amorim.
Fundamentos de Análise Estática
Computação Gráfica - Recorte
Copyright 2000, Departamento de Informática, UFPE. Todos os direitos reservados sob a legislação em vigor. Orientação a Objetos e Java.
Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra 2006/2007 Breve Introdução à Linguagem C.
Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional)‏ Baseado na estrutura do programa (estrutural)‏ Baseado.
Paulo Borba e Augusto Sampaio Departamento de Informática Universidade Federal de Pernambuco Especificação de Sistemas Distribuídos Parte 2.
Engenharia de Requisitos Prof. Fábio Botelho, MSc Redes e Sistemas Distribuídos Recife, Agosto de 2012.
Transcrição da apresentação:

Buffer Overrun Detection using Linear Programming and Static Analysis 10th ACM Conference on Computer and Communications Security. Washington, DC, October 2003. 10th ACM Conference on Computer and Communications Security. Washington, DC, October 2003. Vinod Ganapathy, Somesh Jha {vg,jha}@cs.wisc.edu University of Wisconsin-Madison Vinod Ganapathy, Somesh Jha {vg,jha}@cs.wisc.edu University of Wisconsin-Madison David Chandler, David Melski, David Vitek {chandler,melski,dvitek}@grammatech.com Grammatech Inc., Ithaca, New York David Chandler, David Melski, David Vitek {chandler,melski,dvitek}@grammatech.com Grammatech Inc., Ithaca, New York comentários principais: 1. voce precisa elaborar um exemplo no inicio da apresentacao mostrando como a tecnica funciona. 2. voce precisa detalhar mais as tecnicas. pelos slides que voce mostrou, não deu para entender. Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo Diego Melo Amorim Recife-PE Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo Diego Melo Amorim Recife-PE

O Problema: Buffer Overflows Classe de vulnerabilidades altamente exploradas Bug extremamente comum Programas legados escritos em C continuam vulneráveis Provavelmente essa parte pode demandar mais slides e, conseqüentemente, mais tempo de explicação Correção: por favor, mostre um ou dois exemplos de buffer overflows. a seguir, tente generalizar situacoes que causar overflow. Source: NVD/CVE 2

Buffer Overflows? void foo (char *bar) { // no bounds checking... char c[12]; strcpy(c, bar); } int main (int argc, char **argv) { foo(argv[1]); Provavelmente essa parte pode demandar mais slides e, conseqüentemente, mais tempo de explicação 3

Buffer Overflows? void foo (char *bar) { // no bounds checking... char c[12]; strcpy(c, bar); } int main (int argc, char **argv) { foo(argv[1]); Provavelmente essa parte pode demandar mais slides e, conseqüentemente, mais tempo de explicação 4

Buffer Overflows? void foo (char *bar) { // no bounds checking... char c[12]; strcpy(c, bar); } int main (int argc, char **argv) { foo(argv[1]); Provavelmente essa parte pode demandar mais slides e, conseqüentemente, mais tempo de explicação 5

A Solução: Análise Estática código fonte Possíveis Buffer Overrun’s técnica automática que assegura que o código está seguro antes de ser posto em produção Uso de Análise Estática de Programas Produção de uma lista de possíveis vulnerabilidades no código combinar alertas de Buffer Overrun's com técnicas de varredura de código Um overview da solução e como ela é feita Comentários: confuso! o que eh uma lista de buffer overrun. eh este o termo usado no paper? talvez o que voce esteja querendo dizer seja uma lista de testes que constroem uma situacao de buffer overrun. eh isto?! 6

Análise Estática? Análise de Programa Conceito abstrato de varredura de código antes de pôr em produção; Também conhecido como entendimento ou compreensão de programas; Várias técnicas, desde análise manual até ferramentas sofisticadas; Normalmente feita por ferramentas; Provavelmente essa parte pode demandar mais slides e, conseqüentemente, mais tempo de explicação 7

Contribuição Análise de Programa detecção de buffer overrun incorporado a uma ferramenta de análise de programa fazer a análise de buffer overrun sensível ao contexto Torna os resultados mais precisos Resolução de restrições uso de programação linear para solucionar o problema de análise de intervalo Salienta-se neste slide a contribuição dada pelo paper Comentários: acho que a audiencia não sabera o que significa uma analise estatica sensitiva a contexto. voce precisa explicar o que eh isto e por que eh importante. 8

Sensibilidade de Contexto? Provavelmente essa parte pode demandar mais slides e, conseqüentemente, mais tempo de explicação 9

Sensibilidade de Contexto? Provavelmente essa parte pode demandar mais slides e, conseqüentemente, mais tempo de explicação 10

Sensibilidade de Contexto? Provavelmente essa parte pode demandar mais slides e, conseqüentemente, mais tempo de explicação 11

Arquitetura da Ferramenta Gerador de Restrições CodeSurfer Código fonte C CFG’s, PDG’s e SDG’s Restrições Lineares Taint Analyser Restrições Lineares Figura que guiará toda a apresentação, sendo explicada cada passo do fluxo da solução Comentários: eh muito melhor que voce primeiro mostre um exemplo do inicio ao fim e depois tente generalizar o framework. o que eh o taint analyser? Solucionador de Restrições Warnings Buffer Overrun’s Intervalos para variáveis 12

Code Surfer Código fonte C CFG’s, PDG’s e SDG’s Restrições Lineares Gerador de Restrições CodeSurfer Código fonte C CFG’s, PDG’s e SDG’s Restrições Lineares Taint Analyser Restrições Lineares Solucionador de Restrições Warnings Buffer Overrun’s Intervalos para variáveis

Code Surfer ‘Detection Front-End’ Ferramenta comercial (Grammatech Inc.)‏ Ferramenta de analise de codigo. A partir de codigo, produz: Grafo de Fluxo de Controle (GFC) Grafo de Dependência de Programa (GDP) Grafo de Dependência de Sistema (GDS) ‘Detection Front-End’ Associa cada ‘warning’ gerado à linha do código fonte correspondente através do GDS; Explica-se nesta parte como funciona a ferramenta que foi tomada como base para elaborar a solução 14

Exemplo - código

Gerador de Restrições Código fonte C CFG’s, PDG’s e SDG’s CodeSurfer Código fonte C CFG’s, PDG’s e SDG’s Restrições Lineares Taint Analyser Restrições Lineares Solucionador de Restrições Warnings Buffer Overrun’s Intervalos para variáveis

Geração de Restrições Quatro tipos de ponteiros de programa resultam em restrições: Declaração Atribuição Chamada de Função Retorno de Função Quatro variáveis para cada buffer: buf_usd_max, buf_usd_min, buf_alc_max, buf_alc_min Operações em um buffer strcpy (tgt, src)‏ tgt_usd_max >= src_usd_max tgt_usd_min =< src_usd_min Uma explicação de como é gerada as restrições usadas pela solução 17

Métodos de Geração de Restrições Ordem dos Statements Análise sensível ao fluxo respeita a ordem do programa Análise insensível ao fluxo não respeita a ordem do programa Chamadas de Função Modelagem das funções sensíveis ao contexto respeitam a semântica da chamada de retorno Modelagem das funções insensíveis ao contexto ignoram a semântica da chamada de retorno 18

Exemplo – restrições geradas

Taint Analyser (Análise de Segurança)‏ Gerador de Restrições CodeSurfer Código fonte C CFG’s, PDG’s e SDG’s Restrições Lineares Taint Analyser Restrições Lineares Solucionador de Restrições Warnings Buffer Overrun’s Intervalos para variáveis

Análise de Segurança Remove variáveis de restrições não inicializadas chamadas a bibliotecas não modeladas variáveis de programas não inicializadas Remove variáveis de restrições que tem ‘range’ de valores infinitos; Necessário para que os solucionadores funcionem corretamente Análise feita para filtrar as restrições geradas tornando o resultado mais eficaz 21

Solucionador de Restrições Gerador de Restrições CodeSurfer Código fonte C CFG’s, PDG’s e SDG’s Restrições Lineares Taint Analyser Restrições Lineares Solucionador de Restrições Warnings Buffer Overrun’s Intervalos para variáveis

Solucionadores de Restrições Problema Abstrato Dado um conjunto de restrições em variáves máximas e mínimas Retorna o menor ajuste possível que satisfaça todas as restrições Abordagem Modelar e Solucionar como um programa linear Foram desenvolvidos dois solucionadores Vanilla (+ rápido, - preciso)‏ Hierárquico (+ preciso, - rápido)‏ Explicação de como as restrições geradas e devidamente tratadas são manipuladas a fim de dar um resultado desejado 23

Programação Linear ? Uma função Objetiva: F Sujeita a: Um conjunto de restrições lineares C Objetivo: otimizar o seu resultado Exemplo: Maximize: x sujeito a: x =< 3 Provavelmente essa parte pode demandar mais slides e, conseqüentemente, mais tempo de explicação 24

Solucionador de Restrições - Vanilla Objetivo: Obter valores para os limites do buffer Modelando como um programa linear: Menor limite superior Minimize: var_max Sujeita a: um conjunto x de restrições                 & Maximize: var_min Sujeita a: um conjunto y de restrições ... E de como a programação foi usada no nosso contexto Maior limite inferior 25

Solucionador de Restrições - Vanilla é possível reescrever da seguinte forma: Min:Σ (var_max) - Σ(var_min)‏ sujeito a:um conjunto z de restrições Resolvendo apenas um programa linear teremos valores para todas as variáveis!

Exemplo – valores das variáveis

Solucionador de Restrições - Vanilla Método impreciso: porque ? programas lineares infactíveis Lidamos com isso usando algoritmos de aproximação Identificamos Irreducibly Inconsistents Sets (IIS)

Análise insensível ao contexto bar () { int y; y = foobar(30); } foo () { int x; x = foobar(5); } Essa parte tenta explicar a contribuição que, segundo o autor, torna-se mais relevante por aumentar a eficiência e diminuir o número de falsos positivos. Primeiramente explica-se como é uma análise insensível ao contexto e como ela está sendo feita até então pela solução ... int foobar (int z) { int i; i = z + 1; return i; } Resultado: x = y = [6..31] Caminho correto 1 Caminho correto 2 Caminho falso 29

Adicionando Sensibilidade de Contexto bar () { int y; y = foobar(30); } foo () { int x; x = foobar(5); } Y = 30 + 1 X = 5 +1 Logo após explica-se como será inserida uma análise sensível ao contexto à solução Resumo: i = z + 1 int foobar (int z) { int i; i = z + 1; return i; } Sem caminhos falsos X = [6..6] Y = [31..31] I = [6..31] 30

Adicionando Sensibilidade de Contexto Pode separar contexto de chamadas Número muito grande de variáveis de restrições Não suporta recursão

Detector ‘Front-End’ Código fonte C CFG’s, PDG’s e SDG’s Gerador de Restrições CodeSurfer Código fonte C CFG’s, PDG’s e SDG’s Restrições Lineares Taint Analyser Restrições Lineares Solucionador de Restrições Warnings Buffer Overrun’s Intervalos para variáveis

Detector ‘Front-End’ buf_alloc_min buf_used_max Cenário 1: Possível Buffer Overrun

Detector ‘Front-End’ buf_alloc_min buf_used_max Cenário 2: Buffer Overrun

Resultados: Buffer Overrun's Aplicação Linhas de Código Warnings Vulnerabidades Detectado? WU-FTPD-2.5.0 16000 139 CA-1999-13 Sim WU-FTPD-2.6.2 18000 178 Nenhuma 14 Novos Sendmail-8.7.6 38000 295 Identificado por Wagner et al. Sendmail-8.11.6 68000 453 CA-2003-07 Esta parte pretende mostrar os resultados da ferramenta mostrando uma tabela de comparação entre vários programas conhecidamente vulneráveis 35

Conclusão Foi construída uma ferramenta para detectar buffer overrun's Incorporada em um framework de entendimento de programas Relevâncias foi adicionado sensibilidade ao fluxo reduzindo o número de falso positivos e, ao mesmo tempo, mantendo a escalabilidade