Files
admin-edu-space/SECURITY_AUDIT_REPORT.md
T

6.2 KiB

Informe de Auditoría y Seguridad Automatizada (Python & Node.js)

Proyecto: Edu-Space Admin Architecture
Fecha: Septiembre 2026
Entorno: Backend Flask (REST API) + Node.js BFF (Express)
Estado General: Aprobado ✅ (0 vulnerabilidades conocidas, 0 fallos críticos SAST/DAST)


1. Resumen Ejecutivo

Se completó la implementación del Plan de Auditoría y Seguridad Automatizada que cubre el ciclo de vida completo de las dos capas backend de la plataforma:

  • Capa Core API (Python / Flask): Análisis Estático (SAST), Análisis de Dependencias de Terceros (SCA), Pruebas Dinámicas / Fuzzing contra especificación OpenAPI (DAST).
  • Capa BFF / Frontend Server (Node.js / Express): Análisis Estático (SAST), Análisis de Dependencias (SCA) y Blindaje Activo con cabeceras HTTP (helmet) y limitador de tasa (express-rate-limit).

2. Fase 1: Backend Python (Flask API)

2.1. Análisis Estático de Código Fuente (SAST) - Bandit

  • Herramienta: Bandit v1.8.3 (backend/venv/Scripts/bandit.exe)
  • Comando: bandit -r ./app -ll -ii
  • Líneas Escaneadas: 8.456 líneas de código Python.
  • Hallazgo Inicial: 1 advertencia de severidad Media (CWE-22 / B310 en backend/app/services/sheets_importer.py por uso de urllib.request.urlopen sin validación estricta del esquema URL).
  • Remediación Aplicada:
    • Se incorporó validación explícita de esquema (url.startswith('https://') o url.startswith('http://')) previo a la invocación de urlopen.
    • Se colocó anotación # nosec B310 justificando la protección criptográfica/red implementada.
  • Resultado Actual: 0 problemas identificados (Medium/High = 0).

2.2. Auditoría de Dependencias de Terceros (SCA) - Pip-Audit

  • Herramienta: Pip-Audit v2.10.1 con base de datos OSV (backend/venv/Scripts/pip-audit.exe)
  • Comando: pip-audit -s osv --progress-spinner off -r requirements.txt
  • Hallazgo Inicial: 24 vulnerabilidades conocidas asociadas a dependencias desactualizadas (Flask==3.0.0, Werkzeug==3.0.1, requests==2.31.0, bleach==6.1.0, python-dotenv==1.0.0).
  • Remediaciones Aplicadas:
    • Actualización de Flask a >=3.1.3
    • Actualización de Werkzeug a >=3.1.6 (instalada v3.1.8)
    • Actualización de requests a >=2.32.4 (instalada v2.34.2)
    • Actualización de bleach a >=6.4.0
    • Actualización de python-dotenv a >=1.2.2 (instalada v1.2.3)
  • Resultado Actual: No known vulnerabilities found (0 CVEs pendientes).

2.3. Pruebas Dinámicas y Fuzzing de API REST (DAST) - Schemathesis

  • Herramienta: Schemathesis v4.27.4 (backend/venv/Scripts/st.exe)
  • Especificación OpenAPI: Implementada en backend/app/routes/api/openapi.py (/api/v1/openapi.json) bajo el estándar OpenAPI 3.0.3.
  • Comando: st run http://127.0.0.1:5000/api/v1/openapi.json --checks not_a_server_error --max-examples=10
  • Hallazgo Inicial: Fuzzing detectó un error 500 no controlado en POST /api/v1/auth/login cuando el payload enviado consistía en un arreglo JSON anómalo ([null, null]) en vez de un objeto/diccionario, provocando un TypeError en el constructor de Pydantic (LoginDTO(**data)).
  • Remediación Aplicada:
    • Se agregó validación de tipo if not isinstance(data, dict): return jsonify({'error': 'BadRequest', 'message': '...'}), 400 tanto en /login como en /refresh.
  • Resultado Actual: 114 casos de prueba generados y superados con éxito, 0 errores 500 del servidor.

3. Fase 2: Backend Node.js (Express BFF)

3.1. Análisis Estático de Código Fuente (SAST) - njsscan

  • Herramienta: NodeJsScan (backend/venv/Scripts/njsscan.exe)
  • Comando: njsscan ./frontend/src
  • Reglas Evaluadas: Inyecciones de código, llamadas inseguras a eval(), omisión de headers de seguridad, credenciales hardcodeadas, CORS inseguro.
  • Resultado: No issues found (0 vulnerabilidades).

3.2. Blindaje de Middleware (helmet & express-rate-limit)

  • Paquetes Instalados: helmet, express-rate-limit.
  • Configuración en frontend/src/app.js:
    • app.disable('x-powered-by'): Oculta el motor Express para prevenir finger-printing de atacantes.
    • helmet: Aplica cabeceras HTTP de protección:
      • X-Content-Type-Options: nosniff
      • X-Frame-Options: SAMEORIGIN (prevención de Clickjacking)
      • Strict-Transport-Security: max-age=31536000; includeSubDomains (HSTS)
      • Cross-Origin-Opener-Policy: same-origin
      • Cross-Origin-Resource-Policy: same-origin
    • express-rate-limit:
      • Endpoint /auth/login: Límite estricto de 30 peticiones por ventana de 15 minutos por IP para mitigar ataques de fuerza bruta de credenciales.
      • Endpoints /api: Límite de 180 peticiones por minuto por IP para mitigar saturación y scraping.

3.3. Auditoría de Dependencias (SCA) - npm audit

  • Herramienta: npm audit nativo (v11.x)
  • Comando: cmd.exe /c npm audit en frontend/
  • Resultado: found 0 vulnerabilities en 108 paquetes analizados.

4. Script de Auditoría Automatizada Unificada

Se diseñó y probó el script automatizado security_audit.bat en la raíz del repositorio, ejecutable en un solo paso:

security_audit.bat

El script ejecuta secuencialmente los 5 controles de seguridad y genera un reporte en consola para desarrolladores y pipelines de integración continua.


5. Matriz de Resultados

Control Capa Herramienta Estado Previo Estado Final
SAST (Python) Flask API bandit 1 Advertencia Media (B310) 0 Problemas (100% Limpio) ✅
SCA (Python) Flask API pip-audit 24 Vulnerabilidades (CVEs) 0 Vulnerabilidades ✅
DAST (Python) Flask API schemathesis 1 Fallo HTTP 500 (payload fuzzing) 0 Fallos (114/114 Pasados) ✅
SAST (Node.js) Express BFF njsscan Sin controles previos 0 Problemas (100% Limpio) ✅
SCA (Node.js) Express BFF npm audit No auditado con Helmet 0 Vulnerabilidades ✅
Blindaje HTTP Express BFF helmet + rate-limit Cabeceras por defecto Protegido con HSTS, nosniff, limiters ✅