<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://cve.radiocsirt.org</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Fri, 09 Oct 2026 20:48:17 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-34172 — Giskard Agents have Server-side template injection via ChatWorkflow.chat() using non-sandboxed Jinja2 Environment</title>
      <link>https://cve.radiocsirt.org/vuln/cve-2026-34172</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Giskard-AI giskard-oss&lt;/p&gt;
&lt;p&gt;Giskard is an open-source Python library for testing and evaluating agentic systems. Prior to versions 0.3.4 and 1.0.2b1, ChatWorkflow.chat(message) passes its string argument directly as a Jinja2 template source to a non-sandboxed Environment. A developer who passes user input to this method enables full remote code execution via Jinja2 class traversal. The method name chat and parameter name message naturally invite passing user input directly, but the string is silently parsed as a Jinja2 template, not treated as plain text. This issue has been patched in versions 0.3.4 and 1.0.2b1.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Giskard-AI giskard-oss&lt;/p&gt;
&lt;p&gt;Giskard is an open-source Python library for testing and evaluating agentic systems. Prior to versions 0.3.4 and 1.0.2b1, ChatWorkflow.chat(message) passes its string argument directly as a Jinja2 template source to a non-sandboxed Environment. A developer who passes user input to this method enables full remote code execution via Jinja2 class traversal. The method name chat and parameter name message naturally invite passing user input directly, but the string is silently parsed as a Jinja2 template, not treated as plain text. This issue has been patched in versions 0.3.4 and 1.0.2b1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/cve-2026-34172</guid>
    </item>
    <item>
      <title>GHSA-frv4-x25r-588m — Giskard Agents have Server-side template injection via ChatWorkflow.chat() using non-sandboxed Jinja2 Environment</title>
      <link>https://cve.radiocsirt.org/vuln/ghsa-frv4-x25r-588m</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: giskard-agents&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`ChatWorkflow.chat(message)` passes its string argument directly as a Jinja2 template source to a non-sandboxed `Environment`. A developer who passes user input to this method enables full remote code execution via Jinja2 class traversal.&lt;/p&gt;
&lt;p&gt;The method name `chat` and parameter name `message` naturally invite passing user input directly, but the string is silently parsed as a Jinja2 template, not treated as plain text.&lt;/p&gt;
&lt;p&gt;## Root Cause&lt;/p&gt;
&lt;p&gt;`libs/giskard-agents/src/giskard/agents/workflow.py` line ~261:
```python
def chat(self, message: str | Message | MessageTemplate, role: Role = &amp;#34;user&amp;#34;) -&amp;gt; Self:
    if isinstance(message, str):
        message = MessageTemplate(role=role, content_template=message)
```&lt;/p&gt;
&lt;p&gt;The string becomes `content_template`, which is parsed by `from_string()`:&lt;/p&gt;
&lt;p&gt;`libs/giskard-agents/src/giskard/agents/templates/message.py` lines 14-15:
```python
def render(self, **kwargs: Any) -&amp;gt; Message:
    template = _inline_env.from_string(self.content_template)
    rendered_content = template.render(**kwargs)
```&lt;/p&gt;
&lt;p&gt;The Jinja2 Environment is not sandboxed:&lt;/p&gt;
&lt;p&gt;`libs/giskard-agents/src/giskard/agents/templates/environment.py` line 37:
```python
_inline_env = Environment(
    autoescape=False,
    # Not SandboxedEnvironment
)
```&lt;/p&gt;
&lt;p&gt;## Proof of Concept&lt;/p&gt;
&lt;p&gt;```python
from jinja2 import Environment
env = Environment()  # Same as giskard&amp;#39;s _inline_env&lt;/p&gt;
&lt;p&gt;# Class traversal reaches os.popen
t = env.from_string(&amp;#34;{{ &amp;#39;&amp;#39;.__class__.__mro__[1].__subclasses__() | length }}&amp;#34;)
print(t.render(…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: giskard-agents&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`ChatWorkflow.chat(message)` passes its string argument directly as a Jinja2 template source to a non-sandboxed `Environment`. A developer who passes user input to this method enables full remote code execution via Jinja2 class traversal.&lt;/p&gt;
&lt;p&gt;The method name `chat` and parameter name `message` naturally invite passing user input directly, but the string is silently parsed as a Jinja2 template, not treated as plain text.&lt;/p&gt;
&lt;p&gt;## Root Cause&lt;/p&gt;
&lt;p&gt;`libs/giskard-agents/src/giskard/agents/workflow.py` line ~261:
```python
def chat(self, message: str | Message | MessageTemplate, role: Role = &amp;#34;user&amp;#34;) -&amp;gt; Self:
    if isinstance(message, str):
        message = MessageTemplate(role=role, content_template=message)
```&lt;/p&gt;
&lt;p&gt;The string becomes `content_template`, which is parsed by `from_string()`:&lt;/p&gt;
&lt;p&gt;`libs/giskard-agents/src/giskard/agents/templates/message.py` lines 14-15:
```python
def render(self, **kwargs: Any) -&amp;gt; Message:
    template = _inline_env.from_string(self.content_template)
    rendered_content = template.render(**kwargs)
```&lt;/p&gt;
&lt;p&gt;The Jinja2 Environment is not sandboxed:&lt;/p&gt;
&lt;p&gt;`libs/giskard-agents/src/giskard/agents/templates/environment.py` line 37:
```python
_inline_env = Environment(
    autoescape=False,
    # Not SandboxedEnvironment
)
```&lt;/p&gt;
&lt;p&gt;## Proof of Concept&lt;/p&gt;
&lt;p&gt;```python
from jinja2 import Environment
env = Environment()  # Same as giskard&amp;#39;s _inline_env&lt;/p&gt;
&lt;p&gt;# Class traversal reaches os.popen
t = env.from_string(&amp;#34;{{ &amp;#39;&amp;#39;.__class__.__mro__[1].__subclasses__() | length }}&amp;#34;)
print(t.render(…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/ghsa-frv4-x25r-588m</guid>
    </item>
  </channel>
</rss>
