<aside> 📝
Proyecto: vulnerable-node (PsEA v1.0) | Autor: NextCode Team | Fecha: 2026-02-08 | Status: Complete
</aside>
<aside> 🚨
Friction Score: HIGH — Múltiples bloqueantes identificados para onboarding de nuevos desarrolladores. Zero tooling moderno. Todas las dependencias están desactualizadas (2015-2016). Sin tests, sin linter, sin CI/CD.
</aside>
Propósito del proyecto: Aplicación e-commerce intencionalmente vulnerable diseñada para educación en seguridad, evaluación de herramientas SAST y práctica de pentesting.
Tech Stack:
| Componente | Tecnología | Versión | Estado |
|---|---|---|---|
| Framework | Express.js | ~4.13.1 | Obsoleto (2015) |
| Runtime | Node.js | 19.4.0 | EOL |
| Base de Datos | PostgreSQL | 15.1 | Soportado |
| ORM / Query | pg-promise | ^4.4.6 | Muy obsoleto |
| Template Engine | EJS + ejs-locals | ^2.4.2 / ^1.0.2 | CVEs + Abandonado |
| Sesión | express-session | ^1.13.0 | Usa MemoryStore (leaks) |
| Logging | log4js + Morgan | ^0.6.36 / ~1.6.1 | API deprecated |
| Contenedores | Docker + Compose | v3.9 | Funcional |
| Prerequisito | Requerido | Documentado | Fricción |
|---|---|---|---|
| Docker & Docker Compose | Sí | Sí (README) | LOW |
| Node.js 19.x | Solo dev local | No (solo en Dockerfile) | MEDIUM |
| PostgreSQL 15.1 | Via Docker o local | Parcial | HIGH (local) |
| Git | Sí | Implícito | LOW |
<aside> 🐳
Ruta Docker (recomendada): docker-compose build && docker-compose up — funciona en 2 comandos, ~3 min build. Es la única ruta viable sin fricción.
</aside>
<aside> 💻
Ruta Local: Requiere PostgreSQL manual, variable STAGE=LOCAL, npm install. No documentada en README. El default de config apunta a IP privada 10.211.55.70 (VM Parallels) — falla garantizada para cualquier otro desarrollador.
</aside>
| # | Punto de Fricción | Severidad | Archivo | Descripción |
|---|---|---|---|---|
| F-01 | Sin .env ni .env.example |
HIGH | config.js |
Todas las configuraciones hardcoded. Sin soporte para variables de entorno para secretos. |
| F-02 | Sin engines en package.json |
MEDIUM | package.json |
Versión de Node no documentada; solo el Dockerfile la revela (19.4.0). |
| F-03 | Sin .nvmrc / .node-version |
MEDIUM | Raíz | No hay pinning de versión de Node para desarrollo local. |
| F-04 | IP hardcoded en config DEVEL | HIGH | config.js:12 |
10.211.55.70 es IP de VM Parallels — inutilizable para cualquier otro dev. |
| F-05 | Default fallback a DEVEL | MEDIUM | config.js:42 |
Si STAGE no está definido, usa config DEVEL con IP privada — falla garantizada. |
| F-06 | Sin npm run dev / watch mode |
MEDIUM | package.json |
Solo npm start; sin hot reload ni nodemon para desarrollo. |
| F-07 | body-parser deprecated usage | LOW | app.js:38 |
app.use(bodyParser()) está deprecated desde Express 4.16. |
| F-08 | log4js API deprecated | LOW | app.js:19-21 |
loadAppender y addAppender fueron removidos en log4js moderno. |
| F-09 | Sin README para dev local | HIGH | README.md |
README solo cubre Docker path; desarrollo local no documentado. |
| F-10 | Typo get_purcharsed |
LOW | model/products.js:44 |
Nombre de función con typo (debería ser get_purchased). |
| Paquete | Versión Actual | EOL/Deprecated | Riesgo de Seguridad | Propósito |
|---|---|---|---|---|
| express | ~4.13.1 | Obsoleto (2015) | HIGH - CVEs conocidos | Web framework |
| ejs | ^2.4.2 | Obsoleto | HIGH - RCE en versiones viejas | Template engine |
| ejs-locals | ^1.0.2 | Abandonado (2013) | HIGH - Sin mantenimiento | EJS layout support |
| pg-promise | ^4.4.6 | Muy desactualizado | MEDIUM | PostgreSQL client |
| express-session | ^1.13.0 | Obsoleto | MEDIUM - MemoryStore leaks | Session management |
| log4js | ^0.6.36 | Muy obsoleto, API cambiada | HIGH - Breaking changes | Logging |
| body-parser | ~1.13.2 | Integrado en Express | LOW | Request body parsing |
| cookie-parser | ~1.3.5 | Obsoleto | LOW | Cookie parsing |
| morgan | ~1.6.1 | Obsoleto | LOW | HTTP request logging |
| serve-favicon | ~2.3.0 | Obsoleto | LOW | Favicon serving |
| debug | ~2.2.0 | Obsoleto | LOW | Debug utility |