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
[email protected]
http://si.uniminas.br/~marcio/
Pós-SI – 4ª Turma – 2008
Princípios das funções seguras
Protótipo: função nome (parâmetros) retorno
Documente as funções
Use parâmetros e o retorno fortemente tipados
Teste os parâmetros recebidos (evita SQL/code
injection)
Use funções seguras (strncpy ao invés de strcpy)
Crie funções seguras (evita buffer overflow)
Use componentes e bibliotecas confiáveis
Teste o retorno das funções
entradas
saídas
Função
Márcio Moreira
Unidade 5 – Melhores Práticas de Programação – Slide 2
Segurança em Aplicações
Princípios gerais
Tenha política de versões consistentes
O recurso afetado existe desde a versão?
Use componentes e bibliotecas confiáveis
Evite arquivos temporários
Se necessário use nomes fixos (arq_userid.tmp)
com privilégios fixos
Não armazene senhas e chaves no código
if (senha = “@b0b4*”) then ...
privkey = “88419787349802”
Use ambientes (dev, tst, hml e prd) seguros
Márcio Moreira
Unidade 5 – Melhores Práticas de Programação – Slide 3
Segurança em Aplicações
Princípios de programação segura
Controle as condições de corrida
Teste antes, bloqueie, use e libere
Use semáforos ou outros mecanismos do SO
Minimização de privilégios
Use somente os privilégios necessários
Use várias camadas de segurança
Autenticação para acesso (credencial do usuário)
Autenticação estendida em pontos críticos da
aplicação (credenciais do supervisor ou usuário)
Márcio Moreira
Unidade 5 – Melhores Práticas de Programação – Slide 4
Segurança em Aplicações
Princípios de programação segura
Validação das entradas (evita injection)
Assuma que todas as entradas são vulneráveis
Procure valores válidos e rejeite o restante
Teste as entradas no client
Teste as entradas novamente na apresentação
Teste:
Márcio Moreira
`
WebServer
(DMZ)
Clients
Unidade 5 – Melhores Práticas de Programação – Slide 5
Firewall
Database
Server
Application
Server
Segurança em Aplicações
Backend VLAN (switch)
Tipo dos dados
Tamanho dos dados
Faixa de valores válidos
Formato dos valores válidos
Privated Areas
Production VLAN (switch)
Public Areas
Princípios de programação segura
Limite a área de exposição
Application.dll
Crie interfaces somente quando necessário
Ofereça somente os serviços necessários
Use verificadores de código
Ferramentas de análise estática de código
Buscam vulnerabilidades conhecidas no código
Trate as exceções
É altamente recomendável tratar exceções
As exceções de chamadas ao SO são imperativas
Márcio Moreira
Unidade 5 – Melhores Práticas de Programação – Slide 6
Segurança em Aplicações
Recomendações para Java (e .net)
Source code
Compiler
Class files
Libraries
Virtual Machine
Márcio Moreira
Unidade 5 – Melhores Práticas de Programação – Slide 7
Segurança em Aplicações
Developer
Defina atributos da classe como private
Defina métodos de acesso como protected
Declare métodos internos como private
Defina políticas de acesso a applets
User




Recomendações para Java (e .net)
Use herança com cuidado
Você pode herdar vulnerabilidades
Declare as classes como:
final (evita reuso),
uncloneable (evita instância sem o construtor) e
unserializable (evita acesso serial indireto)
Se precisar assinar o código use um arquivo
Evita o uso indevido de arquivos assinados
Márcio Moreira
Unidade 5 – Melhores Práticas de Programação – Slide 8
Segurança em Aplicações
Evite ou não use em Java (e .net)
Evite blocos privilegiados (privileged blocks)
Padrão:
if (obj.getClass().getName().equals("Admin")) {

// executa aqui a operação privilegiada
}
Se for necessário, use:
if (obj.getClass() ==
this.getClassLoader().loadClass("Admin")) {

// executa aqui a operação privilegiada
}
Evite atributos estáticos (static)
Márcio Moreira
Unidade 5 – Melhores Práticas de Programação – Slide 9
Segurança em Aplicações
Evite ou não use em Java (e .net)
Não use o mecanismo package para
controle de acesso (eles normalmente são
abertos)
Não use string para armazenar senhas
Use vetor de char e limpe o conteúdo após o uso
Isto reduz a eficácia do memory dump
Não use classes aninhadas (elas tornam-se
acessíveis a todo o pacote)
Não compare o nome de classes (isto revela
informações que um espião não deve saber)
Márcio Moreira
Unidade 5 – Melhores Práticas de Programação – Slide 10
Segurança em Aplicações
Materiais adicionais
 Writing Secure Code – Best Practices
 Secure Programming – Java - SAP
 Programación Segura
 Strategies for Securing Java Technology Code
 Java & Secure Programming (Bad Examples found
in JDK)
 Catálogo de Práticas de Programação Segura em
Java
 Mechanisms for Secure Modular Programming in
Java
 Security Code Guidelines - Sun
Márcio Moreira
Unidade 5 – Melhores Práticas de Programação – Slide 11
Segurança em Aplicações
Download

Princípios das funções seguras