programação segura

36
Programação Segura Pontifícia Universidade Católica de Campinas Tópicos em Engenharia Computação B Prof. Edmar Roberto Santana de Rezende Daniel Mome Rafael G. O. Santos Ronaldo R. Nascimento Sílvia R. L. Colella

Upload: lei

Post on 12-Jan-2016

36 views

Category:

Documents


0 download

DESCRIPTION

Programação Segura. Pontifícia Universidade Católica de Campinas Tópicos em Engenharia Computação B Prof. Edmar Roberto Santana de Rezende Daniel Mome Rafael G. O. Santos Ronaldo R. Nascimento Sílvia R. L. Colella. Sumário. Introdução Motivação Principais Bugs de Segurança - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Programação Segura

Programação SeguraPontifícia Universidade Católica de Campinas

Tópicos em Engenharia Computação B Prof. Edmar Roberto Santana de Rezende

Daniel MomeRafael G. O. SantosRonaldo R. NascimentoSílvia R. L. Colella

Page 2: Programação Segura

Sumário

• Introdução• Motivação• Principais Bugs de Segurança

• Validação dos dados no servidor• Data Tampering

• Buffer Overflow • SQL Injection• Script Injection• Cross-Site Scripting

• Dicas

Page 3: Programação Segura

Motivação

•Por quê?

Page 4: Programação Segura

Motivação

• Ataques exploram falhas de segurança

• Pequenos bugs podem derrubar sistemas inteiros

• Empresas dependem dos sistemas de informação

Page 5: Programação Segura

Motivação

• Aumento da qualidade– Relacionada com a ocorrência de erros

Page 6: Programação Segura

Principais Bugs de Segurança

Page 7: Programação Segura

Validação de entrada no cliente e no servidor

• Praticamente todo ataque é resultado de alguma entrada enviada pelo atacante.

• Programação segura é sobre não permitir que entradas de pessoas com mas intensões causem problemas.

• Entradas que levam um comportamento inapropriado do sistema.

• Entradas que permitem acesso a informações restritas do seu sistema.

Page 8: Programação Segura

Todo Input é suspeito

● Em um ambiente distribuido, não há apenas uma fronteira, mas varias.

● Programadores tendende a ver a relação cliente servidor como fazendo parte do sistema e não como algo aberto a ataques

● Cliente é realmente o cliente?● O servidor é realmente o servidor?● Até onde se pode confiar?● O que uma ma entrada entrada pode causar?● Espere o Inesperado.

Page 9: Programação Segura

Falha de seguraça no Gmail descoberta em 2006

● Cross-Site Request Forgery● Acesso indevido a lista de contatos● Bastava acessar página maliciosa enquanto logado

no Gmail● Na pagina maliciosa : <script src="

http://mail.google.com/mail/?_url_scrubbed_">● Recebia como resposta a lista de contatos.

Page 10: Programação Segura

Data Tampering

• Consiste no envio de dados cuidadosamente preparados para serem aceitos pela aplicação mas gerar um efeito colateral não previsto pelo desenvolvedor.

• Exemplos típicos envolvem montar comandos na linguagem de script, comandos SQL, comandos JavaScript ou tags HTML que serão executados pela aplicação.

• Ou então enviar chaves de registros, comandos da aplicação, identificadores de sessão e outros parâmetros utilizados internamente pela aplicação.

Page 11: Programação Segura

Data Tampering

• Principais tipos

• Buffer Overflow

• Script Injection

• SQL Injection

• Cross-Site Scripting

Page 12: Programação Segura

Buffer Overflow - Overview

• Ocorre quando o tamanho de um buffer ultrapassa sua capacidade de armazenamento

• Excesso de dados pode ser armazenado em áreas de memória próximas

Page 13: Programação Segura

Buffer Overflow - Consequências

• Travar um sistema

• Corromper dados

• Executar outros programas

Page 14: Programação Segura

