Abuso de API

Infraestructura Y Gobernanza Security Notes Jan 9, 2025 JAVASCRIPT
security attacks misuse ddos scraping

Definition

El abuso de API es el uso intencionado o no intencionado de una API que viola sus términos de servicio, degrada la calidad del servicio para otros usuarios o explota vulnerabilidades con propósitos maliciosos. Esto va desde scraping agresivo que abruma servidores, hasta ataques de credential stuffing probando contraseñas robadas, hasta explotar fallas de lógica de negocio para obtener recursos gratuitos. A diferencia del uso legítimo alto (que está permitido y se paga), el abuso es malicioso o viola la política de uso aceptable del proveedor.

El abuso de API es particularmente insidioso porque a menudo parece tráfico normal a primera vista. Un atacante podría usar botnets distribuidas para permanecer bajo límites de tasa por IP, rotar API keys robadas de repositorios públicos de GitHub, o explotar endpoints desprotegidos que carecen de autenticación. La línea entre “usuario intensivo” y “abusador” puede ser difusa, por lo cual la detección requiere análisis conductual, no solo conteo simple de solicitudes.

El impacto del abuso de API se extiende más allá de problemas técnicos. Incrementa costos de infraestructura (sirviendo solicitudes maliciosas), daña la calidad del servicio para usuarios legítimos (los recursos compartidos se agotan), crea responsabilidad legal (datos scrapeados usados para fraude), y erosiona la confianza en la plataforma. Un solo abusador determinado puede costar a los proveedores miles de dólares en cómputo desperdiciado y tiempo de ingeniería.

Example

Ataque de Credential Stuffing: Atacantes usan bases de datos de contraseñas filtradas de otras brechas para probar millones de combinaciones de email/contraseña contra tu API de login. Permanecen bajo límites de tasa usando miles de IPs (botnets) y API keys distribuidas. Cuando encuentran credenciales válidas, drenan cuentas o venden acceso.

Scraping Web Agresivo: Un competidor scrapea tu API de e-commerce para robar precios de productos y niveles de inventario. Hacen 10,000 solicitudes/hora distribuidas en 100 IPs, permaneciendo bajo tus límites de tasa por IP. Reconstruyen tu catálogo de productos completo diariamente para subvender tus precios.

Granja de Tier Gratuito: Usuarios crean miles de cuentas falsas para explotar cuotas de tier gratuito para uso comercial. Por ejemplo, crear 1,000 apps gratuitas de Heroku para minar criptomonedas, o 500 cuentas de API de email gratuitas para enviar spam. Cada cuenta individualmente parece legítima.

Ataque de Profundidad de Consulta GraphQL: Atacantes crean consultas GraphQL profundamente anidadas que parecen pequeñas pero desencadenan operaciones masivas de base de datos. Una sola solicitud podría expandirse a 10,000 consultas de base de datos, abrumando tu backend mientras permanece bajo límites de tasa basados en solicitudes.

Fraude de Pumping SMS: Atacantes explotan endpoints de verificación SMS para generar ingresos. Solicitan códigos de verificación para números telefónicos de tarifa premium que controlan, luego cobran tarifas de los cargos SMS. Tú pagas por el SMS, ellos embolsan la ganancia.

Broken Object Level Authorization (BOLA): Atacantes iteran a través de IDs secuenciales para acceder a datos de otros usuarios. Por ejemplo, /api/invoice/1001, /api/invoice/1002, etc., descubriendo que tu API no valida propiedad. Scrapean miles de facturas conteniendo datos sensibles.

Analogy

El Explotador del Buffet: Un restaurante buffet ofrece “todo lo que puedas comer” por $20. Un comensal normal come 2-3 platos. Un abusador trae 50 contenedores para llevar, los llena todos e intenta irse. Técnicamente ilimitado, pero claramente abuso. Eso es lo que hacen los abusadores de API - explotar límites generosos más allá de su propósito previsto.

El Bot Acaparador de Boletos: Cuando salen a la venta boletos de concierto, bots abusan de la API de boletos para comprar miles de boletos en segundos, muy por encima de lo que un humano podría comprar. Permanecen bajo límites técnicos (el sitio no colapsa) pero violan la política de “una persona, número razonable de boletos”. Los fans legítimos no pueden obtener boletos.

El Acaparador de Cupones: Una tienda ofrece “límite un cupón por cliente”. Un abusador crea 500 identidades falsas y redime 500 cupones, costando a la tienda miles. Cada transacción individual parece normal, pero el patrón es claramente abuso.

El Estafador de Libros de Biblioteca: Una biblioteca te permite tomar prestados 20 libros a la vez. Un abusador crea 100 tarjetas de biblioteca bajo nombres falsos y saca 2,000 libros, luego los vende en línea. Cada tarjeta individualmente parece bien, pero colectivamente es robo sistemático.

Code Example

// Patrón de detección para abuso de API
import Redis from 'ioredis';
const redis = new Redis();

