
Demonstra a vulnerabilidade de Autorização em Nível de Objeto Quebrada (BOLA) CVE-2023-27524 com implementações vulneráveis e corrigidas de API Flask para educação em segurança.
# 🔐 Demonstração de Autorização de Nível de Objeto Quebrada (BOLA)
## Análise de Segurança e Correção do CVE-2023-27524
---
## 📌 Visão Geral do Projeto
Este projeto demonstra uma vulnerabilidade real de **Autorização de Nível de Objeto Quebrada (BOLA)** e sua correção segura usando uma API baseada em Flask.
A vulnerabilidade é modelada com base no **CVE-2023-27524**, que envolve controles de autorização inadequados que permitem que atacantes acessem ou manipulem objetos não autorizados modificando identificadores de objetos (IDs) em requisições da API.
Este repositório inclui:
- ❌ vulnerable_api.py: Uma versão vulnerável da API
- ✅ fixed_vulnerable_api.py: Uma versão corrigida e segura que implementa autorização adequada no nível do objeto
---
## ⚠️ O que é BOLA?
**Autorização de Nível de Objeto Quebrada (BOLA)** ocorre quando uma aplicação:
- Expõe IDs de objetos (ex.: `/profile?id=2`)
- Não verifica se o usuário autenticado está autorizado a acessar aquele objeto
### 🔴 Impacto:
Atacantes podem:
- Acessar dados privados de outros usuários
- Modificar ou excluir recursos não autorizados
- Realizar escalonamento horizontal de privilégios
---
## 💥 Implementação Vulnerável
### Exemplo (Código Vulnerável)
```python
@app.route('/profile')
def profile():
user_id = request.args.get("id")
return users.get(int(user_id))
```
### ❌ Problema:
* Nenhuma verificação de autenticação
* Nenhuma validação de propriedade
* ID controlado pelo usuário acessa diretamente objetos do banco de dados
### 🔓 Cenário de Exploração:
```
/profile?id=1 → Dados de Alice
/profile?id=2 → Dados de Bob (acesso não autorizado)
```
---
## 🔒 Implementação Corrigida e Segura
### Exemplo (Código Seguro)
```python
@app.route('/profile')
def profile():
requested_id = int(request.args.get("id", session["user_id"]))
# Verificação de autorização no nível do objeto
if requested_id != session["user_id"]:
return "403 Forbidden - Access Denied", 403
return users.get(requested_id)
```
---
## ✅ Correção de Segurança Aplicada
Esta implementação previne BOLA ao impor:
✔ Autenticação baseada em sessão
✔ Validação de propriedade do objeto
✔ Verificações de autorização no lado do servidor
✔ Prevenção de ataques de adulteração de ID
---
## 🧠 Lição Chave de Segurança
> Nunca confie em identificadores de objetos fornecidos pelo usuário sem verificar a autorização no lado do servidor.
Autenticação NÃO é suficiente — **a autorização deve ser aplicada no nível do objeto.**
---
## 📊 Fluxo de Ataque vs Fluxo Seguro
### ❌ Fluxo Vulnerável:
```
Usuário → Requisição API (/profile?id=2) → Acesso Direto ao BD → Vazamento de Dados
```
### ✅ Fluxo Seguro:
```
Usuário → Requisição API → Verificação de Sessão → Validação de Propriedade → Permitido/Negado
```
---
## 🧪 Como Executar
### 1. Instalar dependências
```bash
pip install flask
```
### 2. Executar a aplicação
```bash
python fixed_vulnerable_api.py ou vulnerable_api.py
```
### 3. Acessar a aplicação
```
http://127.0.0.1:5000
```
---
## 📁 Estrutura do Projeto
```
api-bola-demo/
│
├── vulnerable_api.py # versão insegura
├── fixed_vulnerable_api.py # Versão corrigida (BOLA)
└── README.md
```