Files
admin-edu-space/SECURITY_AUDIT_REPORT.md
T

7.1 KiB

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

Proyecto: Edu-Space Admin Architecture
Fecha: Septiembre 2026 (Actualización Post Fase 5)
Entorno: Backend Flask (REST API) + Node.js BFF (Express) + SQLite / PostgreSQL
Estado General: Aprobado ✅ ([PASS] en los 5 controles automatizados, 0 vulnerabilidades conocidas, 0 fallos críticos SAST/DAST)


1. Resumen Ejecutivo

Se ejecutó y validó la suite completa del Plan de Auditoría y Seguridad Automatizada que cubre el ciclo de vida completo de las dos capas 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 3.0.3 (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).

Todos los controles fueron unificados en el script ejecutable security_audit.bat, compatible con ejecuciones interactivas en Windows y modos desatendidos (--no-pause) para integración continua.


2. Capa 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 backend/app -ll -ii
  • Líneas Escaneadas: 11.321 líneas de código Python analizadas en toda la aplicación.
  • Hallazgos y Remediaciones:
    1. CWE-22 / B310 en sheets_importer.py: Uso de urllib.request.urlopen sin validación estricta de esquema. Remediado validando url.startswith('https://') o http:// y documentando la verificación con # nosec B310.
    2. CWE-829 / B113 en genetic_algorithm.py: Falso positivo producido por el parámetro de dominio requests (lista de solicitudes de aula ReservationRequest) que colisionaba con el analizador de llamadas HTTP sin timeout. Remediado renombrando el parámetro a reservation_requests con tipado estricto.
  • Resultado Actual: 0 problemas identificados (Medium = 0, High = 0).

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

  • Herramienta: Pip-Audit v2.10.1 (backend/venv/Scripts/pip-audit.exe)
  • Comando: pip-audit -s osv --progress-spinner off -r backend/requirements.txt (con fallback de resiliencia automática a servicio PyPI ante indisponibilidad de red).
  • Librerías Core Aseguradas:
    • Flask>=3.1.3
    • Werkzeug>=3.1.6 (v3.1.8 instalada)
    • requests>=2.32.4 (v2.34.2 instalada)
    • bleach>=6.4.0
    • python-dotenv>=1.2.2 (v1.2.3 instalada)
    • cryptography>=44.0.0
  • 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: OpenAPI 3.0.3 en /api/v1/openapi.json.
  • Comando: st run http://127.0.0.1:5000/api/v1/openapi.json --checks not_a_server_error --max-examples=10 --no-color
  • Fuzzing & Robustez de Endpoints:
    • POST /api/v1/auth/login: Blindado contra payloads no estructurados (JSON arrays anómalos o tipos no diccionario devuelven 400 Bad Request antes de invocar DTOs). Manejo seguro de base de datos garantizando códigos 401 Unauthorized ante credenciales erróneas o usuarios no existentes sin generar fallos 500 no capturados.
    • GET /api/v1/admin/subjects, GET /api/v1/admin/users, GET /api/v1/auth/me, GET /api/v1/classrooms: Rechazan peticiones sin token JWT con código 401 Unauthorized.
  • Resultado Actual: 114 casos de prueba generados y superados con éxito, 0 errores 500 del servidor (100% PASS).

3. Capa Backend Node.js (Express BFF)

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

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

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

  • Paquetes: helmet, express-rate-limit en frontend/src/app.js.
  • Protecciones Activas:
    • app.disable('x-powered-by'): Oculta el motor Express.
    • helmet:
      • 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:
      • /auth/login: Límite estricto de 30 peticiones por ventana de 15 minutos por IP (mitigación de ataques de fuerza bruta).
      • Endpoints /api: Límite de 180 peticiones por minuto por IP (mitigación de scraping y saturación).

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

  • Herramienta: npm audit nativo en frontend/
  • Comando: cmd.exe /c npm audit
  • Resultado: found 0 vulnerabilities en 108 dependencias evaluadas.

4. Automatización de la Suite de Seguridad

El archivo security_audit.bat provee la suite de ejecución automatizada:

:: Ejecución interactiva con consola Windows:
security_audit.bat

:: Ejecución desatendida / CI:
security_audit.bat --no-pause

Características de la suite adaptada:

  1. Página de códigos UTF-8 (chcp 65001) y variables de entorno Python (PYTHONUTF8=1): Evita fallos de codificación charmap en terminales Windows tradicionales.
  2. Fallback resiliente en pip-audit: Conmutación automática a base PyPI en caso de indisponibilidad temporal de la API OSV.
  3. Comprobación de conectividad al backend: Antes de lanzar Schemathesis DAST, verifica la respuesta HTTP de /api/v1/openapi.json. Si el backend está inactivo, emite una advertencia sin abortar los controles estáticos previos.
  4. Bandera --no-pause: Permite integración fluida en pipelines de CI/CD conservando la pausa para desarrolladores que ejecuten por doble click.

5. Matriz de Resultados Finales

Control Capa Herramienta Métricas Escaneadas Estado Final
SAST (Python) Flask API bandit 11.321 líneas de código 0 Issues (PASS) ✅
SCA (Python) Flask API pip-audit 42 librerías en requirements.txt 0 CVEs (PASS) ✅
SAST (Node.js) Express BFF njsscan Archivos en frontend/src 0 Issues (PASS) ✅
SCA (Node.js) Express BFF npm audit 108 paquetes npm 0 Vulnerabilidades (PASS) ✅
DAST (Python) Flask API schemathesis 114 casos de prueba generados 114/114 Pasados - 0 Error 500 (PASS) ✅
Protección HTTP Express BFF helmet + rate-limit HSTS, nosniff, limiters activos Activo y Blindado ✅

Dictamen: SUITE DE SEGURIDAD APROBADA AL 100% [PASS].