<?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://db.gcve.eu</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>Thu, 22 Oct 2026 23:15:51 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-113731</title>
      <link>https://db.gcve.eu/vuln/fkie_cve-2026-113731</link>
      <description>&lt;p&gt;djust provides Phoenix LiveView-style reactive server-side rendering for Django with Rust-powered performance. From 0.9.0 until 1.0.10, 1.1.7, 1.2.4, and 1.3.0rc8, the find_handlers_for_template MCP tool in python/djust/mcp/server.py accepts an existing absolute template_path and reads it without restricting the resolved path to the project or configured template directories. A local MCP client can use the tool as a file existence and readability oracle and can obtain substrings that match the tool&amp;#39;s dj-click, dj-submit, dj-change, dj-input, dj-keydown, or dj-keyup attribute pattern from files readable by the djust process. The maintainer assessment states that the MCP server communicates over local stdio as the same operating-system user and has no network listener, and the tool does not return arbitrary raw file contents. This issue is fixed in versions 1.0.10, 1.1.7, 1.2.4, and 1.3.0rc8.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;djust provides Phoenix LiveView-style reactive server-side rendering for Django with Rust-powered performance. From 0.9.0 until 1.0.10, 1.1.7, 1.2.4, and 1.3.0rc8, the find_handlers_for_template MCP tool in python/djust/mcp/server.py accepts an existing absolute template_path and reads it without restricting the resolved path to the project or configured template directories. A local MCP client can use the tool as a file existence and readability oracle and can obtain substrings that match the tool&amp;#39;s dj-click, dj-submit, dj-change, dj-input, dj-keydown, or dj-keyup attribute pattern from files readable by the djust process. The maintainer assessment states that the MCP server communicates over local stdio as the same operating-system user and has no network listener, and the tool does not return arbitrary raw file contents. This issue is fixed in versions 1.0.10, 1.1.7, 1.2.4, and 1.3.0rc8.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/fkie_cve-2026-113731</guid>
    </item>
    <item>
      <title>GHSA-r57g-mc79-8hj2 — djust: Arbitrary absolute-path file read in the find_handlers_for_template MCP tool</title>
      <link>https://db.gcve.eu/vuln/ghsa-r57g-mc79-8hj2</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: djust&lt;/p&gt;
&lt;p&gt;### Affected version / file / line
Version: djust v1.1.4 (latest release, published 2026-09-23). File: python/djust/mcp/server.py:354-433 (MCP tool find_handlers_for_template). Confirmed identical on the commit used for triage, a7e4fafd1667b4db0b1465652d4a63cb17117a07.&lt;/p&gt;
&lt;p&gt;### Description
```
@mcp.tool()
def find_handlers_for_template(template_path: str) -&amp;gt; str:
    &amp;#34;&amp;#34;&amp;#34;
    Args:
        template_path: Either a logical template name (e.g.
            &amp;#39;demos/counter.html&amp;#39; — what you&amp;#39;d pass to `render`) OR
            an absolute filesystem path. Both are searched.
    &amp;#34;&amp;#34;&amp;#34;
    ...
    resolved_path: str | None = None
    if os.path.isabs(template_path) and os.path.isfile(template_path):
        resolved_path = template_path
    else:
        ...  # logical-name resolution via Django&amp;#39;s template loader
    ...
    with open(resolved_path, &amp;#34;r&amp;#34;, encoding=&amp;#34;utf-8&amp;#34;, errors=&amp;#34;replace&amp;#34;) as f:
        source = f.read()
    handler_names_in_template = sorted({m.group(2) for m in dj_event_attr_re.finditer(source)})
```
When template_path is an absolute path to an existing file, it is used directly, with no confinement to the project/template directories — no realpath() + prefix check, no allowlist. open(resolved_path, ...) then reads the file.&lt;/p&gt;
&lt;p&gt;This is inconsistent with the sibling tool in the same file (loaddata, ~line 290-303), which explicitly rejects paths outside the project directory for its own path-like parameter:
```
candidate = os.path.realpath(...)
if base_dir and not candidate.sta…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: djust&lt;/p&gt;
&lt;p&gt;### Affected version / file / line
Version: djust v1.1.4 (latest release, published 2026-09-23). File: python/djust/mcp/server.py:354-433 (MCP tool find_handlers_for_template). Confirmed identical on the commit used for triage, a7e4fafd1667b4db0b1465652d4a63cb17117a07.&lt;/p&gt;
&lt;p&gt;### Description
```
@mcp.tool()
def find_handlers_for_template(template_path: str) -&amp;gt; str:
    &amp;#34;&amp;#34;&amp;#34;
    Args:
        template_path: Either a logical template name (e.g.
            &amp;#39;demos/counter.html&amp;#39; — what you&amp;#39;d pass to `render`) OR
            an absolute filesystem path. Both are searched.
    &amp;#34;&amp;#34;&amp;#34;
    ...
    resolved_path: str | None = None
    if os.path.isabs(template_path) and os.path.isfile(template_path):
        resolved_path = template_path
    else:
        ...  # logical-name resolution via Django&amp;#39;s template loader
    ...
    with open(resolved_path, &amp;#34;r&amp;#34;, encoding=&amp;#34;utf-8&amp;#34;, errors=&amp;#34;replace&amp;#34;) as f:
        source = f.read()
    handler_names_in_template = sorted({m.group(2) for m in dj_event_attr_re.finditer(source)})
```
When template_path is an absolute path to an existing file, it is used directly, with no confinement to the project/template directories — no realpath() + prefix check, no allowlist. open(resolved_path, ...) then reads the file.&lt;/p&gt;
&lt;p&gt;This is inconsistent with the sibling tool in the same file (loaddata, ~line 290-303), which explicitly rejects paths outside the project directory for its own path-like parameter:
```
candidate = os.path.realpath(...)
if base_dir and not candidate.sta…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-r57g-mc79-8hj2</guid>
    </item>
  </channel>
</rss>