Buffer Overflow - Exemplo

Page 15: Programação Segura

Script Injection

• O que é?

• Script Injection é a forma de inserir código de script (Javascript por exemplo) ou tags HTML em requisições que vão para o servidor ou em respostas do servidor para o cliente.

Page 16: Programação Segura

Script Injection

• Onde fica o perigo?

• Se alguma informação fornecida pelo usuário é posteriormente exibido em uma página HTML, o cracker pode inserir dados contendo código malicioso que posteriormente será executado pelo servidor ou pelo próprio browser do cliente.

Page 17: Programação Segura

Script Injection

• Desta forma pode-se:

• Iludir o usuário, fazendo o pensar que está em outra página

• Criar links que fazem o usuário executar uma ação quando pensa estar fazendo outra coisa

Page 18: Programação Segura

Script Injection

• Tomar cuidado

• Com código Javascript pode-se realizar ações sem depender da iniciativa do usuário.

• Várias tags HTML provocam ações imediatas, ex: <img>, <iframe>.

• Além de atributos como onLoad, onMouseOver• Se a linguagem de script do servidor suportar

avaliação de expressões em texto (a maioria suporta) é possível inserir código a ser executado no próprio servidor que hospeda a aplicação, e não no navegador do usuário.

Page 19: Programação Segura

Script Injection

• Como se defender

• Elimine do texto digitado pelo usuário tudo o que se parecer com tags HTML e comandos de Script.

