Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Segurança no Rails

Segurança no Rails

O Rails é um framework muito mais seguro do que você imagina. Infelizmente nem todo desenvolvedor faz a sua parte para garantir que a aplicação continue assim. Nessa palestra você verá alguns vetores de ataque utilizados, porque é importante manter seu aplicativo atualizado e conhecer algumas boas práticas para minimizar as chances de ser hackeado.

Nando Vieira

November 23, 2013
Tweet

More Decks by Nando Vieira

Other Decks in Programming

Transcript

  1. Segurança no Rails

  2. @fnando

  3. @fnando UM NOVO PROJETO.

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

  5. @fnando VOCÊ COLOCA O PROJETO NO AR.

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

  7. @fnando VOCÊ ESTÁ SEGURO?

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

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

  10. 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
  11. @fnando owasp.org

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

  13. @fnando AINDA ASSIM, O RAILS TEM ALGUMAS BRECHAS.

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

  15. @fnando NESTA PALESTRA VAMOS VER ALGUMAS BRECHAS.

  16. @fnando CONFIGURAÇÃO

  17. @fnando NUNCA ARMAZENE CONFIGS NO REPOSITÓRIO.

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

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

    DEPLOY.
  20. @fnando VOCÊ PODE USAR ALGO COMO O DOTENV.

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

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

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

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

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

  26. @fnando

  27. @fnando SESSION HIJACKING

  28. @fnando O PROTOCOLO HTTP É STATELESS.

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

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

  31. @fnando ELE USA O COOKIE PARA SE IDENTIFICAR COMO O

    USUÁRIO.
  32. @fnando FORCE O USO DE SSL EM TUDO QUE EXIGE

    AUTENTICAÇÃO.
  33. @fnando Codeplane::Application.configure do config.force_ssl = true end

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

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

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

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

  38. @fnando

  39. @fnando NUNCA ARMAZENE DADOS SENSÍVEIS NO CLIENTE.

  40. @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
  41. @fnando Rack::Session::Cookie::Base64::Marshal.new .decode("BAh7CE...d6ed576495a9d") # => { # "session_id" => "abdbb7fde7dee53f83ea22247c4b0cd9",

    # "user_id" => 1234, # "_csrf_token" => "H38unAYbBFoMF7zPzY6QKQq8keS2hnE+rXf5UW3stv0=" # }
  42. @fnando NO RAILS 4 A SESSÃO É CRIPTOGRAFADA.

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

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

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

    "example.org" }
  46. @fnando OU USE SIMPLESMENTE A SESSÃO.

  47. @fnando SESSION FIXATION

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

    SEMPRE.
  49. @fnando A SESSÃO NÃO EXPIRA.

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

  51. @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
  52. @fnando USE OUTRO SESSION STORE QUE ARMAZENE AS SESSÕES ATIVAS.

  53. @fnando ISSO PERMITE INVALIDAR SESSÕES ATIVAS REMOTAMENTE.

  54. @fnando

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

  56. @fnando REDIRECTIONS

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

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

  59. @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
  60. @fnando O REFERRER PODE CONTER INFORMAÇÕES SENSÍVEIS.

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

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

  63. @fnando

  64. @fnando SQL INJECTION

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

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

  67. @fnando email = " ' OR 1) --" User.where("email =

    '#{email}'").first #=> #<User id: 1, email: "john@example.org"> ! id = "1) OR 1=1--" User.delete_all("id = #{id}")
  68. @fnando NUNCA INTERPOLE EM QUERIES SQL.

  69. @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]}%")
  70. @fnando VOCÊ AINDA NÃO ESTÁ SEGURO.

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

  72. 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

  73. @fnando ESSES MÉTODOS ACEITAM SNIPPETS DE SQL.

  74. @fnando params[:column] = <<-SQL salary) FROM users WHERE email =

    'john@example.org'; SQL ! User.calculate(:sum, params[:column]) #=> 4200
  75. @fnando FAÇA O WHITELIST DOS NOMES DE CAMPOS OU SANITIZAÇÃO.

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

  77. @fnando rails-sqli.org

  78. @fnando CROSS-SITE SCRIPTING (XSS)

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

  80. @fnando À PARTIR DO RAILS 3, O OUTPUT É SANITIZADO

    POR PADRÃO.
  81. @fnando MAS NEM TUDO É SANITIZADO.

  82. @fnando class User include ActiveModel::Model ! attr_accessor :site_url ! validates_format_of

    :site_url, with: %r[https?://[^ ]+]i end
  83. @fnando @user = User.new({ site_url: "javascript:alert('PWNED');\n//http://example.org" })

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

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

  86. @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
  87. @fnando class User < ActiveRecord::Base validates :site_url, url: true end

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

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

    COMO BUFFERS.
  90. @fnando VOCÊ PODE MARCAR BUFFERS COMO SEGUROS.

  91. @fnando text = "<p>Hello</p>" ! text.html_safe? #=> false ! text.html_safe.html_safe?

    #=> true
  92. @fnando MARCAR O BUFFER COMO SEGURO PODE SER FEITO NO

    TEMPLATE.
  93. @fnando <%= raw page.content %>

  94. @fnando UM BUFFER MARCADO COMO SEGURO RENDERIZA HTML.

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

  96. @fnando O RAILS POSSUI O MÉTODO SANITIZE.

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

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

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

  100. @fnando class Article < ActiveRecord::Base # Completely remove unsafe and/or

    # unknown tags. html_fragment :body, scrub: :prune end
  101. @fnando NÃO INTERPOLE VALORES ENVIADOS PELO USUÁRIO EM STRINGS HTML.

  102. @fnando def annotation(text) %[<em class="annotation">#{text}</em>].html_safe end def annotation(text) content_tag :em,

    text, class: "annotation" end def annotation(text) %[<em class="annotation">#{h(text)}</em>].html_safe end
  103. @fnando SOFTWARE UPDATE

  104. @fnando NUNCA USE SOFTWARE DESATUALIZADO.

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

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

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

    FICAR COM MEDO.
  108. @fnando EXISTE UMA FERRAMENTA CHAMADA METASPLOIT.

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

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

    DEVISE.
  111. @fnando EXPLOIT: SECRET TOKEN

  112. @fnando

  113. @fnando EXPLOIT: SERIALIZAÇÃO

  114. @fnando

  115. @fnando ATUALIZE SEU APLICATIVO AGORA MESMO.

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

  117. @fnando MINIMIZE O DANO E SIGA O PRINCÍPIO DE MENOR

    PRIVILÉGIO.
  118. @fnando VOCÊ NÃO PRECISA DE UM USUÁRIO SUDOER PARA O

    DEPLOY.
  119. @fnando ACEITE AUTENTICAÇÃO APENAS POR SSH.

  120. @fnando LIBERE APENAS AS PORTAS NECESSÁRIAS.

  121. @fnando REPORTS

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

  123. @fnando POR BAIXO DOS PANOS ELE USA O BRAKEMAN.

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

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

  126. @fnando FINALIZANDO

  127. @fnando SEGURANÇA É COISA SÉRIA.

  128. @fnando EXISTE MUITO MAIS DO QUE MOSTREI AQUI.

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

  130. @fnando ACOMPANHE OS PROJETOS QUE VOCÊ USA.

  131. @fnando ACOMPANHE OS SITES DE SEGURANÇA.

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

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