Cargando…
Cargando…
Centro de Confianza · Postura de Seguridad
simiriki opera la infraestructura que sus clientes usan para detectar y remediar configuración de Microsoft 365. Esa posición — entre el tenant del cliente y el motor de remediación — exige un nivel de higiene de seguridad mayor que el de un sitio de marketing. Este documento es el resultado de la auditoría interna del 6 de mayo de 2026 contra los doce vectores que un revisor adversarial (analista de Gartner, autor de Microsoft Digital Defense Report, CISO de una empresa Fortune 500) verificaría primero. Cada línea cita el archivo de código que la sostiene.
Sin negaciones, sin pruebas pendientes: estos son hechos verificables sobre el repositorio público en github.com/jjdlr-simiriki/simiriki a la fecha de auditoría.
| Clase | Estado | Evidencia |
|---|---|---|
| Inyección SQL | Limpio | Toda llamada a pool.query() usa placeholders parametrizados ($1, $2, $3); no hay interpolación de cadenas en queries en apps/api/src/**. |
| Server-Side Request Forgery (SSRF) | Limpio | Auditoría grep no encontró el patrón fetch(req.body.url) ni equivalente en ningún route handler. |
| Open redirects | Limpio | app/api/auth/verify/route.ts valida el parámetro next= contra el allowlist ALLOWED_NEXT_PREFIXES = [/dashboard, /checkout, /portal, /onboarding, /intake]. Cualquier valor fuera del prefijo cae a /dashboard. |
| Cross-Site Request Forgery (CSRF) | Limpio | proxy.ts:199-209 rechaza POST/PUT/DELETE/PATCH con header Origin fuera del set permitido. Stripe webhooks y crons (sin Origin) autentican por firma, no por origen. |
| Verificación de OAuth state | Limpio | LinkedIn, Google y Microsoft 365 callbacks usan crypto.timingSafeEqual para comparar el state provisto contra la cookie firmada. Ver app/api/auth/{linkedin,google}/callback/route.ts y app/api/connect-m365/callback/route.ts. |
| Firma de webhook Stripe | Limpio | app/api/stripe/webhook/route.ts usa stripe.webhooks.constructEvent() (timing-safe oficial) con STRIPE_WEBHOOK_SECRET, más idempotencia respaldada por la tabla Supabase stripe_webhook_events indexada por stripe_event_id. |
| HMAC en callback Microsoft 365 | Limpio | app/api/connect-m365/callback/route.ts:161 usa crypto.timingSafeEqual para comparar el bypass token contra el secret. |
| Firma de webhook Resend | Limpio | app/api/webhooks/resend/route.ts:91-115 verifica HMAC-SHA256 Svix en timingSafeEqual. Producción rechaza si RESEND_WEBHOOK_SECRET no está configurado (fail-closed). |
| Cifrado de tokens en reposo | Limpio | lib/crypto.ts implementa AES-256-GCM con IV+authTag persistido. lib/linkedin/api.ts y app/api/connect-m365/callback/route.ts cifran access/refresh tokens antes de persistirlos en Supabase. |
| HMAC de /audit/report | Limpio | app/audit/report/route.ts:27-42 exige REPORT_TOKEN_SALT o INTERNAL_API_SECRET; lanza excepción en producción si ninguno está configurado. |
| Auth de internal-key (CFDI) | Limpio | app/api/cfdi/issue/route.ts:65-76 es fail-closed: rechaza si la variable de entorno no está configurada, y compara con loop de constante en tiempo. |
| Content Security Policy (CSP) | Aceptable | proxy.ts:45-61 aplica CSP estricto excepto 'unsafe-inline' en script-src. La política nonce-only se revirtió deliberadamente porque forzaba renderizado dinámico (cada llamada a headers()), lo cual mató el cache de edge. Trade-off documentado en proxy.ts:11-19. Para el sitio de marketing — sin contenido generado por usuario — el riesgo de XSS es bajo y React auto-escapa toda salida renderizada. |
Esta auditoría también identificó cuatro asuntos que requieren atención. Los listamos en interés de la transparencia que esperamos de cualquier proveedor que también opera infraestructura de seguridad:
Este documento se generó vía:
La auditoría es reproducible: cualquier línea de evidencia citada existe en el commit referenciado, y el archivo apps/api/src/database/migrations/ mantiene histórico inmutable de cambios de schema.
Reportes de vulnerabilidad responsable: security@simiriki.com. Respuesta inicial dentro de 48 horas hábiles. No ofrecemos bug bounty monetario; ofrecemos atribución pública en este documento si el reportador lo desea.