
Laboratorio basado en Docker para reproducir y validar CVE-2026-28496, una vulnerabilidad de inyección de plantillas del lado del servidor en el renderizado Twig de FOSSBilling, con objetivos de comparación vulnerables y parcheados.
Este repositorio contiene un laboratorio Docker local para reproducir y validar CVE-2026-28496, una vulnerabilidad de inyección de plantillas del lado del servidor que afecta el comportamiento de renderizado de plantillas Twig de FOSSBilling.
FOSSBilling es una plataforma gratuita y de código abierto de facturación y gestión de clientes. Las versiones anteriores a 0.8.0 se ven afectadas por un comportamiento inseguro en el renderizado de plantillas Twig que puede evaluar expresiones de plantilla suministradas. En este laboratorio se utiliza FOSSBilling 0.8.0 como destino de comparación parcheado.
Este laboratorio compara dos versiones de FOSSBilling:
| Servicio | Versión de FOSSBilling | Propósito | URL |
|---|---|---|---|
| vuln | 0.7.2 | Destino vulnerable de comparación | http://localhost:8081 |
| patched | 0.8.0 | Destino parcheado de comparación | http://localhost:8082 |
La ruta de validación HTTP demostrada en este laboratorio local es:```text Unauthenticated HTTP request in this local FOSSBilling 0.7.2 lab → POST /api/system/system/string_render → JSON body contains _tpl={{ 7*7 }} → vulnerable target renders the Twig expression → patched target does not expose the same tested API behavior
En el objetivo vulnerable, la llamada a la API devuelve:```json
{"result":"49","error":null}
En el objetivo parcheado, la misma solicitud devuelve:```json {"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
Este laboratorio valida el comportamiento HTTP entre la versión vulnerable y la parcheada utilizando FOSSBilling 0.7.2 y FOSSBilling 0.8.0.
El laboratorio está deliberadamente limitado a servicios Docker locales. No apunta a sistemas externos y no incluye webshells, malware, persistencia, devoluciones de llamada externas, volcado de bases de datos ni cargas útiles destructivas.
## Hechos verificados
| Afirmación | Evidencia | Cómo verificar en este laboratorio |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
| CVE-2026-28496 afecta a las versiones de FOSSBilling anteriores a 0.8.0. | El CVE público y los metadatos del aviso identifican a FOSSBilling anterior a 0.8.0 como afectado por SSTI de Twig. | Revise la sección de Referencias y compare las versiones objetivo vulnerable y parcheada. |
| FOSSBilling 0.7.2 se utiliza como objetivo de comparación vulnerable. | El servicio vulnerable se construye a partir de la imagen Docker oficial `fossbilling/fossbilling:0.7.2`. | Inspeccione `vuln/Dockerfile` y ejecute `docker compose ps -a`. |
| FOSSBilling 0.8.0 se utiliza como objetivo de comparación parcheado. | El servicio parcheado se construye a partir de la imagen Docker oficial `fossbilling/fossbilling:0.8.0`. | Inspeccione `patched/Dockerfile` y ejecute `docker compose ps -a`. |
| La ruta HTTP vulnerable es `/api/system/system/string_render`. | El objetivo vulnerable devuelve JSON con `result: "49"` para `_tpl={{ 7*7 }}`. | Ejecute `python3 poc/poc.py --url http://localhost:8081`. |
| El objetivo parcheado no expone el mismo comportamiento HTTP. | El objetivo parcheado devuelve `Unknown API call system/system/string_render`. | Ejecute `python3 poc/poc.py --url http://localhost:8082`. |
| El PoC es solo HTTP. | `poc/poc.py` envía solicitudes HTTP POST y no invoca Docker, Docker Compose, comandos de shell ni API de contenedores. | Inspeccione `poc/poc.py`. |
| El laboratorio instala automáticamente ambos objetivos FOSSBilling durante el inicio de Docker Compose. | Los contenedores sidecar del instalador de un solo uso completan la configuración y salen con estado 0. | Ejecute `docker compose ps -a` y `docker compose logs installer-vuln installer-patched`. |
| El objetivo vulnerable renderiza la expresión Twig inofensiva. | La respuesta HTTP desde el puerto 8081 es `{"result":"49","error":null}`. | Ejecute el comando PoC vulnerable. |
| El objetivo parcheado no renderiza la misma expresión a través de la ruta de API probada. | La respuesta HTTP desde el puerto 8082 es un error de API JSON con código `879`. | Ejecute el comando PoC parcheado. |
## Suposiciones e incógnitas
Este laboratorio utiliza FOSSBilling 0.7.2 como objetivo de comparación vulnerable porque la investigación pública de vulnerabilidades identifica las versiones de FOSSBilling anteriores a 0.8.0 como afectadas, y 0.7.2 es la última versión vulnerable utilizada en la cadena probada.
Este laboratorio utiliza FOSSBilling 0.8.0 como objetivo de comparación parcheado porque los metadatos del aviso público identifican a 0.8.0 como la versión parcheada.
Este laboratorio se centra en el comportamiento HTTP observable de:```text
POST /api/system/system/string_render
con este cuerpo JSON:```json {"_tpl":"{{ 7*7 }}"}
El laboratorio demuestra que FOSSBilling 0.7.2 renderiza la expresión de Twig proporcionada a través de la ruta de la API HTTP, mientras que FOSSBilling 0.8.0 no expone la misma llamada a la API.
Este laboratorio no pretende probar todas las funciones de renderizado de plantillas de FOSSBilling. CVE-2026-28496 también se relaciona con otros contextos de renderizado de Twig, como las funciones de renderizado de plantillas disponibles dentro de la aplicación.
Este laboratorio no demuestra la cadena completa de ejecución remota de código no autenticada. Valida el comportamiento HTTP no autenticado observado en el objetivo local FOSSBilling 0.7.2 y lo compara con FOSSBilling 0.8.0. La cadena pública completa implica un comportamiento de autorización de API adicional más allá de la validación segura de expresiones de Twig que se muestra aquí.
El laboratorio no demuestra:
* ejecución remota de comandos,
* extracción de credenciales,
* volcado de bases de datos,
* instalación de extensiones,
* escritura arbitraria de archivos,
* persistencia,
* subida de webshells,
* devoluciones de llamada externas,
* ataques contra sistemas ajenos al laboratorio,
* ni actividad posterior a la explotación.
## Resumen de la causa raíz
La causa raíz de CVE-2026-28496 es el renderizado inseguro de plantillas Twig.
FOSSBilling utiliza Twig para renderizar plantillas dinámicas. En las versiones vulnerables, una cadena de plantilla proporcionada puede pasarse a la lógica de renderizado de Twig sin restricciones de sandbox suficientes.