Bug 2534091 (CVE-2026-92218)

Summary: CVE-2026-92218 release-service-utils: Server-Side Template Injection via two-pass non-sandboxed Jinja render
Product: [Other] Security Response Reporter: OSIDB Bzimport <bzimport>
Component: vulnerabilityAssignee: Product Security <prodsec-ir-bot>
Status: NEW --- QA Contact:
Severity: high Docs Contact:
Priority: high    
Version: unspecifiedCC: gbenhaim, niyer, security-response-team, twaugh
Target Milestone: ---Keywords: Security
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: ---
Doc Text:
A flaw was found in the `release-service-utils` component. This vulnerability, known as Server-Side Template Injection, allows an attacker to execute unauthorized code. By manipulating specific input fields, a malicious tenant can inject harmful commands into templates that are processed twice. This bypasses security measures, enabling the attacker to run arbitrary code within the `release-service-utils` system and potentially gain access to sensitive credentials.
Story Points: ---
Clone Of: Environment:
Last Closed: Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Deadline: 2026-09-21   

Description OSIDB Bzimport 2026-09-15 18:35:54 UTC
Discovered as a part of project glasswing (ex-wing)

render_template_to_json_file() performs a two-pass Jinja render: the first pass expands the template with user-supplied template_data, then the resulting string is wrapped in jinja2.Template() and rendered again. Because the default (non-sandboxed) Template class is used and DebugUndefined leaves unknown placeholders intact, any value in template_data that contains Jinja delimiters (e.g. in advisory.spec.synopsis / description / topic / content rendered by templates/advisory.yaml.jinja) becomes live template syntax in pass two. create_advisory.py invokes this path with advisory data sourced from release inputs, so a tenant able to influence those text fields can reach Python object-walk gadgets and execute arbitrary code inside the release-service-utils pod, which holds GitLab, Pyxis and signing credentials.

*utils/apply_template.py:73-92 — output of pass 1 re-evaluated as a non-sandboxed Jinja template*
```python
template = Template(
    template_file.read(),
    extensions=[AnsibleCoreFiltersExtension],
    undefined=DebugUndefined,
)
...
content = template.render(template_data)
...
# try 2nd pass
content = Template(content).render(template_data)
```