# Informe de seguridad

> **Proyecto:** acme/tienda-online (main)  
> **Auditoría:** VibeScan · 25/10/2026, 08:57:32  
> **Veredicto:** No publicar todavía · Postura 0/100 (F)

## Resumen

- **P0 (bloquean el lanzamiento):** 3
- **P1 (alta):** 2
- **P2 (media/baja):** 5
- **Total:** 10 · **Validados:** 8

> Hay 3 hallazgos críticos que un atacante puede aprovechar hoy. Resolvelos antes de abrir al público.

## P0 — 3 hallazgos

### [P0] Stripe Live Secret Key expuesto al navegador

- **Severidad:** Crítico · CVSS 9.1
- **Categoría:** A05:2021 Security Misconfiguration · CWE-798
- **Estado:** Confirmado / probado
- **Ubicación:** `src/components/Checkout.tsx:42`

**En criollo:** Una clave secreta de Stripe está incrustada en código que se envía al navegador. Cualquiera que abra tu app puede leerla y cobrar o reembolsar en tu nombre.

**Detalle técnico:** Clave `sk_live_…` referenciada desde un componente de cliente; termina en el bundle servido en /_next/static.

**Corrección:** Rotá la clave YA (asumila comprometida). Movela a una variable de entorno del lado servidor y cobrá desde un endpoint/BFF; nunca la referencies en el cliente.

```bash
# rotar la clave en el dashboard de Stripe
git rm --cached .env
```

