FOLIO: AUD-20260926-041 Secuencia: Auditoría #5 del día 2026-09-26
📅 2026-09-26 13:50:00 COT 👤 Auditor: Anderson Mares (AMR TECH) ● VIGENTE
CRM WhatsApp IA Multi-Proveedor Auditoría Técnica

Auditoría Admin CRM WhatsApp con IA

AIService.php + WebhookHandler.php + Panel Admin — Análisis de arquitectura, seguridad y rendimiento del CRM conversacional con cascada de 5 proveedores IA.

branch: main AIService.php · WebhookHandler.php · public/index.php 2026-09-26
7.5 /10
Score Global
4
Críticos
6
Medios
13
Fortalezas
8
Recomendaciones

Resumen Ejecutivo

El componente auditado es el más sofisticado arquitecturalmente del proyecto. Implementa una cascada multi-proveedor de producción (Groq → Gemini → OpenRouter → OpenAI → Ollama) con post-procesamiento de humanización y guardas anti-loop. Cuenta con 10 cerebros (personas IA) para diferentes contextos de negocio y soporte de hasta 10 claves API por proveedor para alta disponibilidad. El panel admin tiene protección CSRF. Las brechas clave son: TRM hardcodeado, ausencia de verificación de firma webhook, métricas a nivel de conversación inexistentes, y la arquitectura PHP de 1-proceso-por-request que limita la concurrencia bajo carga alta.

✓ Cascade 5 providers ✓ 10 cerebros IA ✓ Anti-loop guard ✓ CSRF panel ✗ No HMAC webhook ✗ TRM hardcoded ⚠ No rate limit ⚠ Keys plaintext DB

Diagrama de Arquitectura IA — Flujo Completo

Cliente WhatsApp
WAHA / AutoResponder
Webhook POST
WebhookHandler.php
EmergencyBrake
Deduplication
IntentClassifier
(17 escenarios)
CerebroSelector
(10 personas)
AIService.callAICascade()
CASCADE:
Groq 10 keys
→ fallback →
Gemini 10 keys
→ fallback →
OpenRouter 10 keys
→ fallback →
OpenAI 10 keys
→ fallback →
Ollama local
humanizeReply()
10+ regex patterns
splitReplyForWhatsApp()
WAHA API
Cliente

Context Injectors (paralelo al cascade):

DolibarrService — ERP context CatalogService — products VectorService — embeddings Vision — Gemini + OpenRouter TRM API → $4100 fallback ⚠

Hallazgos Críticos

4 CRÍTICOS
CRÍTICO C-01 — Sin verificación de firma webhook HMAC
WebhookHandler.php

WebhookHandler.php procesa mensajes entrantes sin verificar la firma HMAC del proveedor WhatsApp/WAHA. Cualquier actor externo puede hacer POST a la URL del webhook y disparar respuestas IA reales — abusando de cuotas de API y potencialmente inyectando conversaciones falsas al CRM.

FIX: Verificar header X-Hub-Signature-256 contra HMAC-SHA256(body, WAHA_SIGNING_SECRET) antes de procesar cualquier payload.
CRÍTICO C-02 — TRM hardcodeado como fallback
AIService.php:104

Línea 104: $trm = 4100; // Valor fallback. Si la API de TRM falla, todos los cálculos de precio en conversaciones activas utilizan una tasa potencialmente obsoleta. Para un CRM de ventas, el pricing incorrecto en conversaciones puede generar pérdidas de ingresos directas.

FIX: Implementar cache de 1 hora en Redis/APCu con fetch a dolarapi.com o API Bancolombia. Alertar vía Telegram si el fetch falla más de 2 horas consecutivas.
CRÍTICO C-03 — Webhook sin rate limiting
public/index.php · WebhookHandler

El endpoint webhook es públicamente accesible sin control de velocidad. Un flood de requests podría agotar cuotas de API IA (costo $$$) o causar un DoS efectivo sobre la cascada de proveedores. WAHA debería ser el único caller legítimo.

FIX: Implementar rate limit por IP (100 req/min), whitelist de IPs del servidor WAHA, y respuesta 429 con Retry-After para requests excesivos.
CRÍTICO C-04 — API Keys en DB sin cifrar
tabla: ai_settings

Las claves API de todos los proveedores (Groq, Gemini, OpenRouter, OpenAI) se almacenan como texto plano en la tabla ai_settings. Si la base de datos es comprometida (SQL injection, backup leak, acceso físico), todas las claves quedan expuestas de inmediato sin capa adicional de protección.

FIX: Cifrar con AES-256-GCM usando APP_KEY del .env como clave maestra. Descifrar en runtime solo al momento de la llamada al proveedor.

Hallazgos Medios

6 MEDIOS
M-01 Naming confuso: callGroqAPI()

La función ejecuta la cascada completa (5 proveedores) pero se llama callGroqAPI(). Confunde al leer logs y al mantener el código. Debe renombrarse a callAICascade().

M-02 Sin métricas por cerebro

No hay tracking de: qué cerebro manejó qué conversación, tasa de conversión por persona, longitud promedio de respuesta, ni señales de satisfacción del usuario. Datos críticos para optimizar.

M-03 Procesamiento síncrono PHP

Cada webhook dispara un proceso PHP síncrono. Con 100+ mensajes simultáneos, Apache/PHP-FPM encolará. No hay sistema de colas (Redis Queue, RabbitMQ) para procesamiento async.

M-04 humanizeReply() hardcoded

10+ reemplazos regex hardcodeados en PHP. Cada nuevo modelo IA puede requerir nuevos patrones. Debería ser configuration-driven (tabla DB o JSON configurable), no PHP hardcodeado.

