[Python] Construindo aplicações web seguras [com Flask]

"[…]there are really two types of organisations — those who don’t know their code is insecure, and those that do”

OWASP, Getting Started

Por que pensar em segurança no desenvolvimento de software?

Venho aprendendo como a segurança é um requisito importante na construção de um sistema.

O que aconteceria se os dados das pessoas no Facebook fossem expostos?

Pesquisador de Segurança descobre brecha no Facebook que permitia apagar qualquer vídeo.

Facebook continua com falhas de segurança informadas há meses(2015)

Após ser ignorado, hacker invade página de Mark Zuckerberg no Facebook para mostrar falha de segurança (2013)

“Hacker do bem” descobre brecha do Facebook que possibilita invadir qualquer conta

Princípios de segurança

Quando se pensa em desenvolver aplicações seguras é necessário pensar nos princípios de segurança que cobrem decisões arquiteturais e práticas que ajudam a reduzir a possibilidade de sua aplicação ser atacada por agentes mau intencionados. Estes princípios são independentes de linguagem/tecnologia.

Alguns princípios que tangem a segurança de aplicações são:

  • Defesa em profundidade
  • Modelo de segurança positiva (whitelist)
  • Falhe seguramente
  • O mínimo de privilégios
  • Mantenha as estratégias de segurança simples
  • Detecte intrusos
  • Não confie em infraestrutura
  • Não confie em serviços (serviços de terceiros/third party)
  • Estabeleça configurações padrão de segurança

Aqui você pode encontrar mais informações sobre os princípios.

OWASP

Open Web Application Security Project (OWASP) é um grupo sem fins lucrativos focado em compilar e compartilhar informação sobre a segurança em software, para indivíduos e empresas.

Todo o conteúdo é criado pela comunidade e é aberto e livre de licença. O portal é uma ótima fonte para quem quer aprender mais sobre segurança.

O OWASP Top 10 List junta os 10 erros mais comuns e graves encontrados nas aplicações. Esta lista é fortemente recomendada quando se fala em prevenir possíveis ataques na sua aplicação.

Análise estática e dinâmica

Em segurança existem ferramentas para análise do código, procurando por partes do código que “abrem brechas” no sistema, bem como ferramentas para análise dinâmica que validam o comportamento do sistema com testes de penetração, por exemplo.

Ferramenta para análise das dependências: VersionEye

Ferramenta para análise dinâmica: OWASP Zed Attack Proxy

Outras ferramentas:

https://github.com/thoughtworks/talisman

http://gauntlt.org/

Identificando riscos e prevenindo eles com Flask

Nessa seção não irei falar de todos os riscos a que uma aplicação está suscetível. Em vez disso falarei de alguns. Para saber mais visite o site da OWASP e/ou visite os links na seção Links.

Autenticação e Autorização

Muito usado e muitas vezes mau implementado. Está na segunda posição da lista do Top 10 do OWASP.

Algumas dicas para prevenir ataques:

  • Use HTTPS
  • Single Sign On e um processo de autenticação próprio do seu sistema
  • Two factor authentication
  • Captcha
  • Bloquei o login depois de n tentativas erradas
  • Evite ter credenciais padrões mesmo que para ambiente de desenvolvimento

Flask

Temos o Flask Login para implementação da autenticação e gerenciamento de sessão. A biblioteca traz:

  • Armazenamento do ID do usuário logado na sessão e permite o logging e o logout.
  • Permite restringir views para logar ou "deslogar" usuários.
  • Lida com o normalmente complicado "remember me".
  • Ajuda a proteger a sessão do usuário prevenindo o vazamento de valores de cookies.
  • Integra-se com Flask-Principal ou outras extensões para autorização

O Flask Login possui alguns decorators para implementação cobrindo mais de uma maneira de autenticação:

  • user_loader: para seu código saber como carregar um usuário logado da sessão.
  • request_loader: recebe um request do Flask para implementação da autenticação

Gerenciamento de sessão

A implementação do gerenciamento da sessão diz respeito a como se dará a troca do session id entre o cliente e o servidor. O risco aqui é a interceptação da identidade de uma pessoa logada permitindo a pessoas não autorizadas realizarem as mesmas atividades de uma pessoa autorizada.

Para uma implementação segura:

  • Use bibliotecas e/ou opções de seu framework em vez de implementar seu próprio gerenciamento de sessão.
  • Use conexões encriptadas HTTPS durante a existência da sessão.
  • Use cookies como mecanismo para troca de session ID.

O uso do método de cookies faz uso de atributos que colaboram para uma sessão mais segura. Os atributos são: secure, httpOnly, domain, path, expire e max-age. Você pode ver mais informações sobre esses atributos na página do OWASP.

Flask

Por default Flask oferece um session no lado cliente. Para o lado servidor há outras opções, como o Flask-login e o Flask-session. Nesses últimos é possível "setar" os atributos de cookie mencionados acima.

Tratamento de dados de entrada

Os perigos podem ser de permitir a injeção de código indesejado no seu código bem como a exposição de dados para pessoas que não tem autorização para tal.

Mitigando os riscos de entradas indesejadas

Prefira usar a estratégia de whitelist (positive validation), e preferencialmente com a ajuda de seu framework.

Defina um contrato bem definido com quem vai consumir sua aplicação. Por exemplo ter documentação da sua API REST, principalmente mostrando o tipo de dado aceito. Tudo que está fora do contrato deve ser rejeitado.

Evite "sanitizar". A "sanitização" (minha tradução livre para "sanitization") usa de blacklist (negative validation) para filtrar um dado recebido. Encontrando algo invalido simplesmente só remove o dado malicioso em vez de rejeitar todo o dado recebido.

Seja cautelosa ao mostrar quando algo deu errado na validação dos dados de entrada. Mensagens de erro podem ser brechas para ataques também.

Flask

Flask-WTF

Flask-Inputs

Headers

HTTP Headers compõe as requisições e respostas HTTP. Os headers contem informação sobre o navegador, a página requisitada, o servidor, e etc. Mas também podem definir regras de segurança para o seu endpoint ou site.

O OWASP possui uma página dedicada a headers relacionados a segurança que são:

Para informações sobre cada header clique nos nomes :)

Flask

O Talisman está sobre a organização do Google Cloud Platform (se isso faz diferença para você) no Github, mas não se coloca como produto oficial da empresa.

Links

https://www.keycdn.com/blog/http-security-headers/

http://flask.pocoo.org/docs/0.11/foreword/#what-does-micro-mean

https://www.owasp.org/index.php/Category:Principle

https://github.com/OWASP/DevGuide*

https://danielmiessler.com/study/threats-vulnerabilities-risks/

https://snyk.io/blog/https-breaking-through/

https://www.veracode.com/blog/2013/12/static-testing-vs-dynamic-testing