Referencias: [CWE-798](https://cwe.mitre.org/data/definitions/798.html)

---

### [P0] Inyección SQL confirmada (error-based)

- **Severidad:** Crítico · CVSS 9.3
- **Categoría:** A03:2021 Injection · CWE-89
- **Estado:** Confirmado / probado
- **Ubicación:** `https://tienda-online.com/api/products?q=1%27%22`

**En criollo:** Confirmamos que el buscador permite manipular la base de datos. Un atacante podría leer o borrar datos de todos tus clientes.

**Detalle técnico:** El parámetro `q` (GET /api/products) provocó un error del motor MySQL al inyectar comillas.

**Corrección:** Usá consultas parametrizadas / prepared statements. Nunca concatenes entrada del usuario en SQL.

Referencias: [OWASP SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection)

---

### [P0] lodash@4.17.11 — CVE-2021-23337

- **Severidad:** Crítico · CVSS 9.1
- **Categoría:** A06:2021 Vulnerable & Outdated Components
- **Estado:** Confirmado / probado
- **Ubicación:** `package.json`

**En criollo:** La librería lodash que usás tiene una vulnerabilidad conocida (inyección de comandos). Ya existe versión corregida (4.17.21).

**Detalle técnico:** Command injection en lodash < 4.17.21. Paquete: lodash@4.17.11 (npm).

**Corrección:** Actualizá lodash a 4.17.21 o superior. Corré tests y build para confirmar que no rompe nada.

```bash
npm install lodash@4.17.21
```

Referencias: [CVE-2021-23337](https://nvd.nist.gov/vuln/detail/CVE-2021-23337)

---
## P1 — 2 hallazgos

### [P1] XSS confirmado (ejecución en el navegador)

- **Severidad:** Alto · CVSS 7.6
- **Categoría:** A03:2021 Injection · CWE-79
- **Estado:** Confirmado / probado
- **Ubicación:** `https://tienda-online.com/buscar?search=…`

**En criollo:** Confirmamos que un atacante puede ejecutar JavaScript en el navegador de tus usuarios a través del buscador (robo de sesión, acciones en su nombre).

**Detalle técnico:** El parámetro `search` se refleja sin escapar; el payload ejecutó JS en un navegador real.

**Corrección:** Escapá/encodeá la salida según contexto; para HTML dinámico usá DOMPurify. Sumá una CSP estricta.

Referencias: [OWASP XSS](https://owasp.org/www-community/attacks/xss/)

---

### [P1] IDOR: pedido accedido por id sin chequeo de pertenencia

- **Severidad:** Alto · CVSS 7.6
- **Categoría:** A01:2021 Broken Access Control · CWE-639
- **Estado:** No confirmado (requiere validación dinámica)
- **Ubicación:** `src/app/api/orders/[id]/route.ts:18`

**En criollo:** Se trae un pedido usando el id de la URL sin verificar que sea del usuario que pide. Otro usuario podría ver pedidos ajenos cambiando el número.

**Detalle técnico:** findUnique({ where: { id: req.params.id } }) sin filtrar por userId. Requiere confirmación dinámica.

**Corrección:** Filtrá siempre por el dueño: where: { id, userId: session.user.id }. Verificá pertenencia antes de responder.

Referencias: [OWASP Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/)

---
## P2 — 5 hallazgos

### [P2] Faltan headers de seguridad (4)

- **Severidad:** Medio · CVSS 5.4
- **Categoría:** A05:2021 Security Misconfiguration · CWE-693
- **Estado:** Confirmado / probado
- **Ubicación:** `https://tienda-online.com/`

**En criollo:** La app no envía varias cabeceras de seguridad. Facilita clickjacking y otros ataques desde el navegador.

**Detalle técnico:** Ausentes: Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Strict-Transport-Security.

**Corrección:** Configurá CSP restrictiva, X-Frame-Options DENY, nosniff y HSTS.

---

### [P2] Open redirect

- **Severidad:** Medio · CVSS 5.4
- **Categoría:** A01:2021 Broken Access Control · CWE-601
- **Estado:** Confirmado / probado
- **Ubicación:** `https://tienda-online.com/login?next=https://evil.example/`

**En criollo:** El parámetro `next` permite redirigir a cualquier sitio externo. Se usa para phishing con enlaces que parecen tuyos.

**Detalle técnico:** GET /login?next=… redirige con 302 a un host externo arbitrario.

**Corrección:** Validá el destino contra una lista blanca de rutas propias; no redirijas a URLs absolutas del usuario.

---

### [P2] Sin CI: nada impide publicar algo roto

- **Severidad:** Medio
- **Categoría:** Quality & Architecture
- **Estado:** Confirmado / probado
- **Ubicación:** `(repositorio)`

**En criollo:** No hay integración continua. Cada cambio se puede publicar sin que nada verifique antes que compila o pasan los tests.

**Detalle técnico:** No se encontró configuración de CI (.github/workflows, etc.).

**Corrección:** Agregá un workflow que en cada PR corra install, lint, typecheck, tests, build y escaneo de secretos/dependencias, y bloquee el merge si falla.

---

### [P2] Sin tests automatizados detectados

- **Severidad:** Medio
- **Categoría:** Quality & Architecture
- **Estado:** No confirmado (requiere validación dinámica)
- **Ubicación:** `(repositorio)`

**En criollo:** No encontramos tests. Cada arreglo puede romper algo sin que nadie se entere hasta que lo sufre un usuario.

**Detalle técnico:** No se detectaron archivos de test (*.test.*, *.spec.*, __tests__/).

**Corrección:** Incorporá tests de los flujos críticos (auth, pagos, acceso a datos). Cada bug corregido deja un test que lo previene.

---

### [P2] Sin lockfile de dependencias

- **Severidad:** Bajo
- **Categoría:** A08:2021 Software & Data Integrity Failures
- **Estado:** Confirmado / probado
- **Ubicación:** `(repositorio)`

**En criollo:** No hay archivo que fije las versiones exactas de las librerías; builds no reproducibles y más riesgo de cadena de suministro.

**Detalle técnico:** Falta package-lock.json / pnpm-lock.yaml / yarn.lock.

**Corrección:** Generá y commiteá el lockfile. Usá npm ci en CI/despliegue.

```bash
npm install
git add package-lock.json
```

---
