$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

  2. @fnando

    View Slide

  3. @fnando
    UM
    NOVO
    PROJETO.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. @fnando
    VOCÊ
    ESTÁ
    SEGURO?

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  11. @fnando
    owasp.org

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. @fnando
    NESTA
    PALESTRA
    VAMOS VER
    ALGUMAS
    BRECHAS.

    View Slide

  16. @fnando
    CONFIGURAÇÃO

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. @fnando

    View Slide

  27. @fnando
    SESSION
    HIJACKING

    View Slide

  28. @fnando
    O PROTOCOLO
    HTTP É
    STATELESS.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  38. @fnando

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. @fnando
    OU USE
    SIMPLESMENTE
    A SESSÃO.

    View Slide

  47. @fnando
    SESSION
    FIXATION

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  54. @fnando

    View Slide

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

    View Slide

  56. @fnando
    REDIRECTIONS

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  63. @fnando

    View Slide

  64. @fnando
    SQL INJECTION

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  68. @fnando
    NUNCA
    INTERPOLE EM
    QUERIES SQL.

    View Slide

  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]}%")

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  77. @fnando
    rails-sqli.org

    View Slide

  78. @fnando
    CROSS-SITE
    SCRIPTING (XSS)

    View Slide

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

    View Slide

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

    View Slide

  81. @fnando
    MAS NEM TUDO
    É SANITIZADO.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  91. @fnando
    text = "Hello"
    !
    text.html_safe?
    #=> false
    !
    text.html_safe.html_safe?
    #=> true

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  102. @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

    View Slide

  103. @fnando
    SOFTWARE
    UPDATE

    View Slide

  104. @fnando
    NUNCA USE
    SOFTWARE
    DESATUALIZADO.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  108. @fnando
    EXISTE UMA
    FERRAMENTA
    CHAMADA
    METASPLOIT.

    View Slide

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

    View Slide

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

    View Slide

  111. @fnando
    EXPLOIT:
    SECRET TOKEN

    View Slide

  112. @fnando

    View Slide

  113. @fnando
    EXPLOIT:
    SERIALIZAÇÃO

    View Slide

  114. @fnando

    View Slide

  115. @fnando
    ATUALIZE SEU
    APLICATIVO
    AGORA MESMO.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  121. @fnando
    REPORTS

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  126. @fnando
    FINALIZANDO

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide