buffer overrun detection using linear programming and static analysis centro de informática/ufpe...

37
Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo Diego Melo Amorim Recife-PE h ACM Conference on Computer and Communications Security Washington, DC, October 2003. 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 Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo Diego Melo Amorim Recife-PE h ACM Conference on Computer and Communications Security Washington, DC, October 2003. 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

Upload: internet

Post on 17-Apr-2015

104 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Buffer Overrun Detection using Linear Programming and Static Analysis

Centro de Informática/UFPETópicos Avançados em Engenharia de Software 2008-1

Rodrigo Diego Melo AmorimRecife-PE

10th ACM Conference on Computer and Communications Security. Washington, DC, October 2003.

Vinod Ganapathy, Somesh Jha{vg,jha}@cs.wisc.eduUniversity of Wisconsin-Madison

David Chandler, David Melski, David Vitek{chandler,melski,dvitek}@grammatech.comGrammatech Inc., Ithaca, New York

Centro de Informática/UFPETópicos Avançados em Engenharia de Software 2008-1

Rodrigo Diego Melo AmorimRecife-PE

10th ACM Conference on Computer and Communications Security. Washington, DC, October 2003.

Vinod Ganapathy, Somesh Jha{vg,jha}@cs.wisc.eduUniversity of Wisconsin-Madison

David Chandler, David Melski, David Vitek{chandler,melski,dvitek}@grammatech.comGrammatech Inc., Ithaca, New York

Page 2: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

O Problema: Buffer Overflows

• Classe de vulnerabilidades altamente exploradaso Bug extremamente comumo Programas legados escritos em C continuam vulneráveis

0

100

200

300

400

500

600

1995 1997 1999 2001 2003 2005

Source: NVD/CVE

Page 3: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Buffer Overflows?

void foo (char *bar) { // no bounds checking...char c[12]; strcpy(c, bar);

}

int main (int argc, char **argv) {foo(argv[1]);

}

Page 4: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Buffer Overflows?

void foo (char *bar) { // no bounds checking...char c[12]; strcpy(c, bar);

}

int main (int argc, char **argv) {foo(argv[1]);

}

Page 5: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Buffer Overflows?

void foo (char *bar) { // no bounds checking...char c[12]; strcpy(c, bar);

}

int main (int argc, char **argv) {foo(argv[1]);

}

Page 6: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

A Solução:

• 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

Possíveis Buffer Overrun’scódigo fonte

Análise Estática

Page 7: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Análise Estática?

• Análise de Programao Conceito abstrato de varredura de código antes de pôr

em produção;o Também conhecido como entendimento ou compreensão

de programas;o Várias técnicas, desde análise manual até ferramentas

sofisticadas;o Normalmente feita por ferramentas;

Page 8: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Contribuição

• Análise de Programao detecção de buffer overrun incorporado a uma

ferramenta de análise de programao fazer a análise de buffer overrun sensível ao contexto

o Torna os resultados mais precisos

• Resolução de restriçõeso uso de programação linear para solucionar o problema de

análise de intervalo

Page 9: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Sensibilidade de Contexto?

Page 10: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Sensibilidade de Contexto?

Page 11: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Sensibilidade de Contexto?

Page 12: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Arquitetura da Ferramenta

Código fonte C

Restrições Lineares

Restrições Lineares

Warnings Buffer Overrun’s

Intervalos para variáveis

CFG’s, PDG’s e SDG’s

CodeSurferGerador de Restrições

Taint Analyser

Solucionador de Restrições

Page 13: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Code Surfer

Código fonte C

Restrições Lineares

Restrições Lineares

Warnings Buffer Overrun’s

Intervalos para variáveis

CFG’s, PDG’s e SDG’s

CodeSurferGerador de Restrições

Taint Analyser

Solucionador de Restrições

Page 14: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Code Surfer

• Ferramenta comercial (Grammatech Inc.)• Ferramenta de analise de codigo. A partir de codigo,

produz:o Grafo de Fluxo de Controle (GFC)o Grafo de Dependência de Programa (GDP)o Grafo de Dependência de Sistema (GDS)

• ‘Detection Front-End’o Associa cada ‘warning’ gerado à linha do código

fonte correspondente através do GDS;

Page 15: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Exemplo - código

Page 16: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Gerador de Restrições

Código fonte C

Restrições Lineares

Restrições Lineares

Warnings Buffer Overrun’s

Intervalos para variáveis

CFG’s, PDG’s e SDG’s

CodeSurferGerador de Restrições

Taint Analyser

Solucionador de Restrições

Page 17: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Geração de Restrições

• Quatro tipos de ponteiros de programa resultam em restrições:o Declaraçãoo Atribuiçãoo Chamada de Funçãoo Retorno de Função

• Quatro variáveis para cada buffer:o buf_usd_max, buf_usd_min, buf_alc_max, buf_alc_min

