# Revision de seguridad de la intranet

Fecha de revision: 2026-04-09

## Alcance

Esta revision se ha centrado principalmente en:

- Inyeccion SQL
- XSS (Cross-Site Scripting)
- RCE (Remote Code Execution)
- Fugas de datos

La revision ha sido mayoritariamente estatica, con validacion manual de los puntos mas expuestos y reparacion inmediata de los hallazgos confirmados. No sustituye a un pentest dinamico completo ni a una auditoria linea a linea de todo el repositorio.

## Resumen ejecutivo

Estado tras esta revision:

- No se ha confirmado una SQL injection explotable en los flujos revisados.
- No se ha confirmado una RCE web explotable en los puntos inspeccionados.
- Si se han confirmado y corregido varias fugas de datos y vectores de XSS/SSRF de alto valor.

Hallazgos confirmados y corregidos en esta ronda:

1. Fuga de PDFs de terceros en IRPF.
2. SSRF en importacion por URL de Lectura Foco.
3. Exposicion de trabajos y descargas ajenas en Docling Markdown.
4. Riesgo de XSS en renderizado de estado y metadatos de Docling.
5. Endurecimiento de la vista previa HTML de campanas IRPF.

## Hallazgos confirmados y reparaciones

### 1. Fuga de datos en IRPF: consulta y descarga de PDFs ajenos

Severidad: alta

Impacto:

- Un usuario autenticado podia consultar registros y descargar PDFs de certificados de otros usuarios si conocia el NIF y el ejercicio fiscal.
- La pagina de consulta listaba ademas envios recientes sin limitar por propietario para usuarios no administradores.

Ficheros afectados:

- `apps/irpf-certificados/download_sent.php`
- `apps/irpf-certificados/pdfs.php`
- Copias equivalentes en `plugins/irpf-certificados/...`

Correccion aplicada:

- Para usuarios no administradores, la consulta ahora exige que el registro pertenezca al usuario actual mediante `sent_by`.
- La pantalla de consulta y el listado de ultimos envios quedan limitados al propio usuario salvo rol admin.
- Las descargas añaden cabeceras mas estrictas: `Cache-Control: private, no-store` y `X-Content-Type-Options: nosniff`.

Referencias:

- `apps/irpf-certificados/download_sent.php`
- `apps/irpf-certificados/pdfs.php`

### 2. SSRF en Lectura Foco al importar por URL

Severidad: alta

Impacto:

- La aplicacion aceptaba cualquier URL valida y hacia `file_get_contents()` directamente.
- Eso permitia intentar accesos a destinos internos, reservados o locales desde el servidor.

Ficheros afectados:

- `apps/lectura-foco/lib.php`
- `plugins/lectura-foco/apps/lectura-foco/lib.php`

Correccion aplicada:

- Solo se admiten URLs `http` y `https`.
- Se bloquean URLs con credenciales embebidas.
- Se bloquean hosts locales o internos.
- Se resuelve el host y se rechazan IPs privadas o reservadas.
- Se deshabilita el seguimiento automatico de redirecciones para evitar saltos a destinos internos.

Referencias:

- `apps/lectura-foco/lib.php`

### 3. Fuga de datos en Docling Markdown: acceso a trabajos ajenos

Severidad: alta

Impacto:

- Si un usuario conocia un `job_id`, podia consultar estado y descargar resultados de conversion ajenos.

Ficheros afectados:

- `apps/docling-markdown/lib.php`
- `apps/docling-markdown/api.php`
- `apps/docling-markdown/download.php`

Correccion aplicada:

- Cada trabajo creado se registra en la sesion del usuario.
- Las acciones `status` y `download` solo aceptan trabajos asociados a la sesion que los creo.
- Se valida el formato de `job_id` antes de usarlo.

Referencias:

- `apps/docling-markdown/lib.php`
- `apps/docling-markdown/api.php`
- `apps/docling-markdown/download.php`

### 4. Riesgo de XSS en Docling Markdown

Severidad: media

Impacto:

- Parte del estado y metadatos se renderizaba con `innerHTML`.
- Si el servicio devolvia contenido inesperado o malicioso, podia inyectarse HTML en la UI.

Fichero afectado:

- `apps/docling-markdown/docling_markdown.js`

