
Demuestra la vulnerabilidad CVE-2023-27524 de Autorización a Nivel de Objeto Rota (BOLA) con implementaciones vulnerables y corregidas de API Flask para educación en seguridad.
# 🔐 Demostración de Autorización a Nivel de Objeto Roto (BOLA)
## Análisis de Seguridad y Corrección de CVE-2023-27524
---
## 📌 Resumen del Proyecto
Este proyecto demuestra una vulnerabilidad real de **Autorización a Nivel de Objeto Roto (BOLA)** y su corrección segura utilizando una API basada en Flask.
La vulnerabilidad está modelada según **CVE-2023-27524**, que implica controles de autorización inadecuados que permiten a los atacantes acceder o manipular objetos no autorizados modificando identificadores de objetos (IDs) en las solicitudes de API.
Este repositorio incluye:
- ❌ vulnerable_api.py: Una versión vulnerable de la API
- ✅ fixed_vulnerable_api.py: Una versión segura corregida que implementa la autorización adecuada a nivel de objeto
---
## ⚠️ ¿Qué es BOLA?
**La Autorización a Nivel de Objeto Roto (BOLA)** ocurre cuando una aplicación:
- Expone IDs de objetos (ej., `/profile?id=2`)
- No verifica si el usuario autenticado está autorizado para acceder a ese objeto
### 🔴 Impacto:
Los atacantes pueden:
- Acceder a datos privados de otros usuarios
- Modificar o eliminar recursos no autorizados
- Realizar escalada horizontal de privilegios
---
## 💥 Implementación Vulnerable
### Ejemplo (Código Vulnerable)
```python
@app.route('/profile')
def profile():
user_id = request.args.get("id")
return users.get(int(user_id))
/profile?id=1 → Alice data
/profile?id=2 → Bob data (unauthorized access)
@app.route('/profile')
def profile():
requested_id = int(request.args.get("id", session["user_id"]))
# Object-level authorization check
if requested_id != session["user_id"]:
return "403 Forbidden - Access Denied", 403
return users.get(requested_id)
Esta implementación previene BOLA al aplicar:
✔ Autenticación basada en sesión ✔ Validación de propiedad de objeto ✔ Verificaciones de autorización del lado del servidor ✔ Prevención de ataques de manipulación de ID
Nunca confíes en identificadores de objetos proporcionados por el usuario sin verificar la autorización en el lado del servidor.
La autenticación NO es suficiente — la autorización debe ser aplicada a nivel de objeto.
User → API Request (/profile?id=2) → Direct DB Access → Data Leak
User → API Request → Session Check → Ownership Validation → Allowed/Denied
pip install flask
python fixed_vulnerable_api.py or vulnerable_api.py
http://127.0.0.1:5000
api-bola-demo/
│
├── vulnerable_api.py # insecure version
├── fixed_vulnerable_api.py # Fixed BOLA version
└── README.md