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

Post on 17-Apr-2015

104 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

Buffer Overflows?

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

}

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

}

Buffer Overflows?

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

}

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

}

Buffer Overflows?

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

}

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

}

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

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;

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

Sensibilidade de Contexto?

Sensibilidade de Contexto?

Sensibilidade de Contexto?

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

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

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;

Exemplo - código

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

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

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

Exemplo – restrições geradas

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

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

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

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)

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

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

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!

Exemplo – valores das variáveis

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)

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

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

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

Adicionando Sensibilidade de Contexto

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

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.

Sim

Sendmail-8.11.6 68000 453 CA-2003-07 Sim

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

top related