Auditoría de Seguridad

AlfredMovies/Peliculas - {{currentDate}}

🔴 3 Críticos 🟠 2 Altos 🟡 2 Medios

🚨 Resumen Ejecutivo

3
Críticos
Requieren acción inmediata
2
Altos
Corregir urgentemente
2
Medios
Revisar pronto
2
Informativos
Recomendaciones

⚠️ Conclusión General

El proyecto presenta vulnerabilidades críticas principalmente en la autenticación del panel de administración. La implementación actual permite acceso no autorizado al panel admin mediante fuerza bruta simple. Se recomienda una re-arquitectura completa del sistema de autenticación y la implementación de validación server-side para todas las operaciones CRUD.

📊 Puntuación de Seguridad

15 / 100
Autenticación 0/100
Protección de Datos 45/100
Seguridad de APIs 25/100
Configuración 40/100
Headers de Seguridad 10/100

🚨 Vulnerabilidades Críticas

CRÍTICO

Autenticación Administrador Completamente Insegura

VULN-001
Ubicación:
/app/admin-secreto/page.tsx

📋 Descripción

El sistema de autenticación del panel de administración es completamente client-side. La contraseña se verifica directamente en el navegador contra una variable de entorno expuesta (NEXT_PUBLIC_ADMIN_PASSWORD). No existe validación server-side, lo que permite acceso completo al panel admin simplemente adivinando o brute-forcing la URL /admin-secreto.

⚡ Impacto

  • Acceso completo al panel de administración sin credenciales válidas
  • CRUD no autorizado en la base de datos (películas, series, deportes)
  • Modificación o eliminación de contenido de streaming
  • Inyección de contenido malicioso en la plataforma

🔧 Código Vulnerable

// admin-secreto/page.tsx - Líneas 5-20 (aproximado)
const [password, setPassword] = useState('')
const [isAuthenticated, setIsAuthenticated] = useState(false)

const handleLogin = () => {
    // ❌ VALIDACIÓN CLIENTE-side SOLAMENTE
    // ❌ NO HAY LLAMADA A API/SERVER
    // ❌ LA CONTRASEÑA ES ACCESIBLE EN EL NAVEGADOR
    if (password === process.env.NEXT_PUBLIC_ADMIN_PASSWORD) {
        setIsAuthenticated(true)
    }
}

// La variable de entorno es pública:
console.log(process.env.NEXT_PUBLIC_ADMIN_PASSWORD) // "Gustavo06$"

✅ Recomendación de Remediación

  1. 1 Eliminar NEXT_PUBLIC_ADMIN_PASSWORD del .env.local y nunca exponer credenciales en el cliente
  2. 2 Crear API Route en /app/api/auth/login/route.ts con validación server-side usando Supabase Auth o JWT
  3. 3 Implementar rate limiting en el endpoint de login (máx. 5 intentos por IP por minuto)
  4. 4 Usar HTTPS y configurar cookies HttpOnly, Secure, SameSite
  5. 5 Implementar auditoría de accesos admin en Supabase
