Prompt file imported from ergrato-dev/bc-mongodb-ce (
.github/prompts/security-review.prompt.md). Fill in{{userPrice}}before use. Copyright stays with the author.
Security Review — OWASP Top 10 para MongoDB CE
Revisa el código indicado aplicando los 10 riesgos de seguridad más críticos según OWASP, adaptados al stack del bootcamp (MongoDB 7.0, Node.js, mongosh).
OWASP A01 — Broken Access Control
Riesgos en MongoDB:
- Usuarios con rol
rootodbAdmindonde solo se necesitareadWrite - Colecciones sin autenticación habilitada en el contenedor
- Rutas de API (si hay Node.js) sin verificación de permisos antes de operar
Checklist:
- ¿Los scripts usan el usuario
bootcampconreadWrite(noroot)? - ¿El contenedor Docker tiene
--authhabilitado? - ¿No hay operaciones
db.dropDatabase()accesibles sin rol explícito? - ¿Los archivos
.envno se commitean al repositorio?
Ejemplo de corrección:
// ❌ Conectar como root en scripts de ejercicios
mongosh -u root -p rootpassword --authenticationDatabase admin
// ✅ Usar usuario con mínimos privilegios
mongosh -u bootcamp -p bootcamp123 --authenticationDatabase admin bootcamp_db
OWASP A02 — Cryptographic Failures
Riesgos en MongoDB:
- Contraseñas almacenadas en texto plano en documentos
- Secretos hardcodeados en scripts
.jso endocker-compose.yml - Credenciales reales en
.env.example(en lugar de placeholders)
Checklist:
- ¿Los documentos de prueba usan
passwordHash(nuncapassworden plano)? - ¿El
docker-compose.ymlusa variables de entorno desde.env? - ¿El
.env.exampletiene solo placeholders (no valores reales)? - ¿El
.envestá en.gitignore?
Ejemplo de corrección:
// ❌ Contraseña en texto plano
db.users.insertOne({ email: "user@example.com", password: "secret123" });
// ✅ Hash de contraseña (bcrypt en producción)
db.users.insertOne({ email: "user@example.com", passwordHash: "$2b$10$..." });
OWASP A03 — Injection
Riesgos en MongoDB:
- Construcción de queries con concatenación de strings (NoSQL Injection)
- Uso de
$wherecon input del usuario (ejecución de JavaScript del servidor) - Uso de
mapReducecon código generado dinámicamente
Checklist:
- ¿No hay queries construidas con concatenación de strings?
- ¿Se evita
$wherecon datos del usuario? - ¿Los filtros de ejemplo usan valores literales, no variables sin sanitizar?
- ¿En código Node.js, los inputs se validan antes de pasarlos a queries?
Ejemplo de corrección:
// ❌ NoSQL Injection — input del usuario concatenado
const userInput = '{ $gt: "" }'; // input malicioso
db.users.find({ password: JSON.parse(userInput) }); // bypass de auth
// ✅ Validar tipo y usar valores literales
db.users.find({ email: "user@example.com" });
// ❌ $where con input del usuario
db.products.find({ $where: `this.price > {{userPrice}}` });
// ✅ Usar operadores nativos
db.products.find({ price: { $gt: NumberInt(100) } });
OWASP A04 — Insecure Design
Riesgos en MongoDB:
- Sin paginación en consultas a colecciones grandes (exfiltración de datos)
- Pipelines que exponen campos sensibles sin proyección
- Colecciones sin índices en campos de consulta frecuente (DoS por COLLSCAN)
Checklist:
- ¿Las queries de ejemplo incluyen
.limit()o$limitcuando aplica? - ¿Las proyecciones excluyen campos sensibles (
passwordHash, tokens)? - ¿Las colecciones de datos de prueba tienen índices en campos de búsqueda?
OWASP A05 — Security Misconfiguration
Riesgos en MongoDB:
- Puerto 27017 expuesto a internet sin autenticación
mongodcorriendo sin--authen la configuración- Binds a
0.0.0.0sin firewall en entornos distintos al local
Checklist:
- ¿El
docker-compose.ymlexpone el puerto solo a127.0.0.1? - ¿Está habilitada la autenticación en el contenedor?
- ¿No hay configuración
bindIp: 0.0.0.0sin protección adicional?
Ejemplo de corrección:
# ❌ Puerto expuesto a todas las interfaces
ports:
- "27017:27017"
# ✅ Solo accesible desde localhost
ports:
- "127.0.0.1:27017:27017"
OWASP A06 — Vulnerable and Outdated Components
Riesgos en MongoDB:
- Imagen Docker de MongoDB sin versión fija (usando
latest) - Drivers de Node.js con CVEs conocidos
- Versiones flotantes en
package.jsonde proyectos starter
Checklist:
- ¿El
docker-compose.ymlusamongo:7.0(nomongo:latest)? - ¿Los
package.jsonde starter/solution usan versiones exactas (sin^,~)? - ¿
pnpm audit --audit-level moderatepasa sin vulnerabilidades?
OWASP A07 — Identification and Authentication Failures
Riesgos en MongoDB:
- Credenciales por defecto sin cambiar en producción
- Sin roles RBAC definidos para usuarios de aplicación
- Acceso como
admindesde la aplicación cuando solo se necesitareadWrite
Checklist:
- ¿Las credenciales de desarrollo (
bootcamp/bootcamp123) están claramente marcadas como solo para entorno local? - ¿Los scripts de producción (si los hay) usan variables de entorno?
- ¿No hay usuarios creados sin contraseña?
OWASP A08 — Software and Data Integrity Failures
Riesgos en MongoDB:
$jsonSchemaausente en colecciones que lo requieren- Sin validación de tipos BSON en inserciones masivas
- CI/CD que despliega sin revisar the integridad de scripts
Checklist:
- ¿Las colecciones importantes tienen validación
$jsonSchema? - ¿Los
setup.jsusan tipos BSON correctos (Decimal128,NumberInt,new Date())? - ¿El pipeline de CI incluye verificación de sintaxis de scripts?
OWASP A09 — Security Logging and Monitoring Failures
Riesgos en MongoDB:
- Sin logs de operaciones de autenticación fallidas
- Logs con datos sensibles (contraseñas, tokens en queries)
- Sin monitorización de operaciones lentas (slow query log)
Checklist:
- ¿El
docker-compose.ymlhabilita el slow query log (--slowms)? - ¿Los scripts de ejemplo no loguean valores sensibles con
print()?
OWASP A10 — Server-Side Request Forgery (SSRF)
Riesgos en MongoDB:
- Change Streams o webhooks que aceptan URLs externas sin validación
- Atlas Data Federation con fuentes de datos no validadas
Checklist:
- ¿Los ejemplos de Change Streams no exponen endpoints sin autenticación?
- ¿No hay ejemplos que hagan fetch a URLs proporcionadas por el usuario?
Instrucciones para el agente
- Leer todos los archivos en la ruta indicada
- Para cada riesgo OWASP, verificar los ítems del checklist
- Reportar los problemas encontrados con:
- Archivo y línea donde ocurre
- Descripción del riesgo
- Código actual problemático
- Código corregido sugerido
- Si no hay problemas en un área, indicar "✅ Sin problemas detectados"
- Ordenar por severidad: Alto → Medio → Bajo
- Al final, dar un resumen ejecutivo con el número de issues por categoría
Ruta a revisar
$input