// Detección de abuso multifactorial
async function detectAbuse(req) {
  const userId = req.user?.id || 'anonymous';
  const ip = req.ip;
  const endpoint = req.path;
  const userAgent = req.headers['user-agent'];

  const signals = [];

  // Señal 1: Solicitudes excesivas desde una sola IP
  const ipRequestCount = await redis.incr(`abuse:ip:${ip}`);
  if (ipRequestCount === 1) await redis.expire(`abuse:ip:${ip}`, 3600);
  if (ipRequestCount > 1000) signals.push('excessive_ip_requests');

  // Señal 2: Enumeración de ID secuencial (ataque BOLA)
  if (endpoint.match(/\/api\/\w+\/\d+$/)) {
    const lastId = await redis.get(`abuse:sequence:${userId}`) || 0;
    const currentId = parseInt(endpoint.split('/').pop());
    if (Math.abs(currentId - lastId) === 1) {
      const sequenceCount = await redis.incr(`abuse:sequence_count:${userId}`);
      if (sequenceCount > 50) signals.push('id_enumeration');
    }
    await redis.setex(`abuse:sequence:${userId}`, 300, currentId);
  }

  // Señal 3: Ataque distribuido (muchas IPs, mismo patrón de usuario)
  const userIPs = await redis.sadd(`abuse:user_ips:${userId}`, ip);
  if (userIPs > 50) signals.push('distributed_attack');

  // Señal 4: Credential stuffing (muchos logins fallidos)
  if (endpoint === '/api/auth/login' && !req.user) {
    const failCount = await redis.incr(`abuse:login_fail:${ip}`);
    if (failCount === 1) await redis.expire(`abuse:login_fail:${ip}`, 3600);
    if (failCount > 20) signals.push('credential_stuffing');
  }

  // Señal 5: User agent sospechoso (patrones de bot)
  const botPatterns = /bot|crawler|spider|scraper|curl|python/i;
  if (botPatterns.test(userAgent) && !req.user) {
    signals.push('bot_user_agent');
  }

  // Señal 6: Patrones de agotamiento de recursos (profundidad GraphQL)
  if (req.body?.query?.split('{').length > 10) {
    signals.push('query_depth_attack');
  }

  // Calcular puntuación de abuso
  const score = signals.length;
  const isAbuse = score >= 2; // Dos o más señales = probable abuso

  if (isAbuse) {
    // Registrar para investigación
    await redis.zadd('abuse:incidents', Date.now(), JSON.stringify({
      userId, ip, endpoint, signals, timestamp: Date.now()
    }));

    // Incrementar contador de abuso
    await redis.incr(`abuse:score:${userId}`);
  }

  return {
    isAbuse,
    score,
    signals,
    action: score >= 3 ? 'block' : score >= 2 ? 'challenge' : 'allow'
  };
}

// Middleware Express.js
async function abuseProtectionMiddleware(req, res, next) {
  const result = await detectAbuse(req);

  if (result.action === 'block') {
    return res.status(403).json({
      error: 'abuse_detected',
      message: 'Tu patrón de solicitud indica potencial abuso de API.',
      signals: result.signals
    });
  }

  if (result.action === 'challenge') {
    // Requerir verificación adicional (CAPTCHA, MFA, etc.)
    if (!req.headers['x-verified']) {
      return res.status(429).json({
        error: 'verification_required',
        message: 'Por favor completa la verificación para continuar.',
        challenge_url: '/api/verify'
      });
    }
  }

  next();
}

// Uso
app.use(abuseProtectionMiddleware);

Diagram

graph TB
    subgraph Attackers["Vectores de Ataque"]
        A1[Credential Stuffing
Millones de intentos de login] A2[Web Scraping
Robo de datos] A3[Ataque BOLA
Enumeración de IDs] A4[Profundidad GraphQL
Bomba de consulta] A5[SMS Pumping
Fraude de tarifa premium] A6[Abuso de Tier Gratuito
Miles de cuentas falsas] end subgraph Detection["Sistema de Detección de Abuso"] D1[Análisis de Patrón de Tasa] D2[Detección de Anomalías Conductuales] D3[Verificación de Reputación IP] D4[Análisis de User Agent] D5[Análisis de Complejidad de Consulta] D6[Puntuación Multi-Señal] end subgraph Mitigation["Acciones de Mitigación"] M1[Bloquear Solicitud
403 Forbidden] M2[Desafío CAPTCHA] M3[Rate Limit
429 Too Many Requests] M4[Ban Temporal
Suspensión 24 horas] M5[Ban Permanente
Terminación de cuenta] M6[Alertar Equipo de Seguridad] end A1 --> D1 A2 --> D1 A3 --> D2 A4 --> D5 A5 --> D2 A6 --> D3 D1 --> D6 D2 --> D6 D3 --> D6 D4 --> D6 D5 --> D6 D6 -->|Puntuación < 2| Allow[Permitir Solicitud] D6 -->|Puntuación 2-3| M2 D6 -->|Puntuación 3-4| M3 D6 -->|Puntuación > 4| M1 D6 -->|Persistente| M4 D6 -->|Severo| M5 M1 --> M6 M5 --> M6 style D6 fill:#ffe6e6 style M1 fill:#ffcccc style M5 fill:#ff9999 style Allow fill:#e6ffe6

