Slide 1

Slide 1 text

Segurança no Rails

Slide 2

Slide 2 text

@fnando

Slide 3

Slide 3 text

@fnando UM NOVO PROJETO.

Slide 4

Slide 4 text

@fnando MUITO TRABALHO, MAS VOCÊ TENTA FAZER O MELHOR.

Slide 5

Slide 5 text

@fnando VOCÊ COLOCA O PROJETO NO AR.

Slide 6

Slide 6 text

@fnando VOCÊ SABE QUE É APENAS O COMEÇO.

Slide 7

Slide 7 text

@fnando VOCÊ ESTÁ SEGURO?

Slide 8

Slide 8 text

@fnando 75% DOS ATAQUES ESTÃO NA CAMADA DA APLICAÇÃO.

Slide 9

Slide 9 text

@fnando BRECHAS DE SEGURANÇA PODEM ACABAR COM A SUA CREDIBILIDADE.

Slide 10

Slide 10 text

Injection Broken Authentication & Session Management Cross-Site Scripting (XSS) Insecure Direct Object References Security Misconfiguration Sensitive Data Exposure Missing Function Level Access Control Cross-Site Request Forgery (CSRF) Using Components with Known Vulnerability Unvalidated Redirects and Forwards OWASP — TOP 10 2013

Slide 11

Slide 11 text

@fnando owasp.org

Slide 12

Slide 12 text

@fnando O RAILS É BEM SEGURO POR PADRÃO.

Slide 13

Slide 13 text

@fnando AINDA ASSIM, O RAILS TEM ALGUMAS BRECHAS.

Slide 14

Slide 14 text

@fnando E OUTRAS BRECHAS SÃO INTRODUZIDAS PELOS DEVS.

Slide 15

Slide 15 text

@fnando NESTA PALESTRA VAMOS VER ALGUMAS BRECHAS.

Slide 16

Slide 16 text

@fnando CONFIGURAÇÃO

Slide 17

Slide 17 text

@fnando NUNCA ARMAZENE CONFIGS NO REPOSITÓRIO.

Slide 18

Slide 18 text

@fnando SE VOCÊ USA HEROKU, USE VARIÁVEIS DE AMBIENTE.

Slide 19

Slide 19 text

@fnando OU COPIE O ARQUIVO DE CONFIG NA HORA DO DEPLOY.

Slide 20

Slide 20 text

@fnando VOCÊ PODE USAR ALGO COMO O DOTENV.

Slide 21

Slide 21 text

@fnando source "http://rubygems.org" gem "dotenv-rails"

Slide 22

Slide 22 text

@fnando # .env.development PORT=3000 API_KEY=abc REDIS_URL=redis://localhost DEFAULT_URL=http://hellobits.com

Slide 23

Slide 23 text

@fnando ISSO INCLUI O SECRET TOKEN DA APLICAÇÃO.

Slide 24

Slide 24 text

@fnando SEU SECRET TOKEN É UMA CHAVE PARA SEU SERVIDOR.

Slide 25

Slide 25 text

@fnando NO GITHUB, É POSSÍVEL ENCONTRAR MUITOS APPS VULNERÁVEIS.

Slide 26

Slide 26 text

@fnando

Slide 27

Slide 27 text

@fnando SESSION HIJACKING

Slide 28

Slide 28 text

@fnando O PROTOCOLO HTTP É STATELESS.

Slide 29

Slide 29 text

@fnando USO DE COOKIES PARA FAZER A IDENTIFICAÇÃO DO USUÁRIO.

Slide 30

Slide 30 text

@fnando UM ATACANTE PODE ROUBAR O COOKIE DE UM USUÁRIO.

Slide 31

Slide 31 text

@fnando ELE USA O COOKIE PARA SE IDENTIFICAR COMO O USUÁRIO.

Slide 32

Slide 32 text

@fnando FORCE O USO DE SSL EM TUDO QUE EXIGE AUTENTICAÇÃO.

Slide 33

Slide 33 text

@fnando Codeplane::Application.configure do config.force_ssl = true end

Slide 34

Slide 34 text

@fnando EXPIRE A SESSÃO EM CASO DE INATIVIDADE.

Slide 35

Slide 35 text

@fnando Codeplane::Application.config.session_store :cookie_store, key: "_codeplane_session", expire_after: 1.hour

Slide 36

Slide 36 text

@fnando MARQUE COOKIES COM A OPÇÃO HTTP ONLY.

Slide 37

Slide 37 text

@fnando MARQUE COOKIES COM A OPÇÃO SECURE.

Slide 38

