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
•
•
Validação dos dados no servidor
Data Tampering
•
•
•
•
•
Buffer Overflow
SQL Injection
Script Injection
Cross-Site Scripting
Dicas
Motivação
•Por quê?
Motivação
• Ataques exploram falhas de segurança
• Pequenos bugs podem derrubar sistemas
inteiros
• Empresas dependem dos sistemas de
informação
Motivação
• Aumento da qualidade
– Relacionada com a ocorrência de erros
Principais Bugs de
Segurança
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.
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.
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.
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.
Data Tampering
• Principais tipos
•
Buffer Overflow
•
Script Injection
•
SQL Injection
•
Cross-Site Scripting
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
Buffer Overflow - Consequências
• Travar um sistema
• Corromper dados
• Executar outros programas
Buffer Overflow - Exemplo
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.
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.
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
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.
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.
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.
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.
SQL Injection
• Exemplo código vulnerável
SQL Injection
• Solução
SQL Injection
• Principais strings de ataque:
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.
SQL Injection
• Nunca culpe o usuário
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.
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!
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.
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.
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.
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.
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.
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.
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.
Fim
Download

SQL Injection