Correccion aplicada:

- Se ha añadido escape HTML explicito antes de pintar titulos, mensajes y metadatos.
- La interfaz sigue funcionando igual, pero ya no inserta contenido remoto sin escapar.

Referencia:

- `apps/docling-markdown/docling_markdown.js`

### 5. Endurecimiento XSS en la vista previa HTML de campanas IRPF

Severidad: media

Impacto:

- La vista previa del HTML del correo se mostraba directamente en la pagina.
- Aunque el HTML ya pasaba por saneado, un fallo en ese saneado podia afectar al DOM principal.

Fichero afectado:

- `apps/irpf-certificados/job.php`
- Copia equivalente en `plugins/irpf-certificados/...`

Correccion aplicada:

- La previsualizacion ahora se muestra en un `iframe` con `sandbox` y `referrerpolicy="no-referrer"`.
- El HTML queda aislado del documento principal.

Referencia:

- `apps/irpf-certificados/job.php`

## Sobre SQL injection

Resultado de esta revision:

- No se ha confirmado una SQL injection explotable en los puntos revisados manualmente.
- En general, predominan `prepare/execute` y parametros enlazados.
- Los SQL dinamicos encontrados en los flujos inspeccionados estaban acotados por listas permitidas o valores internos controlados.

Riesgo residual:

- Sigue siendo recomendable revisar a fondo los modulos que construyen SQL dinamico por nombres de columna, `ORDER BY`, tablas o clausulas opcionales.

## Sobre RCE

Resultado de esta revision:

- No se ha confirmado una RCE web explotable en los puntos inspeccionados.
- Se han localizado usos de `exec` y `shell_exec`, pero en los casos revisados los argumentos estaban escapados y no se observó composicion directa desde entrada cruda del usuario.

Zonas a vigilar en una fase 2:

- `apps/irpf-certificados/manual.php`
- `apps/irpf-certificados/worker/process_jobs.php`
- `apps/lectura-foco/lib.php`
- Scripts de publicacion y utilidades operativas en `tools/` y `common/plugin_store.php`

## Hallazgos previos y recomendaciones que siguen vigentes

### 1. Revision completa de CSRF

Aunque hay muchos modulos con token CSRF, no se ha verificado manualmente cada formulario y cada accion destructiva de todas las apps y plugins.

Riesgo: medio

### 2. Limitacion de intentos de login

No se ha validado un sistema robusto de rate limiting o bloqueo temporal por IP/usuario.

Riesgo: medio

### 3. Proteccion de secretos y ficheros de configuracion

La seguridad de `config/` y otros artefactos sensibles sigue dependiendo en parte de la configuracion correcta del servidor web.

Riesgo: medio

### 4. Permisos de fichero y rutas sensibles

Conviene revisar permisos en:

- `config/`
- `common/config.php`
- carpetas de subidas
- carpetas temporales
- `plugins/`
- `styles/images/`

Riesgo: medio

### 5. Modulos no auditados en profundidad

Esta revision no cubre de forma exhaustiva toda la logica de negocio de cada plugin.

Riesgo: variable

## Verificacion realizada

Tras aplicar los cambios se ha verificado sintaxis, al menos, en:

- `apps/lectura-foco/lib.php`
- `plugins/lectura-foco/apps/lectura-foco/lib.php`
- `apps/docling-markdown/lib.php`
- `apps/docling-markdown/api.php`
- `apps/docling-markdown/download.php`
- `apps/irpf-certificados/download_sent.php`
- `apps/irpf-certificados/pdfs.php`
- `apps/irpf-certificados/job.php`
- copias equivalentes en `plugins/irpf-certificados/...`

Tambien se ha pasado comprobacion de sintaxis al frontend:

- `apps/docling-markdown/docling_markdown.js`

## Siguiente fase recomendada

Si se quiere continuar con una fase 2, el orden recomendado es:

1. Auditoria completa de CSRF y controles de autorizacion en todas las apps/plugins.
2. Revision de todas las subidas y descargas de ficheros.
3. Revisión enfocada en comandos externos, colas, workers y herramientas de build/publicacion.
4. Revisión de exposicion de datos personales en modulos de RRHH, incidencias y certificados.
5. Pentest dinamico con usuarios de distinto perfil.
