Skip to main content

Desenvolvimento de software seguro: como implementar os 10 controles proativos da OWASP

Escrito por

5 de novembro de 2020

0 minutos de leitura

Recentemente, relembrei uma ótima sessão de abertura da comunidade DevSecCon que tivemos no ano passado, com ninguém menos que Jim Manico.

Nessa sessão, Jim apresentou a lista dos 10 controles proativos da OWASP e explicou como incorporá-los às aplicações web. O documento sobre controles proativos, escrito pelo próprio Manico, junto com Katy Anton e Jim Bird, oferece uma visão geral de segurança para desenvolvedores que querem começar a trabalhar com segurança web, entender as diferentes camadas de riscos e saber como se proteger contra eles.

Se você achou o tema interessante, continue lendo para conhecer, um por um, os 10 controles proativos da OWASP!

10 controles proativos da OWASP 2020

  1. Definir requisitos de segurança

  2. Usar frameworks e bibliotecas de segurança

  3. Proteger o acesso ao banco de dados

  4. Codificar e escapar dados

  5. Validar todas as entradas

  6. Implementar identidade digital

  7. Aplicar controles de acesso

  8. Proteger os dados em todos os lugares

  9. Implementar registro e monitoramento de segurança

  10. Tratar todos os erros e exceções

Controle proativo 1 da OWASP — definir requisitos de segurança

A criação de um produto seguro começa pela definição dos requisitos de segurança que precisamos considerar. Assim como os requisitos de negócio ajudam a dar forma ao produto, os requisitos de segurança garantem que a segurança seja considerada desde o início.

Um importante projeto da OWASP, chamado Application Security Verification Standard — geralmente conhecido pela sigla OWASP ASVS — reúne mais de duzentos requisitos para criar softwares seguros para aplicações web.

O documento lista requisitos de segurança como protocolos de autenticação, gerenciamento de sessões e padrões de segurança criptográfica. Mais importante ainda, o ASVS oferece uma abordagem em etapas para implementar os requisitos de segurança gradualmente, desde os primeiros passos.

Matriz ASVS codificada por cores que mostra a aplicabilidade, a implementação, a implantação e as atividades de garantia nos níveis 1, 2 e 3.

Fonte: GitHub

Controle proativo 2 da OWASP — usar frameworks e bibliotecas de segurança

Quais ferramentas podem ajudar você a desenvolver software seguro?

A lista vai desde a proteção contra ataques de injeção até autenticação, APIs criptográficas seguras e armazenamento de dados confidenciais, entre outros. Para lidar com essas questões, use bibliotecas de segurança criadas especificamente para esse fim.

Monitore o uso de bibliotecas de código aberto e mantenha um inventário de versões, licenças e vulnerabilidades, como as 10 principais vulnerabilidades da OWASP, usando ferramentas como OWASP’s Dependency Check ou Snyk.

Controle proativo 3 da OWASP — proteger o acesso ao banco de dados

Os bancos de dados costumam ser componentes essenciais para criar aplicações web completas, já que elas precisam manter estado e persistir dados.

A segurança de bancos de dados abrange diversas áreas, incluindo

  • a proteção contra injeções de SQL por meio de técnicas como a vinculação de parâmetros. Também é muito importante monitorar vulnerabilidades em bibliotecas de ORM e SQL que você usa, como vimos no caso recente da vulnerabilidade a ataques de injeção de SQL na biblioteca npm Sequelize ORM.

  • autenticação segura e robusta do banco de dados, além de uma configuração adequada.

  • comunicação segura entre o banco de dados e o cliente.

Quer saber mais sobre ataques de injeção de SQL e por que eles representam um risco à segurança? Jim compartilhou algumas dicas em bobby-tables.com.

Controle proativo 4 da OWASP — codificar e escapar dados

Sempre trate os dados como não confiáveis, pois eles podem vir de diferentes fontes que nem sempre conhecemos bem.

As vulnerabilidades de cross-site scripting (XSS) são um ótimo exemplo de como os dados podem percorrer o sistema e acabar executando código malicioso no contexto de um navegador, como JavaScript, comprometendo-o.

Outro exemplo que exige o escape de dados é a injeção de comandos no sistema operacional (SO), em que um componente pode executar comandos do sistema recebidos pela entrada do usuário, com o risco de executar comandos maliciosos.

Estou buscando dados no banco de dados. Devo escapar esses dados? Um desenvolvedor seguro certamente faria isso. É inviável rastrear e marcar se uma string armazenada no banco de dados foi comprometida ou não. Em vez disso, implemente controles adequados na camada de apresentação, como o navegador, para escapar todos os dados recebidos.

Uma exceção extrema a essa regra ocorre quando você decide criar um ou mais elementos DOM de uma página web a partir de dados do banco de dados. Nesse caso, você está entrando em terreno perigoso e deve pensar cuidadosamente no seu modelo e nos controles que podem ajudar a reduzir os riscos envolvidos.

