# 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](file:///c:/Users/Soporte%20IT/workspace/admin-edu-space/security_audit.bat) en la raíz del repositorio, ejecutable en un solo paso: ```cmd 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** ✅ |