6.2 KiB
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.pypor uso deurllib.request.urlopensin validación estricta del esquema URL). - Remediación Aplicada:
- Se incorporó validación explícita de esquema (
url.startswith('https://')ourl.startswith('http://')) previo a la invocación deurlopen. - Se colocó anotación
# nosec B310justificando la protección criptográfica/red implementada.
- Se incorporó validación explícita de esquema (
- 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
Flaska>=3.1.3 - Actualización de
Werkzeuga>=3.1.6(instalada v3.1.8) - Actualización de
requestsa>=2.32.4(instalada v2.34.2) - Actualización de
bleacha>=6.4.0 - Actualización de
python-dotenva>=1.2.2(instalada v1.2.3)
- Actualización de
- 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/logincuando el payload enviado consistía en un arreglo JSON anómalo ([null, null]) en vez de un objeto/diccionario, provocando unTypeErroren 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': '...'}), 400tanto en/logincomo en/refresh.
- Se agregó validación de tipo
- 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: nosniffX-Frame-Options: SAMEORIGIN(prevención de Clickjacking)Strict-Transport-Security: max-age=31536000; includeSubDomains(HSTS)Cross-Origin-Opener-Policy: same-originCross-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.
- Endpoint
3.3. Auditoría de Dependencias (SCA) - npm audit
- Herramienta:
npm auditnativo (v11.x) - Comando:
cmd.exe /c npm auditenfrontend/ - 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 ✅ |