CreaRack-SL

Auditoría de Seguridad y Licencias - CreaRack Pro

Auditoría de Seguridad y Licencias - CreaRack Pro

Documento de referencia obligatoria al instalar nuevas dependencias. Última auditoría: 06-02-2026 Versión auditada: v6.5.9


Resumen Ejecutivo

CategoríaEstadoObservaciones
Configuración de seguridad✅ OKHTTPS, HSTS, CSRF configurados
Vulnerabilidades código✅ OKinnerHTML protegido con escapeHtml()
Rate Limiting✅ OKMiddleware implementado (100 req/min)
Content Security Policy✅ OKCSP middleware con directivas estrictas
Licencias Python✅ OKTodas compatibles (MIT, BSD, Apache)
Licencias JavaScript✅ OKMIT, Apache
Datos sensibles✅ OK.env en .gitignore
OWASP Top 10✅ OKSin vulnerabilidades críticas

1. Configuración de Seguridad Django

1.1 Producción (config/settings/production.py)

SettingValorEstado
DEBUGFalse✅ Correcto
SECURE_SSL_REDIRECTTrue✅ Fuerza HTTPS
SESSION_COOKIE_SECURETrue✅ Cookies solo HTTPS
CSRF_COOKIE_SECURETrue✅ CSRF solo HTTPS
SECURE_HSTS_SECONDS31536000✅ 1 año HSTS
SECURE_HSTS_INCLUDE_SUBDOMAINSTrue✅ Incluye subdominios
SECURE_HSTS_PRELOADTrue✅ Preload list
SECURE_CONTENT_TYPE_NOSNIFFTrue✅ Previene MIME sniffing
X_FRAME_OPTIONSDENY✅ Previene clickjacking
SECURE_BROWSER_XSS_FILTERTrue✅ Filtro XSS navegador

1.2 Desarrollo (config/settings/base.py)

SettingValorNota
SESSION_COOKIE_HTTPONLYTrue✅ No accesible desde JS
SESSION_COOKIE_SAMESITELax✅ Protección CSRF
SESSION_COOKIE_SECUREFalse⚠️ Normal en dev (True en prod)
SECRET_KEYDesde .env✅ No hardcodeada

1.3 Middleware de Seguridad

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",      # ✅
    "django.middleware.csrf.CsrfViewMiddleware",          # ✅
    "django.middleware.clickjacking.XFrameOptionsMiddleware",  # ✅
]

2. Análisis de Vulnerabilidades (OWASP Top 10)

2.1 Injection (A03:2021)