Security Notes

SECURITY NOTES

CRÍTICO - …

Configuración y Validación:

  • El abuso de API es una de las principales amenazas a la seguridad de APIs.
  • Implementar detección de múltiples capas combinando rate limiting, análisis conductual y detección de anomalías.
  • Nunca confiar en una sola señal; los atacantes evadirán reglas simples.
  • Registrar todos los incidentes de abuso con contexto completo para análisis forense.
  • Usar modelos de aprendizaje automático para detectar patrones de abuso en evolución.
  • Implementar desafíos CAPTCHA o proof-of-work para tráfico sospechoso.
  • Monitorear impacto financiero del abuso (cómputo desperdiciado, costos SMS, almacenamiento).

Monitoreo y Protección:

  • Bloquear en múltiples capas: WAF, API gateway y lógica de aplicación.
  • Implementar bans automatizados para abuso severo mientras se permiten apelaciones para falsos positivos.
  • Compartir inteligencia de abuso en toda tu organización.
  • Usar servicios de reputación IP para detectar actores maliciosos conocidos.
  • Implementar endpoints honeypot para identificar scrapers.
  • Limitar tasa por múltiples dimensiones: IP, usuario, API key, user agent.
  • Nunca exponer mensajes de error detallados que ayuden a atacantes a refinar sus ataques.
  • Implementar controles de costos para prevenir cargos de abuso desbocados.

Best Practices

  1. Detección Multi-Señal: Combinar 5+ señales (reputación IP, patrones de solicitud, comportamiento de usuario, hora del día, complejidad de consulta) para identificar abuso. Las señales únicas son demasiado fáciles de evadir.

  2. Líneas Base Conductuales: Establecer patrones de uso normal por usuario/endpoint, luego alertar sobre desviaciones. Un usuario que normalmente hace 100 req/día haciendo súbitamente 10,000 es sospechoso.

  3. Aplicación Progresiva: Comenzar con advertencias, luego throttling, luego desafíos (CAPTCHA), luego bans temporales, luego bans permanentes. Dar a usuarios legítimos oportunidad de corregir comportamiento.

  4. Endpoints Honeypot: Crear endpoints falsos (no en documentación) que solo los scrapers encontrarían. Accederlos es una señal automática de abuso.

  5. Monitoreo de Costos: Rastrear el impacto financiero del abuso en tiempo real. Alertar cuando actividad sospechosa cruza umbrales de costo (ej., $100 en cargos SMS en una hora).

  6. Desafíos Proof-of-Work: Para endpoints de alto valor, requerir que clientes resuelvan puzzles computacionales. Usuarios legítimos no notarán, pero bots enfrentan costos significativos.

  7. Playbooks de Respuesta Automatizada: Definir rutas de escalamiento claras. Por ejemplo: 2 señales = registrar, 3 señales = CAPTCHA, 4 señales = ban temporal, 5 señales = ban permanente + notificar seguridad.

  8. Análisis Regular de Patrones: Revisar logs de abuso semanalmente para identificar nuevos patrones de ataque y actualizar reglas de detección.

Common Mistakes

Solo Verificar Conteo de Solicitudes: Abusadores sofisticados permanecen bajo límites de tasa distribuyendo ataques. Verificar patrones, no solo volumen.

Sin Análisis Conductual: Tratar todas las solicitudes por igual pierde abuso sutil. Un usuario iterando a través de IDs secuenciales probablemente está abusando, incluso si está bajo límites de tasa.

Bloquear Demasiado Agresivamente: Falsos positivos frustran a usuarios legítimos. Implementar aplicación progresiva y procesos de apelación.

Ignorar Abuso de Lógica de Negocio: No todo el abuso es técnico. Explotar programas de referidos, códigos de descuento o pruebas gratuitas también es abuso.

Sin Monitoreo de Costos: Abusadores explotan operaciones costosas (SMS, modelos de IA, almacenamiento). Monitorear costos por usuario, no solo conteo de solicitudes.

Confiar en API Keys: Atacantes roban API keys de repositorios públicos de GitHub o código del lado del cliente. No asumir que una key válida significa tráfico legítimo.

Sin Logging: Sin logs detallados, no puedes investigar incidentes de abuso o refinar reglas de detección. Registrar todo con timestamps, IPs, user IDs y detalles de solicitud.

Exponer Endpoints Sensibles Sin Auth: Endpoints como /api/user/{id} deben requerir autenticación y autorización. El acceso público habilita ataques BOLA.

Sin Verificaciones de Reputación IP: Bases de datos gratuitas de reputación IP pueden identificar VPNs conocidas, proxies e IPs maliciosas. Usarlas.

Ignorar GraphQL/Consultas Complejas: Límites de tasa basados en consultas no cuentan para complejidad. Una sola consulta GraphQL maliciosa puede costar 10,000x una solicitud REST simple.

Standards & RFCs

Standards & RFCs
3)- CWE-799 - Improper Control of Interaction Frequency ([Rate Limiting](https://reference.apios.info/es/terms/rate-limiting/))
4)- CWE-841 - Improper Enforcement of Behavioral Workflow