<?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, 15 Oct 2026 21:27:00 +0000</lastBuildDate>
    <item>
      <title>BREW-ggshield-GHSA-qp9x-wp8f-qgjj — tuf has platform-dependent delegation path matching</title>
      <link>https://db.gcve.eu/vuln/brew-ggshield-ghsa-qp9x-wp8f-qgjj</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: ggshield&lt;/p&gt;
&lt;p&gt;`DelegatedRole._is_target_in_pathpattern` uses `fnmatch.fnmatch` to decide whether a given target path is authorized by a delegation&amp;#39;s glob pattern.&lt;/p&gt;
&lt;p&gt;Python&amp;#39;s `fnmatch.fnmatch` calls `os.path.normcase()` on both arguments before matching. On POSIX hosts `normcase` is the identity function; on Windows hosts `os.path` resolves to `ntpath`, whose `normcase` lowercases its input and replaces `/` with `\`.&lt;/p&gt;
&lt;p&gt;As a result, python-tuf&amp;#39;s delegation *path pattern* matching is case-sensitive on Linux/macOS but case-INSENSITIVE on Windows. This makes the authorization decision for a target dependent on the host operating system of the client running the updater.&lt;/p&gt;
&lt;p&gt;The result on Windows is a TUF specification violation in the python-tuf `ngclient` implementation.&lt;/p&gt;
&lt;p&gt;## Vulnerable code&lt;/p&gt;
&lt;p&gt;`tuf/api/_payload.py` (HEAD `7ecb67d`):&lt;/p&gt;
&lt;p&gt;```python
1183  @staticmethod
1184  def _is_target_in_pathpattern(targetpath: str, pathpattern: str) -&amp;gt; bool:
1185      &amp;#34;&amp;#34;&amp;#34;Determine whether ``targetpath`` matches the ``pathpattern``.&amp;#34;&amp;#34;&amp;#34;
1186      # We need to make sure that targetpath and pathpattern are pointing to
1187      # the same directory as fnmatch doesn&amp;#39;t threat &amp;#34;/&amp;#34; as a special symbol.
1188      target_parts = targetpath.split(&amp;#34;/&amp;#34;)
1189      pattern_parts = pathpattern.split(&amp;#34;/&amp;#34;)
1190      if len(target_parts) != len(pattern_parts):
1191          return False
1192
1193      # Every part in the pathpattern could include a glob pattern, that&amp;#39;s why
1194      # each of the target and pathpattern parts should ma…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: ggshield&lt;/p&gt;
&lt;p&gt;`DelegatedRole._is_target_in_pathpattern` uses `fnmatch.fnmatch` to decide whether a given target path is authorized by a delegation&amp;#39;s glob pattern.&lt;/p&gt;
&lt;p&gt;Python&amp;#39;s `fnmatch.fnmatch` calls `os.path.normcase()` on both arguments before matching. On POSIX hosts `normcase` is the identity function; on Windows hosts `os.path` resolves to `ntpath`, whose `normcase` lowercases its input and replaces `/` with `\`.&lt;/p&gt;
&lt;p&gt;As a result, python-tuf&amp;#39;s delegation *path pattern* matching is case-sensitive on Linux/macOS but case-INSENSITIVE on Windows. This makes the authorization decision for a target dependent on the host operating system of the client running the updater.&lt;/p&gt;
&lt;p&gt;The result on Windows is a TUF specification violation in the python-tuf `ngclient` implementation.&lt;/p&gt;
&lt;p&gt;## Vulnerable code&lt;/p&gt;
&lt;p&gt;`tuf/api/_payload.py` (HEAD `7ecb67d`):&lt;/p&gt;
&lt;p&gt;```python
1183  @staticmethod
1184  def _is_target_in_pathpattern(targetpath: str, pathpattern: str) -&amp;gt; bool:
1185      &amp;#34;&amp;#34;&amp;#34;Determine whether ``targetpath`` matches the ``pathpattern``.&amp;#34;&amp;#34;&amp;#34;
1186      # We need to make sure that targetpath and pathpattern are pointing to
1187      # the same directory as fnmatch doesn&amp;#39;t threat &amp;#34;/&amp;#34; as a special symbol.
1188      target_parts = targetpath.split(&amp;#34;/&amp;#34;)
1189      pattern_parts = pathpattern.split(&amp;#34;/&amp;#34;)
1190      if len(target_parts) != len(pattern_parts):
1191          return False
1192
1193      # Every part in the pathpattern could include a glob pattern, that&amp;#39;s why
1194      # each of the target and pathpattern parts should ma…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/brew-ggshield-ghsa-qp9x-wp8f-qgjj</guid>
    </item>
  </channel>
</rss>
