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

Segurança em aplicações Ruby on Rails

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.

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/