TipoEstadoDetalle
SQL Injection✅ SeguroUsa Django ORM exclusivamente
Command Injection⚠️ Controladolocal_agent.py ejecuta comandos SSH - validados
Template Injection✅ SeguroNo usa mark_safe ni `

Archivos revisados:

  • No se encontró uso directo de cursor.execute() con strings sin parametrizar
  • No se encontró uso de mark_safe que podría inyectar HTML

2.2 Cross-Site Scripting - XSS (A07:2021)

PatrónOcurrenciasRiesgo
innerHTML =100 en 18 archivos✅ Mitigado
document.write0✅ Ninguno
eval()0 (excepto libs)✅ Ninguno

Análisis Detallado de innerHTML (100 usos)

Clasificación por riesgo:

CategoríaCantidadRiesgoEstado
HTML estático/templates~70✅ BajoNo requiere acción
Datos del servidor~25✅ SolucionadoProtegido con escapeHtml()
Datos de usuario directo~5✅ SolucionadoProtegido con escapeHtml()

Archivos con usos de innerHTML:

ArchivoUsosEstadoFecha Fix
network_tools.js34✅ Protegido29-01-2026
import_export.js10✅ Protegido29-01-2026
backups.js9✅ Protegido29-01-2026
base.js9✅ Protegido29-01-2026
sftp_ui.js4✅ Protegido29-01-2026
script_manager.js4✅ Protegido29-01-2026
dashboard.js5✅ Bajo (estático)N/A

Mitigación Implementada (29-01-2026)

Función escapeHtml() añadida a static/js/base.js:

/**
 * Escapes HTML special characters to prevent XSS attacks.
 * @param {string} str - The string to escape
 * @returns {string} - HTML-escaped string
 */
function escapeHtml(str) {
    if (str === null || str === undefined) return '';
    const div = document.createElement('div');
    div.textContent = String(str);
    return div.innerHTML;
}
window.escapeHtml = escapeHtml;  // Disponible globalmente

Casos corregidos:

ArchivoLíneaVariableAntesDespués
base.js131message${message}${escapeHtml(message)}
import_export.js183err.error${err.error}${escapeHtml(err.error)}
import_export.js460cat.name${cat.name}${escapeHtml(cat.name)}
backups.js620e.message${e.message}${escapeHtml(e.message)}
sftp_ui.js169msg${msg}${escapeHtml(msg)}
script_manager.js74error.message${error.message}${escapeHtml(error.message)}
network_tools.js1869port, serviceName${port}${escapeHtml(port)}

Casos de Riesgo Bajo (No requieren acción)

Los ~70 casos restantes son HTML estático/templates que:

  • No incluyen variables interpoladas con datos externos
  • Son estructuras de UI predefinidas (tablas, layouts)
  • El esfuerzo de refactorización no justifica el beneficio nulo

Ejemplo de caso de riesgo bajo (NO requiere cambio):

// HTML completamente estático - seguro
resultsDiv.innerHTML = `
    <table class="results-table">
        <thead><tr><th>IP</th><th>Status</th></tr></thead>
        <tbody id="results-tbody"></tbody>
    </table>