M-05 Integración EmergencyBrake incompleta

El servicio existe pero la profundidad de integración es incierta. Necesita verificarse que cubre todos los paths incluyendo el flujo de análisis de imágenes (vision).

M-06 VectorService sin uso claro

La capacidad de embeddings/vectores existe pero no es claro si está en producción. Si no se usa, agrega carga de mantenimiento. Si se usa, necesita documentación clara del flujo.

Fortalezas Arquitectónicas

13 FORTALEZAS
Cascada Multi-Proveedor

Groq → Gemini → OpenRouter → OpenAI → Ollama. Cero vendor lock-in. Fallback automático si un proveedor falla.

10 API Keys por Proveedor

Alta disponibilidad y pooling de cuotas. Rotación automática ante rate limits.

Anti-Loop Guard

Detección de auto-respuestas del bot para evitar loops infinitos de IA respondiendo a IA.

Deduplicación

Previene procesar el mismo mensaje dos veces. Evita doble-respuesta al cliente.

Humanización Post-Procesamiento

10 patrones regex eliminan frases de auto-identificación IA. Respuestas más naturales.

EmergencyBrake

Freno de emergencia cuando un humano toma control. IA deja de responder automáticamente.

CSRF Protection Panel

Panel admin con tokens de sesión CSRF. Protección básica contra cross-site request forgery.

Integración Dolibarr ERP

DolibarrService inyecta contexto de ERP en el prompt. IA tiene datos de pedidos, clientes, inventario.

CatalogService

Inyección de contexto de catálogo de productos en el prompt. IA conoce precios y disponibilidad.

Vision Support

Análisis de imágenes via Gemini + OpenRouter. Clientes pueden enviar fotos y la IA las interpreta.

10 Cerebros / Personas IA

Personas especializadas para diferentes contextos de negocio. Selección inteligente según intent.

17 Escenarios de Intent

Clasificación de intención en 17 escenarios de negocio. Routing preciso al cerebro correcto.

VectorService

Capacidad de búsqueda semántica por embeddings presente. Potencial para RAG y búsqueda contextual.

Recomendaciones Priorizadas

1
URGENTE Verificación HMAC firma webhook

Usar el signing secret de WAHA para verificar X-Hub-Signature-256 antes de procesar cualquier payload. Rechazar con 401 si falla. Esfuerzo: 2h.

2
URGENTE Rate limiting en endpoint webhook

100 req/min por IP. Whitelist IP del servidor WAHA. Header 429 con Retry-After. Protege cuotas IA y disponibilidad del servicio. Esfuerzo: 3h.

3
ALTO CERRADA · NO APLICA Queue asíncrono para procesamiento IA

Implementar cola simple (SQLite queue o Redis) para procesar webhooks async. Webhook responde 200 inmediatamente, worker procesa en background. Esfuerzo: 1 día.

Cierre 2026-09-27 — decisión del cliente: NO APLICA. El canal vivo es AutoResponder, que consume la respuesta {"reply"} del body HTTP (176 msgs / 7 días, 0 con wamid): un 200 inmediato con cola rompería el bot activo. Contrato síncrono POST /whatsapp-crm/public/webhook.php → {"reply"} preservado y verificado en vivo.

4
ALTO Cifrar API Keys en base de datos

AES-256-GCM usando APP_KEY del .env como clave maestra. Descifrar en runtime. Migración: script one-time para cifrar keys existentes. Esfuerzo: 4h.

5
MEDIO Analytics por cerebro

Tabla cerebro_metrics: conv_count, avg_turns, manual_takeover_rate, avg_response_ms. Dashboard en el panel admin para optimizar qué cerebro funciona mejor por escenario. Esfuerzo: 1 día.

6
MEDIO TRM en tiempo real con cache 1h

Fetch a dolarapi.com con APCu/Redis cache de 1 hora. Si falla > 2h consecutivas, alertar vía Telegram al admin. Esfuerzo: 3h.

7
BAJO Renombrar callGroqAPI() → callAICascade()

Refactor de naming para claridad. Actualizar todos los callers y logs. Esfuerzo: 30min.

8
BAJO Webhook de notificación a Telegram admin

Notificar al admin vía Telegram/WhatsApp cuando EmergencyBrake se activa (manual takeover). Incluir número del cliente y motivo. Esfuerzo: 2h.

Matriz de Riesgo de Seguridad

Componente Riesgo Probabilidad Impacto Estado
WebhookHandler.php Sin HMAC ALTA CRÍTICO ABIERTO
ai_settings (DB) Keys plaintext MEDIA CRÍTICO ABIERTO
Webhook endpoint Sin rate limit ALTA ALTO ABIERTO
Panel admin CSRF token BAJA MEDIO MITIGADO
AIService (cascade) Timeout handling BAJA MEDIO CUBIERTO
EmergencyBrake Cobertura parcial MEDIA ALTO REVISAR

Roadmap de Implementación

Sprint 1 — Esta semana
  • Verificación HMAC webhook
  • Rate limiting endpoint
  • Rename callGroqAPI()
Esfuerzo total: ~6h
Sprint 2 — Próxima semana
  • Cifrar API Keys (AES-256)
  • TRM en tiempo real + cache
  • Notificación Telegram admin
Esfuerzo total: ~9h
Sprint 3 — Mes 2
  • Queue async (SQLite/Redis) cerrada · no aplica
  • Analytics por cerebro
  • humanizeReply() configurable
Esfuerzo total: ~2 días
⚡ AMR TECH™
Desarrollado / Auditado por Anderson Mares
FOLIO: AUD-20260926-041 · Score: 7.5/10 · 2026-09-26 13:50:00 COT · ● VIGENTE