A01:2025 – Controle de Acesso Quebrado (Broken Access Control) 
Contexto
Mantendo sua posição nº 1 no Top 10, foi constatado que 100% das aplicações testadas apresentavam alguma forma de controle de acesso quebrado. As CWEs notáveis incluídas são CWE-200: Exposure of Sensitive Information to an Unauthorized Actor, CWE-201: Exposure of Sensitive Information Through Sent Data, CWE-918 Server-Side Request Forgery (SSRF) e CWE-352: Cross-Site Request Forgery (CSRF). Esta categoria possui o maior número de ocorrências nos dados contribuídos e o segundo maior número de CVEs relacionadas.
Tabela de Pontuação
| CWEs Mapeadas | Taxa Máx. de Incidência | Taxa Média de Incidência | Cobertura Máxima | Cobertura Média | Exploit Médio Ponderado | Impacto Médio Ponderado | Total de Ocorrências | Total de CVEs |
| 40 | 20.15% | 3.74% | 100.00% | 42.93% | 7.04 | 3.84 | 1,839,701 | 32,654 |
Descrição
O controle de acesso aplica políticas para que os usuários não possam agir fora de suas permissões pretendidas. As falhas normalmente levam à divulgação não autorizada de informações, modificação ou destruição de todos os dados, ou à execução de uma função de negócio fora dos limites do usuário. Vulnerabilidades comuns de controle de acesso incluem:
- Violação do princípio do menor privilégio (least privilege), comumente conhecido como "negar por padrão" (deny by default), onde o acesso deveria ser concedido apenas para capacidades, papéis ou usuários específicos, mas está disponível para qualquer pessoa.
- Bypass de verificações de controle de acesso ao modificar a URL (manipulação de parâmetros ou navegação forçada), o estado interno da aplicação ou a página HTML, ou ao utilizar uma ferramenta de ataque que modifica requisições de API.
- Permitir a visualização ou edição da conta de outra pessoa ao fornecer seu identificador exclusivo (IDOR – Insecure Direct Object References).
- Uma API acessível com falta de controles de acesso para POST, PUT e DELETE.
- Elevação de privilégio. Agir como um usuário sem estar logado ou obter privilégios além dos esperados para o usuário logado (ex: acesso de administrador).
- Manipulação de metadados, como o reuso (replaying) ou adulteração de um token de controle de acesso JWT (JSON Web Token), um cookie ou campo oculto manipulado para elevar privilégios, ou abuso da invalidação de JWT.
- Configuração incorreta de CORS que permite acesso à API a partir de origens não autorizadas ou não confiáveis.
- Navegação forçada (force browsing ou adivinhação de URLs) para páginas autenticadas como um usuário não autenticado ou para páginas privilegiadas como um usuário comum.
Como Prevenir
O controle de acesso só é eficaz quando implementado em código confiável no lado do servidor ou em APIs serverless, onde o atacante não pode modificar a verificação de controle de acesso ou os metadados.
- Exceto para recursos públicos, negue por padrão (deny by default).
- Implemente mecanismos de controle de acesso uma única vez e reutilize-os em toda a aplicação, incluindo a minimização do uso de Cross-Origin Resource Sharing (CORS).
- Os modelos de controle de acesso devem reforçar a propriedade do registro, em vez de permitir que os usuários criem, leiam, atualizem ou excluam qualquer registro.
- Requisitos exclusivos de limites de negócio da aplicação devem ser impostos por modelos de domínio.
- Desative a listagem de diretórios do servidor web e garanta que metadados de arquivos (ex:
.git) e arquivos de backup não estejam presentes nas raízes web (web roots). - Registre (log) falhas de controle de acesso e alerte os administradores quando apropriado (ex: falhas repetidas).
- Implemente limites de taxa (rate limits) no acesso a APIs e controladores para minimizar o dano causado por ferramentas de ataque automatizadas.
- Identificadores de sessão com estado (stateful) devem ser invalidados no servidor após o logout. Tokens JWT sem estado (stateless) devem ter vida curta para minimizar a janela de oportunidade para um atacante. Para JWTs de longa duração, considere o uso de refresh tokens e siga os padrões OAuth para revogar o acesso.
- Utilize conjuntos de ferramentas (toolkits) ou padrões bem estabelecidos que forneçam controles de acesso simples e declarativos.
Desenvolvedores e equipes de QA devem incluir testes funcionais de controle de acesso em seus testes unitários e de integração.
Exemplos de Cenários de Ataque
Cenário #1: A aplicação utiliza dados não verificados em uma chamada SQL que acessa informações da conta:
pstmt.setString(1, request.getParameter("acct"));
ResultSet results = pstmt.executeQuery( );
Um atacante pode simplesmente modificar o parâmetro 'acct' no navegador para enviar qualquer número de conta desejado. Se não for corretamente verificado, o atacante pode acessar a conta de qualquer usuário.
https://example.com/app/accountInfo?acct=notmyacct
Cenário #2: Um atacante simplesmente força a navegação para URLs alvo. Direitos de administrador são necessários para acessar a página administrativa.
https://example.com/app/getappInfo
https://example.com/app/admin_getappInfo
Se um usuário não autenticado conseguir acessar qualquer uma das páginas, trata-se de uma falha. Se um não-administrador conseguir acessar a página de administração, isso também é uma falha.
Cenário #3: Uma aplicação coloca todo o seu controle de acesso no front-end. Embora o atacante não consiga chegar a [https://example.com/app/admin_getappInfo](https://example.com/app/admin_getappInfo) devido ao código JavaScript executado no navegador, ele pode simplesmente executar:
$ curl https://example.com/app/admin_getappInfo
a partir da linha de comando.
Referências
- OWASP Proactive Controls: C1: Implement Access Control
- OWASP Application Security Verification Standard: V8 Authorization
- OWASP Testing Guide: Authorization Testing
- OWASP Cheat Sheet: Authorization
- PortSwigger: Exploiting CORS misconfiguration
- OAuth: Revoking Access
Lista de CWEs Mapeadas
- CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
- CWE-23 Relative Path Traversal
- CWE-36 Absolute Path Traversal
- CWE-59 Improper Link Resolution Before File Access ('Link Following')
- CWE-61 UNIX Symbolic Link (Symlink) Following
- CWE-65 Windows Hard Link
- CWE-200 Exposure of Sensitive Information to an Unauthorized Actor
- CWE-201 Exposure of Sensitive Information Through Sent Data
- CWE-219 Storage of File with Sensitive Data Under Web Root
- CWE-276 Incorrect Default Permissions
- CWE-281 Improper Preservation of Permissions
- CWE-282 Improper Ownership Management
- CWE-283 Unverified Ownership
- CWE-284 Improper Access Control
- CWE-285 Improper Authorization
- CWE-352 Cross-Site Request Forgery (CSRF)
- CWE-359 Exposure of Private Personal Information to an Unauthorized Actor
- CWE-377 Insecure Temporary File
- CWE-379 Creation of Temporary File in Directory with Insecure Permissions
- CWE-402 Transmission of Private Resources into a New Sphere ('Resource Leak')
- CWE-424 Improper Protection of Alternate Path
- CWE-425 Direct Request ('Forced Browsing')
- CWE-441 Unintended Proxy or Intermediary ('Confused Deputy')
- CWE-497 Exposure of Sensitive System Information to an Unauthorized Control Sphere
- CWE-538 Insertion of Sensitive Information into Externally-Accessible File or Directory
- CWE-540 Inclusion of Sensitive Information in Source Code
- CWE-548 Exposure of Information Through Directory Listing
- CWE-552 Files or Directories Accessible to External Parties
- CWE-566 Authorization Bypass Through User-Controlled SQL Primary Key
- CWE-601 URL Redirection to Untrusted Site ('Open Redirect')
- CWE-615 Inclusion of Sensitive Information in Source Code Comments
- CWE-639 Authorization Bypass Through User-Controlled Key
- CWE-668 Exposure of Resource to Wrong Sphere
- CWE-732 Incorrect Permission Assignment for Critical Resource
- CWE-749 Exposed Dangerous Method or Function
- CWE-862 Missing Authorization
- CWE-863 Incorrect Authorization
- CWE-918 Server-Side Request Forgery (SSRF)
- CWE-922 Insecure Storage of Sensitive Information
- CWE-1275 Sensitive Cookie with Improper SameSite Attribute