O OWASP Top 10, 2025
Trabalho de segurança sem um arcabouço é uma lista das coisas de que você por acaso lembrou. O OWASP Top 10 é o arcabouço que a maior parte do setor usa. É uma lista ordenada das categorias de fraqueza que causam vazamentos, revisada a cada poucos anos a partir de dados reais.
A versão atual é a de 2025, e não é a lista que você talvez tenha decorado:
| Categoria | |
|---|---|
| A01:2025 | Broken Access Control |
| A02:2025 | Security Misconfiguration |
| A03:2025 | Software Supply Chain Failures |
| A04:2025 | Cryptographic Failures |
| A05:2025 | Injection |
| A06:2025 | Insecure Design |
| A07:2025 | Authentication Failures |
| A08:2025 | Software or Data Integrity Failures |
| A09:2025 | Security Logging and Alerting Failures |
| A10:2025 | Mishandling of Exceptional Conditions |
Repare em duas entradas antes de tudo, porque dizem o que mudou no jeito como software é atacado.
A03, Software Supply Chain Failures, é o antigo "componentes com vulnerabilidades conhecidas" crescido em algo bem maior. Agora ele cobre "breakdowns or other compromises in the process of building, distributing, or updating software": as suas dependências, mas também a sua CI, o seu armazenamento de artefatos e o seu próprio notebook. A aula 5 é sobre isso. Ele subiu na lista porque os ataques agora miram as máquinas que constroem software, e não só o software.
A10, Mishandling of Exceptional Conditions, é novo. Ele cobre o que acontece quando a sua aplicação não sabe o que fazer. Exemplos são erros que falham abrindo a porta, mensagens de exceção que vazam detalhes internos, operações de vários passos sem rollback. O resumo do próprio documento é a frase para guardar: "Any time an application is unsure of its next instruction, an exceptional condition has been mishandled."
O que o Rails te dá, e o que não
Boa parte dessa lista é tratada pelo framework se você ficar nos caminhos que ele oferece.
| Categoria | Contribuição do Rails |
|---|---|
| A05 Injection | Consultas parametrizadas, views escapadas por padrão |
| A04 Cryptographic Failures | has_secure_password, credenciais criptografadas, force_ssl |
| A08 Integrity Failures | Cookies assinados, Gemfile.lock, proteção CSRF |
| A02 Misconfiguration | Padrões sensatos de produção, filter_parameters |
| A01 Broken Access Control | Nada. Esta é inteiramente sua |
Essa última linha é por que A01 é a primeira da lista e por que a aula 2 é sobre ela. O Rails deixa alegremente um controller carregar qualquer registro por id para qualquer pessoa. O motivo é que decidir quem pode ver o quê é uma pergunta de domínio e o framework não tem opinião sobre o seu domínio.
flowchart TB
R["Padrões do Rails"] --> I["Injeção: quase tudo tratado"]
R --> C["Criptografia: quase tudo tratado"]
R --> M["Configuração: bons padrões, fáceis de desfazer"]
R -.->|"nada"| AC["Controle de acesso: inteiramente seu"]
AC --> D["As suas políticas de domínio decidem quem pode o quê"]
Onde esta aplicação já está
Este repositório fez várias dessas coisas de propósito, e elas valem ser lidas como exemplos e não como lista de conferência.
A política de senha mora num lugar só, Auth::PasswordPolicy, com os limites de tamanho e um formato exigindo minúscula, maiúscula, dígito e símbolo. Uma definição, usada pelo model, pela view e pelo medidor de força: A07 tratado como decisão de design em vez de três cópias que se afastam.
A enumeração de pessoas é defendida de um jeito incomum e correto. O Identity::User define a mensagem de unicidade como "is not available" em vez do padrão do Rails, "has already been taken":
validates :email_address, uniqueness: { case_sensitive: false, message: "is not available" }
A mensagem padrão conta a quem ataca que um endereço está cadastrado. A substituta não conta, e não custa nada.
O transporte é coberto por force_ssl, assume_ssl e o comportamento de cookie seguro do curso de SSL.
As dependências recebem alguma atenção: o Dependabot abre pull requests de atualização para gems e GitHub Actions, e a CI roda bin/importmap audit nos pacotes JavaScript fixados. O outro scanner da CI, o bin/brakeman, confere o código da própria aplicação, não as dependências. Esse é o começo de A03, não o fim.
O objetivo de uma lista
O Top 10 não é uma certificação e não é suficiente. Ele é bom para cobertura: impede que o trabalho de segurança seja a lista de coisas que você acha interessantes. Também dá ao time um vocabulário comum sobre o que vale discutir.
Um jeito útil de segurá-lo: a maioria dos vazamentos é entediante. São checagens de acesso faltando, um padrão mal configurado, uma dependência que ninguém atualizou. Os ataques interessantes viram notícia justamente por serem raros. Um time que gasta a atenção ali enquanto publica um controller sem checagem de propriedade otimizou para a distribuição errada.
O que este curso cobre
- O OWASP Top 10, 2025 (esta aula).
- Controle de acesso quebrado, em Rails.
- Injeção e as formas modernas dela.
- Autenticação e sessões.
- Cadeia de suprimentos e dependências.
- Configuração, segredos e falhar com segurança.
- Juntando tudo: auditando esta aplicação.
Pontos-chave
- A versão atual é o OWASP Top 10:2025, com Broken Access Control em primeiro e Security Misconfiguration em segundo.
- A03 agora é Software Supply Chain Failures: todo o processo de construir e distribuir, não só gems desatualizadas.
- A10, Mishandling of Exceptional Conditions, é novo: falhar abrindo, vazar detalhes internos e operações sem rollback.
- O Rails cuida de boa parte de injeção, criptografia e integridade por padrão; de controle de acesso ele não cuida.
- Este repositório já aplica uma política de senha única e mensagens de unicidade que não enumeram pessoas.
Continue com a aula 2
Controle de acesso quebrado, em Rails
Mostra como dar escopo à consulta pela pessoa atual, proteger rotas de admin, revisar listas de permit e testar recusas.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.