Slide 38 text

@fnando

Slide 39

Slide 39 text

@fnando NUNCA ARMAZENE DADOS SENSÍVEIS NO CLIENTE.

Slide 40

Slide 40 text

@fnando $ http http://localhost:9292/ HTTP/1.1 200 OK Cache-Control: max-age=0, private, must-revalidate Connection: Keep-Alive Content-Length: 1313 Content-Type: text/html; charset=utf-8 Date: Fri, 27 Sep 2013 23:41:57 GMT Etag: "b313808d614f80d3d28848edf101ef4b" Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-06-27) Set-Cookie: _rails3-app_session=BAh7CEki...3Npa9d; path=/; HttpOnly X-Request-Id: c0f73c4949d60ef75c3d1d8fdf5c15d5 X-Runtime: 0.054038 X-Ua-Compatible: IE=Edge

Slide 41

Slide 41 text

@fnando Rack::Session::Cookie::Base64::Marshal.new .decode("BAh7CE...d6ed576495a9d") # => { # "session_id" => "abdbb7fde7dee53f83ea22247c4b0cd9", # "user_id" => 1234, # "_csrf_token" => "H38unAYbBFoMF7zPzY6QKQq8keS2hnE+rXf5UW3stv0=" # }

Slide 42

Slide 42 text

@fnando NO RAILS 4 A SESSÃO É CRIPTOGRAFADA.

Slide 43

Slide 43 text

@fnando Rack::Session::Cookie::Base64::Marshal.new .decode("aTMwT1dj...K1VGMX8c2") # => nil

Slide 44

Slide 44 text

@fnando USE COOKIES ASSINADOS, COM DOMÍNIO RESTRITO.

Slide 45

Slide 45 text

@fnando cookies.signed[:name] = { httponly: true, value: "John Doe", domain: "example.org" }

Slide 46

Slide 46 text

@fnando OU USE SIMPLESMENTE A SESSÃO.

Slide 47

Slide 47 text

@fnando SESSION FIXATION

Slide 48

Slide 48 text

@fnando UM ATACANTE USA A SESSÃO DE UM USUÁRIO PARA SEMPRE.

Slide 49

Slide 49 text

@fnando A SESSÃO NÃO EXPIRA.

Slide 50

Slide 50 text

@fnando E UMA NOVA SESSÃO NÃO É INICIADA.

Slide 51

Slide 51 text

@fnando class SessionsController < ApplicationController def create user = User.find_by_email(params[:email]) if user && user.authenticate(params[:password]) reset_session session[:user_id] = user.id redirect_to dashboard_path else render :new end end end

Slide 52

Slide 52 text

@fnando USE OUTRO SESSION STORE QUE ARMAZENE AS SESSÕES ATIVAS.

Slide 53

Slide 53 text

@fnando ISSO PERMITE INVALIDAR SESSÕES ATIVAS REMOTAMENTE.

Slide 54

Slide 54 text

@fnando

Slide 55

Slide 55 text

@fnando O ACTIVE RECORD POSSUI UM ADAPTER PARA SESSION STORE.

Slide 56

Slide 56 text

@fnando REDIRECTIONS

Slide 57

Slide 57 text

@fnando O ATACANTE PODE USAR A ENTRADA DE URL PARA PHISHING.

Slide 58

Slide 58 text

@fnando return_url = ReturnUrl.new(dashboard_path) .return_url(params[:return_to]) ! redirect_to return_url

Slide 59

Slide 59 text

@fnando class ReturnUrl attr_reader :default_url def initialize(default_url) @default_url = default_url end ! def return_url(url) return default_url if url.blank? ! uri = URI.parse(url) path = uri.path path << "?#{uri.query}" if uri.query path << "##{uri.fragment}" if uri.fragment path end end

Slide 60

Slide 60 text

@fnando O REFERRER PODE CONTER INFORMAÇÕES SENSÍVEIS.

Slide 61

Slide 61 text

@fnando FAÇA O REDIRECT À PARTIR DE UMA PÁGINA ESPECÍFICA.

Slide 62

Slide 62 text

@fnando PODE SER UMA BOA IDEIA AVISAR O USUÁRIO.

Slide 63

Slide 63 text

@fnando

Slide 64

Slide 64 text

@fnando SQL INJECTION

Slide 65

Slide 65 text

@fnando UM ATACANTE PODE INJETAR SQL À PARTIR DE PARÂMETROS.

Slide 66

Slide 66 text

@fnando User.where("role = #{params[:role]}")

Slide 67

Slide 67 text

