<?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://vulnerability.circl.lu</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 16:50:08 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-107717</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-107717</link>
      <description>&lt;p&gt;Banks generates meaningful LLM prompts using a simple template language. Prior to 2.5.0, Banks Prompt.chat_messages() attempts to parse every line of rendered template output as ChatMessage JSON. When an application renders untrusted data and passes the returned ChatMessage objects to an LLM provider, attacker-controlled JSON can cross the prompt boundary and become a system, assistant, or tool message because ChatMessage.role accepts arbitrary strings. This can override application instructions, alter the intended prompt structure, or confuse downstream tool and message handling. This issue is fixed in version 2.5.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Banks generates meaningful LLM prompts using a simple template language. Prior to 2.5.0, Banks Prompt.chat_messages() attempts to parse every line of rendered template output as ChatMessage JSON. When an application renders untrusted data and passes the returned ChatMessage objects to an LLM provider, attacker-controlled JSON can cross the prompt boundary and become a system, assistant, or tool message because ChatMessage.role accepts arbitrary strings. This can override application instructions, alter the intended prompt structure, or confuse downstream tool and message handling. This issue is fixed in version 2.5.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-107717</guid>
    </item>
    <item>
      <title>GHSA-hmq2-7hp6-7crh — Banks: User-controlled prompt input can be parsed as privileged chat messages</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-hmq2-7hp6-7crh</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: banks&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;Banks&amp;#39; `Prompt.chat_messages()` method parses every rendered output line as a potential `ChatMessage` JSON
  object. If attacker-controlled template data renders to JSON such as `{&amp;#34;role&amp;#34;:&amp;#34;system&amp;#34;,&amp;#34;content&amp;#34;:&amp;#34;...&amp;#34;}`,
  Banks returns it as a privileged `system` message instead of treating it as plain user-controlled text.&lt;/p&gt;
&lt;p&gt;Applications that render untrusted user input with `Prompt.chat_messages()` and pass the returned messages
  directly to an LLM provider may be vulnerable to chat role injection and prompt boundary bypass.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;The issue is in `src/banks/prompt.py`:&lt;/p&gt;
&lt;p&gt;```python
  messages: list[ChatMessage] = []
  for line in rendered.strip().split(&amp;#34;\n&amp;#34;):
      try:
          messages.append(ChatMessage.model_validate_json(line))
      except ValidationError:
          # Ignore lines that are not a message
          pass&lt;/p&gt;
&lt;p&gt;if not messages:
      # fallback, if there was no {% chat %} block in the template,
      # try to build a list of messages for the role &amp;#34;user&amp;#34;
      messages.append(chat_message_from_text(role=&amp;#34;user&amp;#34;, content=rendered))
```
  The method first renders the template, then attempts to parse each rendered line as a ChatMessage.&lt;/p&gt;
&lt;p&gt;Because this parsing is applied to the final rendered output, user-controlled template variables can
  accidentally become trusted structured chat messages.&lt;/p&gt;
&lt;p&gt;The ChatMessage model also accepts any string as the role in src/banks/types.py:
  ```python
  class ChatMessage(BaseModel):
      role: str…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: banks&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;Banks&amp;#39; `Prompt.chat_messages()` method parses every rendered output line as a potential `ChatMessage` JSON
  object. If attacker-controlled template data renders to JSON such as `{&amp;#34;role&amp;#34;:&amp;#34;system&amp;#34;,&amp;#34;content&amp;#34;:&amp;#34;...&amp;#34;}`,
  Banks returns it as a privileged `system` message instead of treating it as plain user-controlled text.&lt;/p&gt;
&lt;p&gt;Applications that render untrusted user input with `Prompt.chat_messages()` and pass the returned messages
  directly to an LLM provider may be vulnerable to chat role injection and prompt boundary bypass.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;The issue is in `src/banks/prompt.py`:&lt;/p&gt;
&lt;p&gt;```python
  messages: list[ChatMessage] = []
  for line in rendered.strip().split(&amp;#34;\n&amp;#34;):
      try:
          messages.append(ChatMessage.model_validate_json(line))
      except ValidationError:
          # Ignore lines that are not a message
          pass&lt;/p&gt;
&lt;p&gt;if not messages:
      # fallback, if there was no {% chat %} block in the template,
      # try to build a list of messages for the role &amp;#34;user&amp;#34;
      messages.append(chat_message_from_text(role=&amp;#34;user&amp;#34;, content=rendered))
```
  The method first renders the template, then attempts to parse each rendered line as a ChatMessage.&lt;/p&gt;
&lt;p&gt;Because this parsing is applied to the final rendered output, user-controlled template variables can
  accidentally become trusted structured chat messages.&lt;/p&gt;
&lt;p&gt;The ChatMessage model also accepts any string as the role in src/banks/types.py:
  ```python
  class ChatMessage(BaseModel):
      role: str…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-hmq2-7hp6-7crh</guid>
    </item>
  </channel>
</rss>