• Operações em um buffero strcpy (tgt, src)

o tgt_usd_max >= src_usd_maxo tgt_usd_min =< src_usd_min

Page 18: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Métodos de Geração de Restrições

• Ordem dos Statementso Análise sensível ao fluxo

respeita a ordem do programao Análise insensível ao fluxo

não respeita a ordem do programa

• Chamadas de Funçãoo Modelagem das funções sensíveis ao contexto

respeitam a semântica da chamada de retornoo Modelagem das funções insensíveis ao contexto

ignoram a semântica da chamada de retorno

Page 19: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Exemplo – restrições geradas

Page 20: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Taint Analyser (Análise de Segurança)

Código fonte C

Restrições Lineares

Restrições Lineares

Warnings Buffer Overrun’s

Intervalos para variáveis

CFG’s, PDG’s e SDG’s

CodeSurferGerador de Restrições

Taint Analyser

Solucionador de Restrições

Page 21: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Análise de Segurança

• Remove variáveis de restrições não inicializadaso chamadas a bibliotecas não modeladas o 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

Page 22: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Solucionador de Restrições

Código fonte C

Restrições Lineares

Restrições Lineares

Warnings Buffer Overrun’s

Intervalos para variáveis

CFG’s, PDG’s e SDG’s

CodeSurferGerador de Restrições

Taint Analyser

Solucionador de Restrições

Page 23: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Solucionadores de Restrições

• Problema Abstratoo Dado um conjunto de restrições em variáves máximas e

mínimaso Retorna o menor ajuste possível que satisfaça todas as

restrições• Abordagem

o Modelar e Solucionar como um programa linear• Foram desenvolvidos dois solucionadores

o Vanilla (+ rápido, - preciso)o Hierárquico (+ preciso, - rápido)

Page 24: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Programação Linear ?

• Uma função Objetiva: F• Sujeita a: Um conjunto de restrições lineares C• Objetivo: otimizar o seu resultado• Exemplo:

o Maximize: xo sujeito a: x =< 3

Page 25: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Solucionador de Restrições - Vanilla

• Objetivo: Obter valores para os limites do buffer• Modelando como um programa linear:

Minimize: var_maxSujeita a: um conjunto x de restrições                &Maximize: var_minSujeita a: um conjunto y de restrições

Menor limite superior

Maior limite inferior

Page 26: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Solucionador de Restrições - Vanilla

• é possível reescrever da seguinte forma:o Min:Σ (var_max) - Σ(var_min)o sujeito a:um conjunto z de restrições

• Resolvendo apenas um programa linear teremos valores para todas as variáveis!

Page 27: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Exemplo – valores das variáveis

Page 28: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Solucionador de Restrições - Vanilla

• Método impreciso: porque ?o programas lineares infactíveis

• Lidamos com isso usando algoritmos de aproximação• Identificamos Irreducibly Inconsistents Sets (IIS)

Page 29: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Análise insensível ao contexto

foo () {

int x;x = foobar(5);

}

bar () {

int y;y = foobar(30);

}

int foobar (int z) {

int i;i = z + 1;return i;

} Caminho correto 1

Resultado: x = y = [6..31]

Caminho falsoCaminho correto 2

Page 30: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Adicionando Sensibilidade de Contexto

foo () {

int x;x = foobar(5);

}

bar () {

int y;y = foobar(30);

}

int foobar (int z) {

int i;i = z + 1;return i;

}

Sem caminhos falsosX = [6..6]

Y = [31..31]I = [6..31]

X = 5 +1 Y = 30 + 1

Resumo: i = z + 1

Page 31: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

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

Adicionando Sensibilidade de Contexto

Page 32: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Detector ‘Front-End’

Código fonte C

Restrições Lineares

Restrições Lineares

Warnings Buffer Overrun’s

Intervalos para variáveis

CFG’s, PDG’s e SDG’s

CodeSurferGerador de Restrições

Taint Analyser

Solucionador de Restrições

Page 33: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Detector ‘Front-End’

buf_alloc_min

buf_used_max

Cenário 1: Possível Buffer Overrun

Page 34: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Detector ‘Front-End’

buf_alloc_min

buf_used_max

Cenário 2: Buffer Overrun

Page 35: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

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.

Sim

Sendmail-8.11.6 68000 453 CA-2003-07 Sim

Page 36: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo

Conclusão

• Foi construída uma ferramenta para detectar buffer overrun's

• Incorporada em um framework de entendimento de programas

• Relevânciaso foi adicionado sensibilidade ao fluxoo reduzindo o número de falso positivos e, ao mesmo

tempo, mantendo a escalabilidade

Page 37: Buffer Overrun Detection using Linear Programming and Static Analysis Centro de Informática/UFPE Tópicos Avançados em Engenharia de Software 2008-1 Rodrigo