• Antes de exibir em uma página qualquer informação obtida de uma fonte externa, valide a informação para eliminar o significado especial de símbolos como < & $ ;` .

• Considere como fontes externas não apenas os campos digitados pelo usuário, mas também cookies, variáveis de ambiente, arquivos anexados, campos de banco de dados e etc.

Page 20: Programação Segura

SQL Injection

• SQL Injection é uma das formas mais conhecidas de se fazer ataques em sistemas. Principalmente em sistemas WEB.

• É a forma de inserir comandos SQL ou de alterá-los, em ataques, através de campos de formulários, para realizar operações em banco de dados.

Page 21: Programação Segura

SQL Injection

• Onde fica o perigo?

• Muitos programadores constroem comandos SQL (no desenvolvimento de sistemas) utilizando concatenação de strings.

• A maioria dos bancos de dados é capaz de receber um lote de comandos em uma única mensagem e executar a todos.

• Desta forma, o cracker pode modificar os comandos SQL da aplicação e fazer praticamente qualquer coisa.

Page 22: Programação Segura

SQL Injection

• Exemplo código vulnerável

Page 23: Programação Segura

SQL Injection• Solução

Page 24: Programação Segura

SQL Injection

• Principais strings de ataque:

Page 25: Programação Segura

SQL Injection

• Dicas

• Sempre faça a validação das entradas do usuário, restringindo determinados caracteres.

• As conexões que o usuário estabelece através da aplicação devem possuir restrições, deve permitir somente operações que realmente podem ser realizadas por este usuário.

Page 26: Programação Segura

SQL Injection

• Nunca culpe o usuário

Page 27: Programação Segura

Cross-Site Scripting (XSS)

• Ocorre quando um invasor usa uma aplicação Web para enviar código malicioso, geralmente na forma de um script, para um outro usuário final.

• Acontece sempre que uma aplicação Web utiliza a entrada do usuário sem validá-la.

• O navegador não tem como saber se vem de uma fonte confiável ou não => ele assume e confia no usuário fonte, permitindo que o script seja executado.

Page 28: Programação Segura

Cross-Site Scripting (XSS)

• O script malicioso pode ter acesso a qualquer cookie, tokens de sessão ou outra informação sensível retida no navegador web e usada naquele site.

• Estes scripts podem até mesmo rescrever o conteúdo da página HTML.

• Uma única aplicação na Intranet que contenha o bug pode ser utilizada como meio de inserir esse código malicioso!

Page 29: Programação Segura

Ataques XSS

• Ataques XSS podem geralmente ser classificados em duas categorias: Armazenamento e Reflexão.

• Ataques de armazenamento: o código injetado fica permanentemente armazenado nos servidores alvo (um banco de dados, em mensagem de fórum, log de visitantes, campos de comentário, etc.)

• A vítima então recupera o script malicioso do servidor quando requisita a informação armazenada.

Page 30: Programação Segura

Ataques XSS

• Ataques de reflexão: o código injetado é refletido pelo servidor web, por meio de uma mensagem de erro, resultado de procura ou qualquer outra resposta que inclua alguma ou toda entrada enviada para o servidor como parte da requisição.

• Ataques de reflexão são enviados para as vítimas através de outra rota, com por meio de mensagem de correio eletrônico ou algum outro servidor Web.

• Quando um usuário é ludibriado a clicar em um link malicioso ou submeter um formulário especialmente manipulado, o código injetado viaja para o servidor Web vulnerável, que reflete o ataque de volta para o usuário do navegador. O navegador então executa o código pois ele vem de um servidor confiável.

Page 31: Programação Segura

XSS – Consequências dos Ataques

• XSS pode causar uma variedade de problemas para o usuário final com uma extensão de severidades desde de aborrecimento até o comprometimento completo da conta.

• A maioria dos ataques severos de XSS envolve a exposição do cookie de seção do usuário, permitindo ao invasor sequestrar a sessão do usuário e se apoderar da conta.

• Outros ataques danosos incluem a exposição de arquivos do usuário, um invasor modificar um press release ou uma notícia que pode afetar as ações de uma companhia ou diminuir a confiança do consumidor.

Page 32: Programação Segura

XSS – Como se proteger• Garantir que a aplicação realize validação de todos

os cabeçalhos, cookies, strings de consulta, campos de formulário e campos escondidos (i.e., todos os parametros) contra uma rigorosa especificação do que pode ser permitido.

• Codificar a saída fornecida pelo usuário pode ajudar a derrotar as vulnerabilidades XSS previnindo scripts inseridos de serem transmitidos para usuários em formato executável.

• Política de Segurança ‘Positiva‘: especifica o que é permitido.

• 'Negativa' ou política de segurança baseada em assinaturas são difíceis de manter e possivelmente incompletas.

Page 33: Programação Segura

Dicas de Programação Segura

• Projete o programa com cuidado antes de começar. Esteja certo de que está entendendo o que você está programando. Considere o ambiente no qual ele será executado:– o comportamento de entradas e de saídas, – os arquivos usados, – os argumentos reconhecidos, – os erros encontrados nas validações –>

Importante! Tente listar todos os erros que podem ocorrer e como irá lidar com eles.

Page 34: Programação Segura

Dicas de Programação Segura

• Documente o programa antes de começar a codificá-lo. Escreva no papel a teoria das operações do código, descrevendo o que fazer e como ele vai fazer. Destaque os módulos mais complexos. – Importante! Revise o documento enquanto codifica. – Se não puder / fizer, considere escrever um manual

completo – será então possível preservar o foco no código e no que ele deve fazer.

• Faça com que a parte crítica do seu problema fique com o menor tamanho possível.

Page 35: Programação Segura

Dicas de Programação Segura

• Pense antes de adicionar novas funcionalidades simplesmente porque pode. Adicione somente quando tem necessidade. Quanto menor o tamanho do seu código, menor a possibilidade de introduzir bugs e mais você entende como o código realmente funciona.

• Tente nao reescrever funções de biblioteca padrão. Embora tenham sido encontrados bugs em funções de biblioteca padrão, é mais provável que você introduza bugs novos e ainda mais perigosos.

• Cuidado com condições de corrida. Elas podem se transformar em deadlock ou em uma falha quando duas chamadas são executadas uma perto da outra.

Page 36: Programação Segura

Fim