@fnando email = " ' OR 1) --" User.where("email = '#{email}'").first #=> # ! id = "1) OR 1=1--" User.delete_all("id = #{id}")

Slide 68

Slide 68 text

@fnando NUNCA INTERPOLE EM QUERIES SQL.

Slide 69

Slide 69 text

@fnando # Using a hash User.where(email: params[:email]) ! # Using placeholders User.where("name LIKE ?", "%#{params[:name]}%") ! # Using named placeholders User.where("name LIKE :name", name: "%#{params[:name]}%")

Slide 70

Slide 70 text

@fnando VOCÊ AINDA NÃO ESTÁ SEGURO.

Slide 71

Slide 71 text

@fnando MUITOS MÉTODOS DO ACTIVE RECORD PODEM SER PERIGOSOS.

Slide 72

Slide 72 text

Métodos potencialmente perigosos ActiveRecord::Base#average ActiveRecord::Base#count ActiveRecord::Base#maximum ActiveRecord::Base#minimum ActiveRecord::Base#sum ActiveRecord::Base.exists? ActiveRecord::Base.pluck

Slide 73

Slide 73 text

@fnando ESSES MÉTODOS ACEITAM SNIPPETS DE SQL.

Slide 74

Slide 74 text

@fnando params[:column] = <<-SQL salary) FROM users WHERE email = '[email protected]'; SQL ! User.calculate(:sum, params[:column]) #=> 4200

Slide 75

Slide 75 text

@fnando FAÇA O WHITELIST DOS NOMES DE CAMPOS OU SANITIZAÇÃO.

Slide 76

Slide 76 text

@fnando column = ActiveRecord::Base.connection.quote(params[:column]) User.calculate(:sum, params[:column]) #=> 0.0

Slide 77

Slide 77 text

@fnando rails-sqli.org

Slide 78

Slide 78 text

@fnando CROSS-SITE SCRIPTING (XSS)

Slide 79

Slide 79 text

@fnando NUNCA CONFIE EM DADOS ENVIADOS PELOS USUÁRIOS.

Slide 80

Slide 80 text

@fnando À PARTIR DO RAILS 3, O OUTPUT É SANITIZADO POR PADRÃO.

Slide 81

Slide 81 text

@fnando MAS NEM TUDO É SANITIZADO.

Slide 82

Slide 82 text

