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

Segurança em aplicações Ruby on Rails

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Segurança em aplicações Ruby on Rails

Demonstrarei os principais tipos de ataques em aplicações web e como evita-los em nossas aplicações Ruby on Rails. O próprio framework previne diversas delas mas ainda existem várias brechas no framework e nem todos estão cientes delas.

Avatar for Gabriel Sobrinho

Gabriel Sobrinho

October 19, 2013
Tweet

More Decks by Gabriel Sobrinho

Other Decks in Programming

Transcript

  1. Brechas de segurança • CSRF • XSS • redirect_to •

    link_to • expressões regulares • escalação de privilégio • mass assignment • css injection • img injection • sql injection • secret token • remote code injection
  2. CSRF “O CSRF ... é um tipo de exploração maliciosa

    de um website pelo qual comandos não autorizados são transmitidos de um usuário que confia no website.” - Wikipedia
  3. CSRF <!-- Adicione essa imagem no seu site para deslogar

    seus usuários do Google --> <img src=”http://www.google.com/ig/logout”>
  4. CSRF <!-- Adicione essa imagem no seu site para todos

    os usuários que acessarem te seguirem --> <img src=”http://example.com/follow?uid=?”>
  5. CSRF • Nunca use GET para requisições que mudam o

    estado da aplicação • Usar match normalmente é um sinal de arquitetura errada
  6. XSS “Cross-site scripting (XSS) é um tipo de vulnerabilidade do

    sistema de segurança de um computador, encontrado normalmente em aplicações web que activam ataques maliciosos ao injectarem client-side script dentro das páginas web vistas por outros usuários.” - Wikipedia
  7. Expressões Regulares ^$ casam com linhas novas \A\z casam com

    o texto completo Rails 4 adicionou warning/exception quando usar ^$ porque costuma ser um engano!
  8. Escalação de Privilégio “Usuário burla o sistema afim de realizar

    ações das quais ele não possui permissão”
  9. Mass Assignment • Sempre especifique no seu modelo quais atributos

    serão aceitos via mass assignment • Sempre especifique no seu controller quais atributos serão enviados ao modelo
  10. Pundit + Strong Params UserPolicy = Struct.new(:current_user, :user) do def

    permitted_attributes if current_user.admin? [:email, :password, :admin] else [:email, :password] end end end
  11. CSS Injection • Possível de ser executado apenas em alguns

    browsers (IE e Firefox) • Somente possível se a aplicação permitir o usuário definir algum estilo usando CSS
  12. CSS Injection • Garanta que a entrada de dados está

    correta para a declaração • Cuidado com o problema das expressões regulares no ruby, use \A\z ao invés de ^$
  13. SQL Injection GET /users?order=(CASE WHEN (SELECT SUBSTRING(password, 1, 1) FROM

    users WHERE id = 1) = ‘a’ THEN users.id ASC ELSE users.id DESC)
  14. SQL Injection SELECT * FROM users ORDER BY (CASE WHEN

    (SELECT SUBSTRING(password, 1, 1) FROM users WHERE id = 1) = ‘a’ THEN users.id ASC ELSE users.id DESC)
  15. SQL Injection SELECT * FROM users ORDER BY (CASE WHEN

    (SELECT SUBSTRING(password, 1, 1) FROM users WHERE id = 1) = ‘a’ THEN users.id ASC ELSE users.id DESC)
  16. SQL Injection SELECT * FROM users ORDER BY (CASE WHEN

    (SELECT SUBSTRING(password, 1, 1) FROM users WHERE id = 1) = ‘a’ THEN users.id ASC ELSE users.id DESC)
  17. SQL Injection SELECT * FROM users ORDER BY (CASE WHEN

    (SELECT SUBSTRING(password, 1, 1) FROM users WHERE id = 1) = ‘a’ THEN users.id ASC ELSE users.id DESC)
  18. SQL Injection SELECT * FROM users ORDER BY (CASE WHEN

    (SELECT SUBSTRING(password, 1, 1) FROM users WHERE id = 1) = ‘a’ THEN users.id ASC ELSE users.id DESC)
  19. SQL Injection SELECT * FROM users ORDER BY (CASE WHEN

    (SELECT SUBSTRING(password, 1, 1) FROM users WHERE id = 1) = ‘a’ THEN users.id ASC ELSE users.id DESC)
  20. SQL Injection • Garimpar a senha com (tamanho da senha)

    consultas • Se a senha for encriptada, garimpar o hash e realizar brute force externo (lento) • Se a senha usar salt, garimpar o hash e o salt e realizar brute force externo (muito lento)
  21. SQL Injection def index columns = [‘name’, ‘email’] if columns.include?(params[:column])

    @users = User.order(params[:column]) else @users = User.order(:name) end end
  22. Métodos com a mesma brecha no active record • select

    • pluck • from • joins • where • order • group • having • lock • order • reorder
  23. Métodos com a mesma brecha no active record • average

    • calculate • count • maximum • minimum • sum
  24. SQL Injection • Sempre use whitelist do que pode ser

    informado pelo usuário • ActiveRecord é um queijo suíço quando se trata de segurança!
  25. Secret Token • Permite decriptar e manipular a sessão •

    Permite execução remota de código ruby
  26. Remote Code Injection • Apache poderá executar arquivos PHP se

    estiverem na pasta pública • O mesmo acontece no nginx e/ou outras linguagens configuradas no formato mod_php
  27. Remote Code Injection • Sempre faça whitelist das extensões •

    Se por algum motivo precisar permitir arquivos “executáveis”, tenha certeza de configurar corretamente o seu servidor
  28. Recomendações • Nunca confie em dados externos (usuários) • Sempre

    use whitelist ao invés de blacklist • Nunca confie no active record! • Mantenha suas aplicações atualizadas • Mantenha seus servidores atualizados
  29. Referências • http://rails-sqli.org • http://www.tuxz.net/blog/archives/2010/11/21/sql_injection__exploiting_the_order_by_clause/ • http://jfire.io/blog/2012/04/30/how-to-securely-bootstrap-json-in-a-rails-view/ • https://speakerdeck.com/mkonda/rails-security-in-the-wild-chicago-ruby •

    https://speakerdeck.com/unativ/web-application-security-in-rails • https://speakerdeck.com/anthonylewis/rails-application-security • https://speakerdeck.com/homakov/rails-and-security • http://daniel.fone.net.nz/blog/2013/05/20/a-better-way-to-manage-the-rails-secret-token/