Desenvolvimento de software seguro: como implementar os 10 controles proativos da OWASP
5 de novembro de 2020
0 minutos de leituraRecentemente, 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
Definir requisitos de segurança
Usar frameworks e bibliotecas de segurança
Proteger o acesso ao banco de dados
Codificar e escapar dados
Validar todas as entradas
Implementar identidade digital
Aplicar controles de acesso
Proteger os dados em todos os lugares
Implementar registro e monitoramento de segurança
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.

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:
DOMPurify para JavaScript
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.