# 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](file:///c:/Users/Soporte%20IT/workspace/admin-edu-space/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](file:///c:/Users/Soporte%20IT/workspace/admin-edu-space/security_audit.bat) provee la suite de ejecución automatizada: ```cmd :: 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]**.