@fnando class User include ActiveModel::Model ! attr_accessor :site_url ! validates_format_of :site_url, with: %r[https?://[^ ]+]i end

Slide 83

Slide 83 text

@fnando @user = User.new({ site_url: "javascript:alert('PWNED');\n//http://example.org" })

Slide 84

Slide 84 text

@fnando <%= link_to "Visite site", @user.site_url %>

Slide 85

Slide 85 text

@fnando ANALIZE A URL, VALIDANDO O PROTOCOLO E HOSTNAME.

Slide 86

Slide 86 text

@fnando require "active_model" require "uri" ! class UrlValidator < ActiveModel::EachValidator PROTOCOLS = %w[http https] ! def validate_each(record, attribute, value) uri = URI.parse(value) valid = PROTOCOLS.include?(uri.scheme) rescue URI::InvalidURIError valid = false ensure record.errors.add(attribute, :invalid_url) unless valid end end

Slide 87

Slide 87 text

@fnando class User < ActiveRecord::Base validates :site_url, url: true end

Slide 88

Slide 88 text

@fnando SANITIZAÇÃO É IMPORTANTE, MAS ÀS VEZES QUEREMOS TER CONTROLE.

Slide 89

Slide 89 text

@fnando À PARTIR DO RAILS 3, AS STRINGS SÃO CRIADAS COMO BUFFERS.

Slide 90

Slide 90 text

@fnando VOCÊ PODE MARCAR BUFFERS COMO SEGUROS.

Slide 91

Slide 91 text

@fnando text = "

Hello

" ! text.html_safe? #=> false ! text.html_safe.html_safe? #=> true

Slide 92

Slide 92 text

@fnando MARCAR O BUFFER COMO SEGURO PODE SER FEITO NO TEMPLATE.

Slide 93

Slide 93 text

@fnando <%= raw page.content %>

Slide 94

Slide 94 text

@fnando UM BUFFER MARCADO COMO SEGURO RENDERIZA HTML.

Slide 95

Slide 95 text

@fnando SE FOR RENDERIZAR CONTEÚDO DO USUÁRIO, SANITIZE-O.

Slide 96

Slide 96 text

@fnando O RAILS POSSUI O MÉTODO SANITIZE.

Slide 97

Slide 97 text

@fnando OU USE O LOOFAH. http://fnando.me/o7

Slide 98

Slide 98 text

@fnando O LOOFAH DEVE ENTRAR NO RAILS EM BREVE. http://fnando.me/o6

Slide 99

Slide 99 text

@fnando O LOOFAH PODE SER INTEGRADO AO ACTIVE RECORD. http://fnando.me/o5

Slide 100

Slide 100 text

@fnando class Article < ActiveRecord::Base # Completely remove unsafe and/or # unknown tags. html_fragment :body, scrub: :prune end

Slide 101

Slide 101 text

@fnando NÃO INTERPOLE VALORES ENVIADOS PELO USUÁRIO EM STRINGS HTML.

Slide 102

Slide 102 text

@fnando def annotation(text) %[#{text}].html_safe end def annotation(text) content_tag :em, text, class: "annotation" end def annotation(text) %[#{h(text)}].html_safe end

Slide 103

Slide 103 text

@fnando SOFTWARE UPDATE

Slide 104

Slide 104 text

@fnando NUNCA USE SOFTWARE DESATUALIZADO.

Slide 105

Slide 105 text

@fnando APLIQUE AS ATUALIZAÇÕES DE SEGURANÇA O MAIS RÁPIDO POSSÍVEL.

Slide 106

Slide 106 text

@fnando O RAILS TEVE DIVERSOS RELEASES COM CORREÇÕES IMPORTANTES.

Slide 107

Slide 107 text

@fnando SE VOCÊ NÃO ATUALIZA SEU APLICATIVO, É HORA DE FICAR COM MEDO.

Slide 108

Slide 108 text

@fnando EXISTE UMA FERRAMENTA CHAMADA METASPLOIT.

Slide 109

Slide 109 text

@fnando ELA POSSUI EXPLOITS PARA AS FALHAS MAIS CONHECIDAS DO RAILS.

Slide 110

Slide 110 text

@fnando POSSUI ATÉ EXPLOIT PARA UMA FALHA DE SEGURANÇA DO DEVISE.

Slide 111

Slide 111 text

@fnando EXPLOIT: SECRET TOKEN

Slide 112

Slide 112 text

@fnando

Slide 113

Slide 113 text

@fnando EXPLOIT: SERIALIZAÇÃO

Slide 114

Slide 114 text

@fnando

Slide 115

Slide 115 text

@fnando ATUALIZE SEU APLICATIVO AGORA MESMO.

Slide 116

Slide 116 text

@fnando E ATUALIZE TODO E QUALQUER SOFTWARE QUE VOCÊ USA.

Slide 117

Slide 117 text

@fnando MINIMIZE O DANO E SIGA O PRINCÍPIO DE MENOR PRIVILÉGIO.

Slide 118

Slide 118 text

@fnando VOCÊ NÃO PRECISA DE UM USUÁRIO SUDOER PARA O DEPLOY.

Slide 119

Slide 119 text

@fnando ACEITE AUTENTICAÇÃO APENAS POR SSH.

Slide 120

Slide 120 text

@fnando LIBERE APENAS AS PORTAS NECESSÁRIAS.

Slide 121

Slide 121 text

@fnando REPORTS

Slide 122

Slide 122 text

@fnando O CODE CLIMATE INFORMA SOBRE FALHAS DE SEGURANÇA.

Slide 123

Slide 123 text

@fnando POR BAIXO DOS PANOS ELE USA O BRAKEMAN.

Slide 124

Slide 124 text

@fnando INTEGRE-O EM SEU BUILD DO CONTINUOUS INTEGRATION.

Slide 125

Slide 125 text

@fnando OU ADICIONE-O NA PIPELINE DE EXECUÇÃO DOS TESTES.

Slide 126

Slide 126 text

@fnando FINALIZANDO

Slide 127

Slide 127 text

@fnando SEGURANÇA É COISA SÉRIA.

Slide 128

Slide 128 text

@fnando EXISTE MUITO MAIS DO QUE MOSTREI AQUI.

Slide 129

Slide 129 text

@fnando SEGURANÇA DEVE SER UMA PREOCUPAÇÃO CONSTANTE.

Slide 130

Slide 130 text

@fnando ACOMPANHE OS PROJETOS QUE VOCÊ USA.

Slide 131

Slide 131 text

@fnando ACOMPANHE OS SITES DE SEGURANÇA.

Slide 132

Slide 132 text

@fnando É A SUA CREDIBILIDADE QUE ESTÁ EM JOGO.

Slide 133

Slide 133 text

@fnando OBRIGADO. http://fnando.me/rx