CVSS 3.1 Score
9.8
Critical (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CWE Relacionado
CWE-306: Missing Authentication for Critical Function
CWE-798: Use of Hard-coded Credentials
CRÍTICO

Operaciones CRUD Sin Validación Server-Side

VULN-002
Ubicación:
/app/admin-secreto/page.tsx
Afcta:
Tablas: peliculas, episodios, deportes

📋 Descripción

Todas las operaciones Create, Update y Delete en la base de datos se realizan directamente desde el cliente usando el cliente Supabase con la anon_key. No existe middleware ni validación server-side que verifique si el usuario tiene permisos para modificar datos. Cualquier persona puede manipular el contenido de la plataforma.

⚡ Impacto

  • Inyección de contenido no autorizado en todas las tablas
  • Eliminación masiva de películas, series y canales deportivos
  • Modificación de URLs de streaming para redirigir a sitios maliciosos
  • Enumeración y extracción de datos sensibles

🔧 Código Vulnerable

// admin-secreto/page.tsx - Función de crear película (aproximado)
const crearPelicula = async (data: PeliculaForm) => {
    // ❌ NO HAY VERIFICACIÓN DE PERMISOS
    // ❌ EL ANON KEY PERMITE ACCESO TOTAL SI RLS NO ESTÁ CONFIGURADO
    const { data: result, error } = await supabase
        .from('peliculas')
        .insert([data])
        .select()

    if (error) throw error
    return result
}

✅ Recomendación de Remediación

  1. 1 Configurar Row Level Security (RLS) en todas las tablas de Supabase
  2. 2 Crear API Routes para cada operación CRUD con validación de sesión
  3. 3 Validar input en server-side (sanitizar URLs, verificar tipos de datos)
  4. 4 Usar Service Role key solo en server-side, nunca expuesta al cliente
CVSS 3.1 Score
9.1
Critical (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N)
CWE Relacionado
CWE-306: Missing Authentication for Critical Function
CWE-862: Missing Authorization
CRÍTICO

Service Worker Cargando Scripts Externos No Verificados

VULN-003
Ubicación:
/public/sw.js

📋 Descripción

El service worker carga un script externo de 3nbf4.com sin verificación de integridad ni validación. Un atacante que comprometa el dominio externo podría inyectar código malicioso que se ejecutaría en el navegador de todos los usuarios de la plataforma, afectando la funcionalidad completa del sitio.

⚡ Impacto

  • Ejecución de código JavaScript malicioso en todos los usuarios
  • Robo de credenciales, tokens de sesión y datos personales
  • Inyección de anuncios adicionales o malware
  • Redirección a sitios de phishing
  • Manipulación del DOM y contenido de video

🔧 Código Vulnerable

// public/sw.js
// ❌ CARGA SCRIPTS EXTERNOS SIN VERIFICACIÓN
// ❌ SIN SUBRESOURCE INTEGRITY (SRI)
// ❌ EL DOMINIO EXTERNO PUEDE SER COMPROMETIDO

importScripts('https://3nbf4.com/act/files/service-worker.min.js');

// ❌ NO HAY hash sha256 PARA VERIFICAR INTEGRIDAD

✅ Recomendación de Remediación

  1. 1 Eliminar el importScripts externo completamente si no es esencial
  2. 2 Implementar Monetización Internamente usando Google AdSense u otra red verificada
  3. 3 Si es necesario usar scripts externos, implementar Subresource Integrity (SRI)
  4. 4 Monitorear el dominio externo regularmente para detectar cambios
CVSS 3.1 Score
9.0
Critical (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)
CWE Relacionado
CWE-829: Inclusion of Functionality from Untrusted Control Sphere
CWE-94: Code Injection

🔴 Vulnerabilidades Altas

ALTO

API Keys Expuestas en el Cliente

VULN-004
Ubicación:
/lib/supabase.ts, /app/...
Variables Expuestas:
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, NEXT_PUBLIC_TMDB_API_KEY

📋 Descripción

Las variables NEXT_PUBLIC_* son expuestas al navegador y pueden ser accedidas por cualquier usuario a través de DevTools o inspeccionando el código fuente. Aunque la Supabase Anon Key está diseñada para ser pública, su uso sin restricciones RLS permite acceso no autorizado. La TMDB API Key puede ser robada y usada por terceros, incurriendo en costos no deseados.

⚡ Impacto

  • Abuso de la API de TMDB con las credenciales expuestas
  • Potencial acceso a datos sensibles si RLS no está configurado
  • Costos inesperados en TMDB si se comparte/abusa la API key

✅ Recomendación de Remediación

  1. 1 Mover llamadas a TMDB a API Routes server-side para ocultar la API key
  2. 2 Configurar Rate Limiting en Supabase para prevenir abuso de la Anon Key
  3. 3 Restringir API Key de TMDB por dominio en el panel de TMDB
CVSS 3.1 Score
7.5
High (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
CWE Relacionado
CWE-200: Exposure of Sensitive Information to an Unauthorized Actor
CWE-497: Exposure of Sensitive System Data
ALTO

Ausencia de Rate Limiting y Protección Anti-Brute Force

VULN-005
Ubicación:
/app/admin-secreto/page.tsx, API Routes (no existentes)

📋 Descripción

No existe ningún mecanismo de protección contra ataques de fuerza bruta o enumeración de usuarios. La URL del admin (/admin-secreto) es fácilmente adivinable. Un atacante puede intentar múltiples contraseñas sin restricciones.

⚡ Impacto

  • Ataques de fuerza bruta para adivinar credenciales
  • Enumeración de usuarios válidos
  • Denegación de servicio por múltiples intentos fallidos

✅ Recomendación de Remediación

  1. 1 Implementar rate limiting en el endpoint de login (5 intentos por minuto por IP)
  2. 2 Bloquear IP temporalmente después de intentos fallidos consecutivos
  3. 3 Usar CAPTCHA después de 3 intentos fallidos
  4. 4 Notificar al administrador sobre intentos de acceso sospechosos
CVSS 3.1 Score
7.5
High (CVSS:3.1/AV:N/AC:L/PR:N/UI:NWR:N)
CWE Relacionado
CWE-307: Improper Restriction of Excessive Authentication Attempts
CWE-799: Improper Control of Interaction Frequency

🟡 Vulnerabilidades Medias

MEDIO

Cabeceras de Seguridad HTTP Ausentes

VULN-006
Ubicación:
/next.config.ts

📋 Descripción

No se han configurado cabeceras de seguridad HTTP esenciales en Next.js. Estas cabeceras protegen contra ataques comunes como XSS, clickjacking, MIME sniffing y otros vectores de ataque.

⚡ Impacto

  • Vulnerabilidad a ataques XSS (Cross-Site Scripting)
  • Vulnerabilidad a clickjacking
  • MIME sniffing attacks
  • Falta de HTTPS enforcement

🔧 Cabeceras que Faltan

// next.config.ts - FALTAN:
// ❌ Content-Security-Policy (CSP)
// ❌ X-Frame-Options
// ❌ X-Content-Type-Options
// ❌ X-XSS-Protection
// ❌ Strict-Transport-Security (HSTS)
// ❌ Referrer-Policy
// ❌ Permissions-Policy

✅ Recomendación de Remediación

Agregar en next.config.ts:

const securityHeaders = [
  {
    key: 'Content-Security-Policy',
    value: "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.tailwindcss.com https://3nbf4.com; style-src 'self' 'unsafe-inline'; img-src 'self' https://image.tmdb.org data:; connect-src 'self' https://*.supabase.co https://api.themoviedb.org; frame-src 'self' https://streamtape.com https://goo.gl https://3nbf4.com"
  },
  { key: 'X-Frame-Options', value: 'SAMEORIGIN' },
  { key: 'X-Content-Type-Options', value: 'nosniff' },
  { key: 'X-XSS-Protection', value: '1; mode=block' },
  { key: 'Referrer-Policy', value: 'origin-when-cross-origin' },
  {
    key: 'Strict-Transport-Security',
    value: 'max-age=31536000; includeSubDomains'
  },
  {
    key: 'Permissions-Policy',
    value: 'camera=(), microphone=(), geolocation=()'
  }
]
CVSS 3.1 Score
5.3
Medium (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/SC:H/I:N/A:N)
CWE Relacionado
CWE-693: Protection Mechanism Failure
CWE-1021: Improper Restriction of Rendered UI Layers
MEDIO

Validación de Input Insuficiente

VULN-007
Ubicación:
/app/admin-secreto/page.tsx, Formularios

📋 Descripción

Los formularios del panel admin no tienen validación adecuada de inputs en server-side. Los campos como URLs de video, títulos y otros datos se aceptan sin sanitización, permitiendo potencialmente inyección de contenido malicioso o datos malformados.

⚡ Impacto

  • Almacenamiento de URLs maliciosas en la base de datos
  • XSS存储ado (Persistent XSS) si se muestran datos sin sanitizar
  • Datos corruptos en la base de datos

✅ Recomendación de Remediación

  1. 1 Validar tipos de datos en server-side (INT para IDs, TEXT con regex para URLs)
  2. 2 Sanitizar inputs (remover HTML tags, codificar caracteres especiales)
  3. 3 Validar URLs contra lista blanca de dominios de streaming conocidos
  4. 4 Implementar Zod o Yup para validación de esquemas
CVSS 3.1 Score
5.1
Medium (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L)
CWE Relacionado
CWE-20: Improper Input Validation
CWE-79: Cross-site Scripting (XSS)

🔵 Informativo

INFO

Configuración CORS Permisiva

INFO-001

📋 Descripción

La configuración de Next.js permite origins de desarrollo (localhost y 127.0.0.1). En producción, esta configuración podría permitir conexiones no autorizadas si no se actualiza correctamente.

✅ Recomendación

En producción, configurar origins específicos en lugar de patrones amplios. Usar variables de entorno para controlar origins permitidos.

INFO

Supabase RLS No Verificable

INFO-002

📋 Descripción

No se proporcionó el esquema de Row Level Security (RLS) de Supabase. La seguridad de la base de datos depende completamente de que RLS esté configurado correctamente en el panel de Supabase.

✅ Recomendación

Documentar y versionar las políticas RLS en el repositorio. Verificar que todas las tablas tengan políticas apropiadas. Auditar regularmente las políticas RLS en el dashboard de Supabase.

🎯 Escenarios de Ataque Simulados

Escenario 1: Acceso No Autorizado al Admin

1. Atacante visita https://alfredmovies.com/admin-secreto
2. Inspecciona el código fuente o usa DevTools para encontrar NEXT_PUBLIC_ADMIN_PASSWORD
3. Ingresa la contraseña en el formulario - Acceso concedido
4. Atacante tiene control total: crear, modificar, eliminar películas, series y canales deportivos
5. Inyecta URLs de streaming maliciosas para propagar malware

Escenario 2: Abuso de API Keys

1. Atacante obtiene la API key de TMDB de variables públicas
2. Hace miles de requests a la API de TMDB para obtener datos de películas
3. Almacena estos datos para crear un sitio competidor
4. Consume la cuota gratuita de TMDB, dejando a AlfredMovies sin acceso

Escenario 3: Compromiso de Service Worker

1. El dominio externo 3nbf4.com es comprometido
2. El script malicioso se actualiza en el servidor de 3nbf4.com
3. Service worker de AlfredMovies carga el nuevo script
4. Todos los usuarios reciben código malicioso: robo de cookies, redirección a phishing

📋 Plan de Remediación Priorizado

Prioridad Vulnerabilidad Tiempo Estimado Dificultad
CRÍTICA Autenticación Admin Insegura (VULN-001) 2-4 horas Media
CRÍTICA CRUD Sin Validación Server (VULN-002) 4-8 horas Alta
CRÍTICA Service Worker Externo (VULN-003) 1-2 horas Baja
ALTA API Keys Expuestas (VULN-004) 2-3 horas Media
ALTA Sin Rate Limiting (VULN-005) 1-2 horas Baja
MEDIA Cabeceras de Seguridad (VULN-006) 30 min - 1 hora Baja
MEDIA Validación de Input (VULN-007) 2-4 horas Media

📊 Tiempo Total Estimado

3 Críticas
8-14 horas
2 Altas
3-5 horas
2 Medias
2.5-5 horas
TOTAL
14-24 horas

🎯 Conclusión

El proyecto AlfredMovies/Peliculas presenta vulnerabilidades de seguridad críticas que requieren atención inmediata.

La arquitectura actual del panel admin es fundamentalmente insegura debido a la falta de autenticación server-side y validación de permisos. Un atacante con conocimiento básico de seguridad web puede obtener acceso completo al sistema de administración.

Se recomienda re-arquitectar completamente el sistema de autenticación utilizando Supabase Auth o JWTs con validación server-side, implementar API Routes para todas las operaciones CRUD, y configurar Row Level Security en la base de datos.

⚠️ Mientras estas vulnerabilidades no sean corregidas, el sitio es vulnerable a ataques que podrían comprometer datos de usuarios, inyectar contenido malicioso, y afectar la reputación del proyecto.