Confira algumas bibliotecas que podem ajudar na sanitização de dados:

Vale lembrar que o projeto OWASP ESAPI está sem manutenção ativa há algum tempo, então é melhor buscar outras soluções.

Por fim, escrevemos sobre injeção de comandos: como funciona, quais são os riscos e como evitá-la. Recomendo muito essa leitura como próximo passo.

Controle proativo 5 da OWASP — validar todas as entradas

Assim como você costuma usar um sistema de tipos, como o TypeScript, para garantir que as variáveis esperadas e válidas sejam passadas pelo código, também deve validar se as entradas recebidas correspondem às expectativas ou aos modelos de dados.

Orientações gerais:

  • Não confie na validação como medida de proteção para escapar dados: esses controles de segurança não são intercambiáveis.

  • Ao validar entradas de dados, procure definir limites de tamanho para todos os tipos de entrada.

Controle proativo 6 da OWASP — implementar identidade digital

Como identificar a identidade de um usuário? A resposta está em controles de segurança como autenticação, comprovação de identidade, gerenciamento de sessões e outros.

Para tomar essas decisões, você pode criar sua própria solução: gerenciar o cadastro de usuários e armazenar senhas ou outros meios de autenticação. Como alternativa, pode optar por serviços gerenciados e aproveitar a arquitetura serverless da nuvem em serviços como o Auth0.

Esse é um tema amplo. Quando precisar verificar se uma camada de identidade digital está sendo tratada com segurança, consulte as diretrizes de identidade digital do NIST 800-63-3B. O documento do NIST ajuda a definir como lidar com a segurança de senhas.

Controle proativo 7 da OWASP — aplicar controles de acesso

É muito provável que os requisitos de controle de acesso se apliquem a várias camadas da sua aplicação. Por exemplo, ao buscar dados no banco de dados de uma aplicação SaaS multi-inquilino, é preciso garantir que os dados de diferentes usuários não sejam expostos por acidente. Outro exemplo é determinar quem tem autorização para acessar as APIs oferecidas pela aplicação web.

Uma dica de Jim é evitar usar, no código, dados relacionados a funções para controlar o acesso, pois isso leva à codificação direta das políticas de acesso. Por exemplo, pense em verificações como if (user.role === 'admin'). Em vez disso, uma abordagem baseada em recursos, como o controle de acesso baseado em permissões, não impõe a política em si. Um exemplo seria if (user.canDelete(blogPostId).

Controle proativo 8 da OWASP — proteger os dados em todos os lugares

No aplicativo da Snyk, lidamos com os dados dos nossos usuários e os nossos próprios. Por isso, é essencial cuidar da segurança e da privacidade da aplicação e protegê-la em todos os pontos necessários.

Ao lidar com dados, considere as seguintes ações:

  • Proteja os dados em trânsito usando HTTPS configurado corretamente e protocolos de segurança atualizados, como TLS 1.3, além de cifras criptográficas robustas.

  • Use cabeçalhos HTTP seguros que aproveitam os recursos de segurança do navegador, como HTTP Strict Transport Security (HSTS), e defina uma Content Security Policy (CSP) para garantir a confiabilidade dos dados.

  • Ao realizar tarefas relacionadas à criptografia, use sempre bibliotecas conhecidas e não crie suas próprias implementações.

Controle proativo 9 da OWASP — implementar registro e monitoramento de segurança

Como desenvolvedores de aplicações, estamos acostumados a registrar dados que ajudam a depurar e rastrear problemas relacionados a fluxos de negócio incorretos ou exceções. Os registros voltados à segurança são outro tipo de dado que devemos manter para criar uma trilha de auditoria que ajude a investigar violações e outros problemas de segurança.

Confira algumas sugestões para registros de segurança:

  • todas as falhas na validação de entradas

  • todos os eventos de autenticação, incluindo senhas corretas e incorretas, logins e dados relacionados a sessões

  • todas as falhas de controle de acesso, como tentativas de elevação de privilégios

Controle proativo 10 da OWASP — tratar todos os erros e exceções

Tratar corretamente erros e exceções em aplicações web não é importante apenas para a saúde da aplicação: também ajuda a evitar o vazamento de dados confidenciais.

Siga estas orientações:

  • Gerencie todas as exceções de forma centralizada.

  • Garanta que comportamentos não tratados sejam detectados e tratados corretamente, seguindo uma metodologia padronizada em toda a aplicação.

  • Garanta que os dados registrados não incluam informações confidenciais, como rastreamentos de pilha ou códigos de erro criptográficos.

Participe da comunidade DevSecCon

Convido você a participar da comunidade DevSecCon e aprender mais com nossos webinars e com a Snyk User Community online, que ajudam desenvolvedores a se aprofundar em segurança e escrever código seguro!

Comece a participar de desafios de Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo sob demanda ao nosso workshop virtual introdutório.