Post on 18-Feb-2017
Análise de Código e Segurança de SoftwarePor Davidson Boccardo Data: 23/11/2016
ClavisSegurança da informação
www.clavis.com.br
Green HatSegurança da Informação
whoamiDoutor em Engenharia Elétrica (UNESP/ULL)
Instrutor dos cursos de Forense, Testes de Invasão e de Desenvolvimento Seguro, Proteção de Software
Coordenador de projetos de pesquisa, orientador de alunos de mestrado/doutorado MPMQ/PPGI - mais de 50 artigos científicos publicados
Entre 2007 e 2009 trabalhou no Software Research Lab da University of Louisiana at Lafayette, na qual se especializou em análise estática e dinâmica de artefatos maliciosos
Entre 2010 e 2015 desenvolveu metodologias para o Serviço de Avaliação de Produtos de Software no Laboratório de Informática da Divisão de Metrologia em Tecnologia da Informação e Telecomunicações do Inmetro
02
DAVIDSON RODRIGO BOCCARDODIRETOR DO GREEN HAT LABS
Green HatSegurança da Informação
Green HatSegurança da informação
www.clavis.com.br
Sobre a Green Hat
Análise de SegurançaOrientada por Dados
Análise de Código e Segurança de Software
Auditorias Teste de Invasão
Forense Computacional
• 2009: empresa spin-off corporativa que nasceu a
partir de um grupo da Clavis Segurança da
Informação • 2010: Framework de Teste de Invasão (FINEP)• 2015: Auditoria de Código-Fonte e Análise Dinâmica• 2016: Análise de Código e Segurança de Software• 2016: Análise de Segurança Orientada por Dados
(FAPERJ)
Green Hat
01
Auditoria de Código-Fonte Análise dinâmica
Green HatSegurança da Informação
www.clavis.com.br
Segurança de Software
• A economia e as defesas das nações dependem, em grande parte, da execução de software confiável
• Software é onipresente! • afeta todos os aspectos de nossas vidas pessoais e profissionais
• Vulnerabilidades de software também são ubíquas, comprometendo:• identidades pessoais• propriedade intelectual• confiança do consumidor• serviços empresariais e operações • infra-estruturas críticas e governo
03
Green HatSegurança da Informação
www.clavis.com.br
Falhas crescentes envolvendo software 04
[GIZMODO, 2014] [FINANCIAL TIMES, 2014]
Green HatSegurança da Informação
www.clavis.com.br
Falhas crescentes envolvendo software 05
[SLASHDOT, 2012]
[REDDIT, 2014]
[THEGUARDIAN, 2013]
Green HatSegurança da Informação
www.clavis.com.br
Falhas crescentes envolvendo software 06
[NEWYORKTIMES, 2011] [FORBES, 2014]
Green HatSegurança da Informação
www.clavis.com.br
Falhas de software são custosas 07
[NEWYORKTIMES, 2014]
[THE WALL STREET JORNAL, 2014]
Green HatSegurança da Informação
www.clavis.com.br
• Maioria das vulnerabilidades são causadas por erros de programação • 64% das vulnerabilidades da base do NIST NVD • 51% dessas são originadas em erros clássicos como buffer overflows, cross-site scripting, falhas de injeção
• Vulnerabilidades mais comuns incluem: • Integer overflow • Buffer overflow • Format string • Autenticação ausente • Autorização ausente ou incorreta • Confiar em entradas não-confiáveis
08Origem das falhas de software
Green HatSegurança da Informação
www.clavis.com.br
• Começa com o entendimento de práticas de codificação inseguras e como podem ser exploradas
• Projetos inseguros podem levar a “erros intencionais”, ou seja, o código está corretamente implementado, mas o software resultante é vulnerável
• Projetos seguros exigem um entendimento dos requisitos de software funcionais e não-funcionais
• Codificação segura exige umentendimento específico de cada linguagem de programação
09Desenvolvimento de Software Seguro
Green HatSegurança da Informação
www.clavis.com.br
Fontes de Insegurança em Software
• Considerações mínimas ou ausentes de segurança durante todo o ciclo de vida do software
• Complexidade, mudanças, suposições incorretas
• Não pensar como um atacante
• Especificações e projetos falhos
• Implementação “pobre” das interfaces de software
• Interações inesperadas e não-intencionais
• Conhecimento inadequado de práticas de codificação segura
10
Green HatSegurança da Informação
www.clavis.com.br
11
• Análise de requisitos de segurança e arquitetura de software
• Inspeção de código e programação segura• Análise de fluxo de controle e de dados• Análise de vulnerabilidades (CWE/SANS Top 25, OWASP Top 10) • Análise dinâmica de software e testes funcionais
• Proteção de Software• Ofuscação, Incorruptibilidade e Marca d'água
Análise de Código e Segurança de Software
Green HatSegurança da Informação
www.clavis.com.br
Análise de Requisitos de Segurança e Arquitetura de Software 12
• Requisitos gerais de segurança• Confidencialidade, integridade e disponibilidade• Ambiente de implantação, arquivamento, anti-pirataria• Gerenciamento de sessões, gerenciamento de erros e excessões, gerenciamento de parâmetros de configuração
• Arquitetura de segurança• Princípios básicos de projeto seguro: redução das superfícies de ataque, falha segura, defesa em profundidade, privilégio mínimo, separação de deveres, etc…
• Utilização correta de algoritmos criptográficos e protocolos de segurança
Green HatSegurança da Informação
www.clavis.com.br
Inspeção de Código e Programação Segura13Análise do Fluxo de Controle: Rastreabilidade de Software
Green HatSegurança da Informação
www.clavis.com.br
14Inspeção de Código e Programação SeguraAnálise do Fluxo de Controle: Funcionalidades Escondidas
Green HatSegurança da Informação
www.clavis.com.br
15Inspeção de Código e Programação SeguraOrientações para Codificação Segura
Green HatSegurança da Informação
www.clavis.com.br
16
Um estouro de buffer ocorre quando dados são gravados fora dos limites da memória alocada para uma estrutura de dados específica
Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Buffer overflow
Origem
Destino
16 Bytes
Memória Alocada Memória Adjacente
Montparnasse derailment [1895]
Green HatSegurança da Informação
www.clavis.com.br
17Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Buffer overflow
• Ocorre quando o limite de buffer é negligenciado e não-verificado• Pode ocorrer em qualquer segmento de memória• Pode ser explorado para modificar:• variável• ponteiro de dados• ponteiro de função• endereço de retorno na pilha
Green HatSegurança da Informação
www.clavis.com.br
18Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Buffer overflow
printf(“Nome:.\n"); rc = scanf("%s", registro[idx].nome);if (rc != 1) {
printf(“Entrada inválida.\n");exit(1);
}
Green HatSegurança da Informação
www.clavis.com.br
19Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Buffer overflow
printf(“Nome:.\n"); rc = scanf("%s", registro[idx].nome);if (rc != 1) {
printf(“Entrada inválida.\n");exit(1);
} Captura até acabar a entrada ouencontrar um espaço
Green HatSegurança da Informação
www.clavis.com.br
20Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Buffer overflow
void* rp; ... printf(“Nome:.\n");rp = fgets(registro[idx].nome, sizeof(registro[idx].nome), stdin);if(rp == NULL) {
printf(“Entrada inválida.\n"); exit(1);} Captura até acabar a entrada ou
atingir o limite do buffer
Green HatSegurança da Informação
www.clavis.com.br
21
Uma entrada de usuário maliciosa é enviada para algum processador:
Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Injeção
Processador Tipo de Injeção
HTML Parser (inc. navegador) Cross-Site Scripting (XSS)
Shell OS Command
C printf () Format String
Banco de Dados SQL
Função de acesso a arquivo (fopen()) Pathname
Green HatSegurança da Informação
www.clavis.com.br
22Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Injeção SQL
• Programas devem tomar medidas para garantir que quaisquer dados que cruzem uma fronteira de confiança sejam apropriados e não-malicioso
Green HatSegurança da Informação
www.clavis.com.br
23Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Injeção SQL
boolean isPasswordCorrect(String name, char[] password) throws SQLException, ClassNotFoundException {
Connection connection = getConnection(); ... String pwd = new String(password);String sqlString = "SELECT * FROM Users WHERE name = '” + name + "' AND password = '" + pwd + "'"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(sqlString); if (!rs.next())
return false;}
Green HatSegurança da Informação
www.clavis.com.br
boolean isPasswordCorrect(String name, char[] password) throws SQLException, ClassNotFoundException {
Connection connection = getConnection(); ... String pwd = new String(password);String sqlString = "SELECT * FROM Users WHERE name = '” + name + "' AND password = '" + pwd + "'"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(sqlString); if (!rs.next())
return false;}
24Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Injeção SQL
Green HatSegurança da Informação
www.clavis.com.br
boolean isPasswordCorrect(String name, char[] password) throws SQLException, ClassNotFoundException {
Connection connection = getConnection(); ... String pwd = new String(password);String sqlString = "SELECT * FROM Users WHERE name = '” + name + "' AND password = '" + pwd + "'"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(sqlString); if (!rs.next())
return false;}
25Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Injeção SQL
name e password não foram tratados!
Green HatSegurança da Informação
www.clavis.com.br
boolean isPasswordCorrect(String name, char[] password) throws SQLException, ClassNotFoundException {
Connection connection = getConnection(); ... String pwd = new String(password);String sqlString = "SELECT * FROM Users WHERE name=? AND password=?"; PreparedStatement stmt = connection.prepareStatement(sqlString); stmt.setString(1, name); stmt.setString(2, pwd);ResultSet rs = stmt.executeQuery(); if (!rs.next()) { return false;}
26Inspeção de Código e Programação SeguraAnálise de Vulnerabilidades: Injeção SQL
sanitização da entrada =)
Green HatSegurança da Informação
www.clavis.com.br
27Inspeção de Código e Programação SeguraAnálise Dinâmica: Análise do Fluxo de Controle e Dados
Green HatSegurança da Informação
www.clavis.com.br
28Inspeção de Código e Programação SeguraAnálise Dinâmica: Propagação de Atributos e Execução Simbólica
Green HatSegurança da Informação
www.clavis.com.br
29
• Resistir à engenharia reversa estática e dinâmica• Resistir à modificações não autorizadas• Resistir à clonagem de software• Resistir ao spoofing• Esconder segredos estáticos e dinâmicos (criação, transmissão, utilização)• Impedir a distribuição de programas “crackeados”
• Ofuscação — proteção contra engenharia reversa • Incorruptibilidade — proteção contra modificação/monitoramento• Marca d’água — identificação de autoria e rastreamento de propriedade
Proteção de Software
Green HatSegurança da Informação
www.clavis.com.br
30
Ofuscação
Marca d’água Incorruptibilidade
Proteção de Software
Green HatSegurança da Informação
www.clavis.com.br
Ofuscação: movfuscator
The M/o/Vfuscator compiles programs into "mov" instructions, and only "mov" instructions. Arithmetic, comparisons, jumps, function calls, and everything else a program needs are all performed through mov operations; there is no self-modifying code, no transport-triggered calculation, and no other form of non-mov cheating
31
Green HatSegurança da Informação
www.clavis.com.br
Movfuscator: Grafo de Fluxo de Controle 32
Green HatSegurança da Informação
www.clavis.com.br
Incorruptibilidade 33
Green HatSegurança da Informação
www.clavis.com.br
Marca d’água e Impressão Digital 34
Como?Para quê?
Green HatSegurança da Informação
www.clavis.com.br
Marca d’água e Impressão Digital: CFG 35
Green HatSegurança da Informação
www.clavis.com.br
Conclusões
• A iminência de falhas de software em infraestruturas críticas, aplicações e serviços aumenta a necessidade de
• Novas regulamentações referentes à segurança de software
• Serviços, metodologias e ferramentas para avaliação de segurança
• Treinamento/conscientização em desenvolvimento seguro
36
Green HatSegurança da informação
www.clavis.com.br
Muito Obrigado!
37
davidson@clavis.com.br
Davidson R. BoccardoDiretor do Green Hat Labs