ANÁLISE DAS TÉCNICAS DE PROGRAMAÇÃO SEGURA EM C E JAVA, COM ênfase em Buffer Overflow. Carlos Alberto Felippi Lucas Ricardo Rafael Schadeck Relevante OBJETIVO: Analisar as técnicas de programação segura em C e Java, definindo conceitos e as técnicas de programação e suas utilizações em casos, com ênfase em Buffer Overflow afim de definir boas práticas para o desenvolvimento. JUSTIFICATIVA: Um meio de verificar uma programação segura é conhecer os sistemas, e desta forma analisar o melhor meio de evitar possíveis erros indesejados na programação. Porém, cada sistema possui suas características, sendo assim é importante analisar cada sistema, C e JAVA, dentro de suas características. Cada técnica demonstrada será destacada dentro de seu contexto operacional, de forma que a implementação dos códigos posam ser os mais seguros possíveis evitando transtornos como os Buffer Overflow. Introdução Programação Segura Buffer Overflow C & JAVA Técnicas Definições de C Unix Baixo e alto nível e linguagem compilada Imperativa e procedural Structs Técnicas de programação segura em C 03 principais princípios: ◦ Integridade; ◦ Robustez; ◦ Segurança. 03 vulnerabilidades ◦ Dangling pointers; ◦ Double free. ◦ Buffer overflow; Técnicas para melhorar a segurança dos códigos em C Cuidado com “gets” e “scanf”; Reutilize seu código; Facilite seu código; Clean code; Criptografia; Só apague o que você conhece; Teste e deixe testar; Auditoria de segurança; Setuid; Caso comentado Análise das implementações em C Técnicas; Planejamento; Comparativos e pontos a serem considerados em C Princípios; Técnicas; Ferramentas; Objetivo; Definição de JAVA Sun Microsystems, 1995 Linguagem própria Notebooks, desktops, tablets, celulares, smartphones e diversos outros sistemas embarcados JVM JRE JDK Técnicas de programação segura em JAVA OWASP (The Open Web Application Security Project) Cross-Site Request Forgery Command Injectionl Buffer Overflow Técnicas de programação segura em JAVA Command Injection Técnicas de programação segura em JAVA Buffer Overflow Conclusões casos JAVA Seguro; Fácil; Organizado; Leitura; Manutenção; Definição de Buffer Overflow Memória Inundação Quantidade de dados maior do que se possa conter Estático ou Dinâmico Recebe mais dados do que está preparado Variável nome A B Valor [] 1979 Valor hexadecimal 00 00 00 00 00 00 00 00 07 Variável nome A B Valor 'e' Valor hexadecimal 65 78 63 65 73 73 69 76 65 00 'x' 'c' 'e' 's' 's' 'i' 'v' 25856 BB Normas e boas práticas de programação segura Em JAVA tipos de prática: FAÇA Sempre classifique os atributos de uma classe como private. Defina políticas para detalhar os privilégios de acesso a objetos de classes ou a applets específicos com base em arquivos fonte e/ou assinaturas. EVITE Evite ao máximo o uso de atributos static. Esse tipo de atributo é alocado à classe e não ao objeto e desse modo pode ser localizado por qualquer outra classe. NÃO FAÇA Não use o tipo String para armazenar senhas, mesmo temporariamente, pois esse tipo de variável é immutable, e seu valor será mantido na memória até a próxima operação. Use o tipo char[] e sobrescreva o valor da variável assim que possível. Nunca armazene senhas ou outras informações secretas diretamente no código. Normas e boas práticas de programação segura Boas práticas em C: 1. Sempre escolha nomes significativos para variáveis, funções e procedimentos. 2. Mantenha a documentação concisa e descritiva. 3. Lembrar que o tempo de leitura e compreensão de um programa é muito maior do que o tempo para escrevê-lo. A leitura do programa deve ser o mais fácil possível. 4. As três de estruturas de controle em programação são: · sequência · seleção · repetição 5. Cada subprograma (função ou procedimento) deve fazer uma única tarefa e deve fazê-la corretamente. 6. Inclua comentários Normas e boas práticas de programação segura Normas sobre Programação em C/C++: 1. Todo comando em C/C++ termina com um ponto-e-vírgula (;). 2. Alinhe um { na mesma coluna que seu } correspondente. 3. Todo programa C/C++ inicia sua execução no programa principal, denominado main. 4. Ao utilizar qualquer estrutura de seleção ou repetição, por exemplo, comandos de seleção (if, switch) ou de repetição (for, while, do-while), desloque dois espaços para a direita (indentation) os comandos contidos neles. 5. O comando break usado nos comandos while, for, do/while, ou switch causa a saída imediata dessas estruturas para o próximo comando. 6. O comando continue usado nos comando while, for, do/while faz com que o controle do programa passe para o próximo passo da iteração. 7. Evite usar somente letras maiúsculas. 8. Colocar um ponto-e-vírgula logo após um comando de seleção ou repetição constitui um erro. Como evitar o Buffer Overflow Construção de um bom projeto estrutural de programação Atentando as condições de testes e homologações de todos os tipos de diferentes ambientes, testes em várias plataformas Estar em dia com atualizações e patchs de segurança (remendo em inglês), servem para adicionar recursos ou corrigir erros em alguns programas. Não devemos depender exclusivamente das boas práticas de programação dos desenvolvedores Técnicas que ajudam a melhorar a segurança dos programas: Melhores práticas de programação: - Proteção pelo sistema operacional - Proteção pelo compilador - Verificações na altura da execução - Invalidar a execução de código na pilha Análise Buffer Overflow Normas Cuidados na construção do código Identificar um código fonte seguro Análise dos códigos Testes de requisitos Prevenir ataques Conhecer as ferramentas Boas Práticas Programação defensiva Não existe um sistema totalmente seguro Dicas: Não complique seu código Faça auditoria de segurança Todo dado é importante Todo código é inseguro A experiencia e conhecimento são importantes na melhor qualidade Referencias “Buffer Overflow”, http://www.segurancadigital.info/dicas/49-seguranca-da-informacao/427-buffer-overflow. “Crimes Cibernéticos: Entendendo o Buffer Overflow”,http://www.crimesciberneticos.com/2011/02/entendendo-obuffer-overflow.html. “developerWorks : Introdução a Programação Java”, CT801, 4 de junho de 2012, http://www.ibm.com/developerworks/br/java/newto/. “file.pdf”, http://www.gris.dcc.ufrj.br/documentos/apresentacoes/buffer-overflow-uma-introducaoteorica/at_download/file. “G2T6-secur.program-final.pdf”, http://web.fe.up.pt/~jmcruz/ssi/ssi.1112/trabs-als/final/G2T6-secur.programfinal.pdf. “Microsoft Word - 13988.rtf - 13988.pdf”, http://si.lopesgazzani.com.br/docentes/marcio/SegApp/13988.pdf. “O que é um Buffer Overflow ?”, Under-Linux.Org, https://under-linux.org/entry.php?b=923. “Programação Segura: Uma Introdução à Auditoria de Códigos - gts0204-02slides-progsec-gts2004.pdf”, ftp://ftp.registro.br/pub/gts/gts0204/gts0204-02slides-progsec-gts2004.pdf. Sandro Süffert, “Segurança - blog.suffert.com: Portal Brasileiro de Programação Segura Java”, SSegurança blog.suffert.com, http://sseguranca.blogspot.com.br/2008/08/portal-brasileiro-de-programao-segura.html. “Tomando o controle de programas vulneráveis a buffer overflow”, http://www.cic.unb.br/~rezende/trabs/buffer_overflow.htm. developerWorks : Introdução a Programação Java. CT801. http://www.ibm.com/developerworks/br/java/newto Segurança (guia de programação C#). http://viniciusbalduinogarcia.wordpress.com/2009/10/13/seguranca-guiade-programacao-c Segurança no desenvolvimento de sistemas em Java. http://java.sapao.net/>. Acesso em: 22 ago. 2013.