<?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>Mon, 28 Sep 2026 15:15:29 +0000</lastBuildDate>
    <item>
      <title>BREW-copier-CVE-2026-53951 — Copier has a trust-prefix bypass via path traversal that runs tasks unprompted</title>
      <link>https://vulnerability.circl.lu/vuln/brew-copier-cve-2026-53951</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: copier&lt;/p&gt;
&lt;p&gt;# Copier: trust-prefix bypass via path traversal runs tasks unprompted&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;In copier `&amp;gt;= 9.5.0, &amp;lt;= 9.15.1`, the `trust` setting&amp;#39;s prefix match
(`copier/_settings.py`) compares the template URL against a trusted prefix with
a raw `str.startswith` and **no path normalization**, while the URL *is*
normalized when the template is actually fetched (`Path.resolve()` for local
paths; libcurl dot-segment removal for `https`). A template reference that
textually starts with a trusted prefix but contains `..`
(e.g. `https://github.com/trusted-org/../attacker-org/repo.git`) is therefore
granted trust yet resolves to a different, attacker-controlled template, whose
`tasks` / `migrations` / `jinja_extensions` then run **without the `--trust`
prompt** — arbitrary command execution. Likely **CWE-22 (Improper Limitation of
a Pathname)** in the trust check leading to **CWE-94 (code execution)**.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`trust` lets users mark template locations as trusted so copier skips the
unsafe-feature gate. A trailing `/` makes an entry a **prefix** match
(`docs/settings.md`: *&amp;#34;Locations ending with `/` will be matched as prefixes,
trusting all templates from that location&amp;#34;*).&lt;/p&gt;
&lt;p&gt;`copier/_settings.py:141-146` (tag `v9.15.1`):&lt;/p&gt;
&lt;p&gt;```python
    return any(
        repository.startswith(_normalize(t))
        if t.endswith(&amp;#34;/&amp;#34;)
        else repository == _normalize(t)
        for t in trust
    )
```&lt;/p&gt;
&lt;p&gt;`_normalize` only expands `~`; it does **not** touch `..` or collapse segments —
`copier/_set…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: copier&lt;/p&gt;
&lt;p&gt;# Copier: trust-prefix bypass via path traversal runs tasks unprompted&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;In copier `&amp;gt;= 9.5.0, &amp;lt;= 9.15.1`, the `trust` setting&amp;#39;s prefix match
(`copier/_settings.py`) compares the template URL against a trusted prefix with
a raw `str.startswith` and **no path normalization**, while the URL *is*
normalized when the template is actually fetched (`Path.resolve()` for local
paths; libcurl dot-segment removal for `https`). A template reference that
textually starts with a trusted prefix but contains `..`
(e.g. `https://github.com/trusted-org/../attacker-org/repo.git`) is therefore
granted trust yet resolves to a different, attacker-controlled template, whose
`tasks` / `migrations` / `jinja_extensions` then run **without the `--trust`
prompt** — arbitrary command execution. Likely **CWE-22 (Improper Limitation of
a Pathname)** in the trust check leading to **CWE-94 (code execution)**.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`trust` lets users mark template locations as trusted so copier skips the
unsafe-feature gate. A trailing `/` makes an entry a **prefix** match
(`docs/settings.md`: *&amp;#34;Locations ending with `/` will be matched as prefixes,
trusting all templates from that location&amp;#34;*).&lt;/p&gt;
&lt;p&gt;`copier/_settings.py:141-146` (tag `v9.15.1`):&lt;/p&gt;
&lt;p&gt;```python
    return any(
        repository.startswith(_normalize(t))
        if t.endswith(&amp;#34;/&amp;#34;)
        else repository == _normalize(t)
        for t in trust
    )
```&lt;/p&gt;
&lt;p&gt;`_normalize` only expands `~`; it does **not** touch `..` or collapse segments —
`copier/_set…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/brew-copier-cve-2026-53951</guid>
    </item>
    <item>
      <title>CVE-2026-53951 — Copier: trust-prefix bypass via path traversal runs tasks unprompted</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-53951</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; copier-org copier&lt;/p&gt;
&lt;p&gt;Copier is a library and CLI app for rendering project templates. In versions 9.5.0 through 9.15.1, the `trust` setting&amp;#39;s prefix match
(`copier/_settings.py`) compares the template URL against a trusted prefix with a raw `str.startswith` and no path normalization, while the URL is normalized when the template is actually fetched (`Path.resolve()` for local paths; libcurl dot-segment removal for `https`). A template reference that textually starts with a trusted prefix but contains `..` is therefore granted trust yet resolves to a different, attacker-controlled template, whose `tasks` / `migrations` / `jinja_extensions` then run without the `--trust` prompt — arbitrary command execution. Version 9.15.2 patches the issue.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; copier-org copier&lt;/p&gt;
&lt;p&gt;Copier is a library and CLI app for rendering project templates. In versions 9.5.0 through 9.15.1, the `trust` setting&amp;#39;s prefix match
(`copier/_settings.py`) compares the template URL against a trusted prefix with a raw `str.startswith` and no path normalization, while the URL is normalized when the template is actually fetched (`Path.resolve()` for local paths; libcurl dot-segment removal for `https`). A template reference that textually starts with a trusted prefix but contains `..` is therefore granted trust yet resolves to a different, attacker-controlled template, whose `tasks` / `migrations` / `jinja_extensions` then run without the `--trust` prompt — arbitrary command execution. Version 9.15.2 patches the issue.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-53951</guid>
    </item>
    <item>
      <title>GHSA-9gmc-jqmh-3rvm — Copier has a trust-prefix bypass via path traversal that runs tasks unprompted</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-9gmc-jqmh-3rvm</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: copier&lt;/p&gt;
&lt;p&gt;# Copier: trust-prefix bypass via path traversal runs tasks unprompted&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;In copier `&amp;gt;= 9.5.0, &amp;lt;= 9.15.1`, the `trust` setting&amp;#39;s prefix match
(`copier/_settings.py`) compares the template URL against a trusted prefix with
a raw `str.startswith` and **no path normalization**, while the URL *is*
normalized when the template is actually fetched (`Path.resolve()` for local
paths; libcurl dot-segment removal for `https`). A template reference that
textually starts with a trusted prefix but contains `..`
(e.g. `https://github.com/trusted-org/../attacker-org/repo.git`) is therefore
granted trust yet resolves to a different, attacker-controlled template, whose
`tasks` / `migrations` / `jinja_extensions` then run **without the `--trust`
prompt** — arbitrary command execution. Likely **CWE-22 (Improper Limitation of
a Pathname)** in the trust check leading to **CWE-94 (code execution)**.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`trust` lets users mark template locations as trusted so copier skips the
unsafe-feature gate. A trailing `/` makes an entry a **prefix** match
(`docs/settings.md`: *&amp;#34;Locations ending with `/` will be matched as prefixes,
trusting all templates from that location&amp;#34;*).&lt;/p&gt;
&lt;p&gt;`copier/_settings.py:141-146` (tag `v9.15.1`):&lt;/p&gt;
&lt;p&gt;```python
    return any(
        repository.startswith(_normalize(t))
        if t.endswith(&amp;#34;/&amp;#34;)
        else repository == _normalize(t)
        for t in trust
    )
```&lt;/p&gt;
&lt;p&gt;`_normalize` only expands `~`; it does **not** touch `..` or collapse segments —
`copier/_set…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: copier&lt;/p&gt;
&lt;p&gt;# Copier: trust-prefix bypass via path traversal runs tasks unprompted&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;In copier `&amp;gt;= 9.5.0, &amp;lt;= 9.15.1`, the `trust` setting&amp;#39;s prefix match
(`copier/_settings.py`) compares the template URL against a trusted prefix with
a raw `str.startswith` and **no path normalization**, while the URL *is*
normalized when the template is actually fetched (`Path.resolve()` for local
paths; libcurl dot-segment removal for `https`). A template reference that
textually starts with a trusted prefix but contains `..`
(e.g. `https://github.com/trusted-org/../attacker-org/repo.git`) is therefore
granted trust yet resolves to a different, attacker-controlled template, whose
`tasks` / `migrations` / `jinja_extensions` then run **without the `--trust`
prompt** — arbitrary command execution. Likely **CWE-22 (Improper Limitation of
a Pathname)** in the trust check leading to **CWE-94 (code execution)**.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`trust` lets users mark template locations as trusted so copier skips the
unsafe-feature gate. A trailing `/` makes an entry a **prefix** match
(`docs/settings.md`: *&amp;#34;Locations ending with `/` will be matched as prefixes,
trusting all templates from that location&amp;#34;*).&lt;/p&gt;
&lt;p&gt;`copier/_settings.py:141-146` (tag `v9.15.1`):&lt;/p&gt;
&lt;p&gt;```python
    return any(
        repository.startswith(_normalize(t))
        if t.endswith(&amp;#34;/&amp;#34;)
        else repository == _normalize(t)
        for t in trust
    )
```&lt;/p&gt;
&lt;p&gt;`_normalize` only expands `~`; it does **not** touch `..` or collapse segments —
`copier/_set…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-9gmc-jqmh-3rvm</guid>
    </item>
  </channel>
</rss>
