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.

Cb5d9e9095cd41b636764a85e57ade4b?s=128

Nando Vieira

November 23, 2013
Tweet

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