`;

Recomendaciones Pendientes

PrioridadAcciónEstado
AltaCrear función escapeHtml() centralizada✅ Completado
AltaSanitizar datos dinámicos en frontend✅ Completado
MediaImplementar CSP (Content Security Policy)🔲 Pendiente

Guía para Nuevos Desarrollos

OBLIGATORIO usar escapeHtml() cuando:

  • Se inserta cualquier dato del servidor en innerHTML
  • Se muestran mensajes de error
  • Se muestran nombres de entidades (categorías, usuarios, etc.)
// ✅ CORRECTO - Dato dinámico escapado
div.innerHTML = `<span>${escapeHtml(userData.name)}</span>`;

// ❌ INCORRECTO - Dato dinámico sin escapar
div.innerHTML = `<span>${userData.name}</span>`;

// ✅ CORRECTO - HTML estático (no necesita escape)
div.innerHTML = '<table><tr><th>Header</th></tr></table>';

// Uso:
div.innerHTML = `<label>${escapeHtml(cat.name)}</label>`;

2.3 Broken Authentication (A07:2021)

ControlEstado
Password validators✅ 4 validators activos
Session timeout✅ 2 semanas
Session en cache (no DB)✅ Más seguro

2.4 Sensitive Data Exposure (A02:2021)

DatoProtección
Credenciales DB✅ En .env (no en repo)
API Keys (Gemini, etc.)✅ En .env
Passwords de red✅ Cifrados con Fernet
.env en .gitignore✅ Verificado

3. Licencias de Dependencias

3.1 Dependencias Python

PaqueteVersiónLicenciaUso Comercial
Django6.0.1BSD-3-Clause✅ Permitido
django-ninja1.5.3MIT✅ Permitido
channels4.3.0BSD-3-Clause✅ Permitido
daphne4.1.2BSD-3-Clause✅ Permitido
psycopg2-binary2.9.11LGPL✅ Permitido (binario)
redis5.2.1MIT✅ Permitido
cryptography43.0.0+Apache-2.0/BSD✅ Permitido
pydantic2.10+MIT✅ Permitido
Pillow11.1.0HPND✅ Permitido
requests2.32.3Apache-2.0✅ Permitido
asyncssh2.18.0EPL-2.0✅ Permitido
scrapli2024.7.30MIT✅ Permitido
huey2.5.2MIT✅ Permitido
gunicorn23.0.0MIT✅ Permitido
uvicorn0.34.0BSD-3-Clause✅ Permitido
werkzeug3.1.3BSD-3-Clause✅ Permitido
google-genai1.60.0+Apache-2.0✅ Permitido
openai1.0.0+MIT✅ Permitido
anthropic0.52.0+MIT✅ Permitido
groupdocs-conversion-cloud24.8.0MIT✅ Permitido
django-allauth65.4.0MIT✅ Permitido
fido21.1.xBSD-2-Clause✅ Permitido
PyJWT2.8.0+MIT✅ Permitido
pysnmp6.2.0+BSD-2-Clause✅ Permitido
icmplib3.0.4+LGPL-3.0✅ Permitido (como librería)
aiohttp3.11.0+Apache-2.0✅ Permitido

3.2 Dependencias JavaScript

LibreríaVersiónLicenciaUbicación
Konva.js9.2.1MITstatic/js/lib/konva.min.js
Apache ECharts5.5.0Apache-2.0static/js/vendor/echarts.min.js
Flatpickr4.6.13MITstatic/js/vendor/flatpickr.min.js
GridStack.js12.4.2MITstatic/js/vendor/gridstack-all.min.js
jQuery(admin)MITstaticfiles/admin/js/vendor/
Select2(admin)MITstaticfiles/admin/js/vendor/
xregexp(admin)MITstaticfiles/admin/js/vendor/
Playwright1.57.0Apache-2.0devDependency (tests)

3.3 Resumen de Licencias

LicenciaCantidadCompatible SaaS
MIT19✅ Sí
BSD-3-Clause6✅ Sí
BSD-2-Clause2✅ Sí
Apache-2.07✅ Sí
LGPL1✅ Sí (binario)
LGPL-3.01✅ Sí (como librería)
EPL-2.01✅ Sí
HPND1✅ Sí

Conclusión: Todas las licencias son compatibles con uso comercial SaaS.

Nota sobre LGPL-3.0 (icmplib): Uso permitido como librería sin modificaciones. Si se modifica el código fuente de icmplib, los cambios deben publicarse bajo LGPL-3.0.


4. Datos Sensibles y Secretos

4.1 Archivos Protegidos

ArchivoEn .gitignoreEstado
.env✅ SíProtegido
.env.local✅ SíProtegido
.env.*.local✅ SíProtegido
db.sqlite3✅ SíProtegido
logs/✅ SíProtegido
media/uploads/✅ SíProtegido
media/temp/✅ SíProtegido

4.2 Variables de Entorno Requeridas

# Obligatorias en producción
DJANGO_SECRET_KEY=<clave-segura-256-bits>
POSTGRES_PASSWORD=<password-seguro>
DJANGO_ALLOWED_HOSTS=dominio.com
CSRF_TRUSTED_ORIGINS=https://dominio.com

# APIs externas
GEMINI_API_KEY=<api-key>

# Opcionales
EMAIL_HOST_PASSWORD=<smtp-password>
GITHUB_TOKEN=<token>

5. Checklist para Nuevas Dependencias

OBLIGATORIO: Antes de instalar cualquier nueva dependencia, verificar:

5.1 Seguridad

  • ¿Tiene vulnerabilidades conocidas? (verificar en Snyk o Safety)
  • ¿Última actualización < 1 año?
  • ¿Tiene mantenimiento activo? (commits recientes)
  • ¿Código fuente disponible y auditable?

5.2 Licencia

  • ¿Licencia compatible con uso comercial?
  • ¿Requiere atribución? (MIT, Apache: sí)
  • ¿Licencia viral? (GPL: verificar implicaciones)
  • Registrar en este documento (sección 3)

5.3 Licencias Compatibles (SaaS)

LicenciaPermitidaRequisitos
MIT✅Mantener copyright
BSD (2/3-Clause)✅Mantener copyright
Apache 2.0✅Mantener copyright + NOTICE
ISC✅Mantener copyright
LGPL⚠️Solo como librería dinámica
GPL❌Evitar (viral)
AGPL❌Evitar (muy restrictiva)

5.4 Registro Obligatorio

Al añadir una dependencia, actualizar:

  1. requirements.txt o package.json
  2. Este documento (sección 3)
  3. core/licenses.py — Registro público visible en /licenses (listas PYTHON_DEPENDENCIES, FRONTEND_DEPENDENCIES o INFRASTRUCTURE_DEPENDENCIES)
  4. CHANGELOG.md

6. Recomendaciones de Mejora

6.1 Estado de Implementación

#RecomendaciónEstadoFecha
1Auditar usos de innerHTML en JS✅ Completado29-01-2026
2Implementar CSP (Content Security Policy)✅ Completado29-01-2026
3Rate limiting en API✅ Completado29-01-2026
4Añadir headers de seguridad adicionales✅ Completado29-01-2026
5Implementar logging de seguridad✅ ExistenteSystemLog model
6Escaneo automático de dependencias🔲 PendienteCI/CD futuro

6.2 Rate Limiting Implementado

Ubicación: core/middleware/rate_limit.py

Configuración (en settings/base.py y settings/production.py):

RATE_LIMIT_ENABLED = True  # False en desarrollo, True en producción
RATE_LIMIT_REQUESTS = 100  # Peticiones por ventana
RATE_LIMIT_WINDOW = 60     # Ventana en segundos

# Límites específicos por endpoint
RATE_LIMIT_ENDPOINTS = {
    '/api/auth/login': {'requests': 5, 'window': 60},       # 5/min
    '/api/auth/register': {'requests': 3, 'window': 60},    # 3/min
    '/api/blueprints/auto-plan': {'requests': 10, 'window': 60},  # AI
    '/admin/login/': {'requests': 5, 'window': 60},         # Admin
}

Headers de respuesta:

  • X-RateLimit-Limit: Límite máximo
  • X-RateLimit-Remaining: Peticiones restantes
  • X-RateLimit-Reset: Timestamp de reset
  • Retry-After: Segundos para reintentar (solo en 429)

6.3 Content Security Policy (CSP) Implementado

Ubicación: core/middleware/csp.py

Modos:

  • Desarrollo: CSP_REPORT_ONLY = True (solo reporta, no bloquea)
  • Producción: CSP_REPORT_ONLY = False (bloquea violaciones)

Directivas configuradas:

DirectivaValorPropósito
default-src'self'Solo recursos propios
script-src'self' 'unsafe-inline'Scripts (legacy requiere inline)
style-src'self' 'unsafe-inline' fonts.googleapis.comEstilos
font-src'self' fonts.gstatic.com data:Fuentes
img-src'self' data: blob:Imágenes (Konva exports)
connect-src'self' ws: wss: 127.0.0.1:5050WebSocket + Agent
frame-src'none'Sin iframes
object-src'none'Sin plugins
frame-ancestors'none'Anti-clickjacking

6.4 Pendientes para Futuro

#RecomendaciónPrioridadNotas
1Eliminar 'unsafe-inline' de CSPMediaRequiere refactor JS
2Escaneo automático de dependenciasBajaAñadir a CI/CD
3CSP reporting endpointBajaPara monitorear violaciones

7. Historial de Auditorías

FechaVersiónAuditorResultado
29-01-2026v6.1.1Claude✅ Aprobado con observaciones

8. Próxima Auditoría

  • Fecha recomendada: Trimestral o al añadir dependencias críticas
  • Triggers automáticos:
    • Nueva dependencia de red/auth
    • Actualización major de Django
    • Cambio en manejo de credenciales

Mantenido por: Equipo CreaRack + Claude Última actualización: 06-02-2026

Véase también

  • [[crearack-tech—reports—security-audit-04-04-2026]] — auditoría de seguridad crearack.com
  • [[crearack-tech—guides—security-guide]] — guía de seguridad
  • [[crearack-tech—guides—secret-rotation-playbook]] — playbook de rotación de secretos
  • [[crearack-tech—backend—passkeys-authentication]] — autenticación con passkeys
  • [[workspace-tech—tecnico—security-audit-11-04-2026]] — auditoría seguridad workspace
  • [[crearack-tech—reports—infrastructure-robustness-audit-04-04-2026]] — auditoría de robustez infra