openEQUELLA before 2026.1.0 contains an authenticated stored server-side template injection vulnerability in FreemarkerPortletRenderer.renderHtml() that allows any authenticated non-guest user to achieve remote code execution by storing a malicious FreeMarker payload through a POST request to the RemotePortletService invoker endpoint. The markup field from stored portlet configuration is passed directly to custFactory.createResult() without a TemplateClassResolver restriction or FreeMarker sandboxing in BasicConfiguration, leaving built-ins such as ?new and freemarker.template.utility.Execute available, causing the payload to execute in the application server process context when any user renders a dashboard containing the affected portlet.
{
"cna_assigner": "VulnCheck",
"cwe_ids": [
"CWE-1336"
],
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/94xxx/CVE-2026-94109.json"
}"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-94109.json"
[
{
"deprecated": false,
"digest": {
"function_hash": "235466883635136193310868589380270201175",
"length": 182
},
"id": "CVE-2026-94109-24a29d3f",
"signature_type": "Function",
"signature_version": "v1",
"source": "https://github.com/openequella/openequella/commit/d6e165afc986f8a3ed912cdb367d5ad8c1eeab5c",
"target": {
"file": "Source/Plugins/Core/com.equella.core/src/com/tle/web/freemarker/BasicConfiguration.java",
"function": "BasicConfiguration"
}
},
{
"deprecated": false,
"digest": {
"line_hashes": [
"223743616906910024966792958104291224450",
"149160298893242027350613654826857682926",
"250017236842937766004123964826082385450",
"195829287765834913666734330880432986252",
"112379631583596739824808054585723787635",
"128162232043109272978988819419131998866",
"335123795018919565560418288410742120729",
"213465060508192380924131533916788154403",
"82426487824841196634582136901365293029",
"317001260967976726126168545033004441847",
"38597487955534090984610422883163611048"
],
"threshold": 0.9
},
"id": "CVE-2026-94109-f1570dfb",
"signature_type": "Line",
"signature_version": "v1",
"source": "https://github.com/openequella/openequella/commit/d6e165afc986f8a3ed912cdb367d5ad8c1eeab5c",
"target": {
"file": "Source/Plugins/Core/com.equella.core/src/com/tle/web/freemarker/BasicConfiguration.java"
}
}
]
"2026-09-27T08:01:51Z"