<?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 10:27:14 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-42284 — GitPython: Unsafe option check validates multi_options before shlex.split transforms it</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-42284</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; gitpython-developers GitPython&lt;/p&gt;
&lt;p&gt;GitPython is a python library used to interact with Git repositories. Prior to version 3.1.47, _clone() validates multi_options as the original list, then executes shlex.split(&amp;#34; &amp;#34;.join(multi_options)). A string like &amp;#34;--branch main --config core.hooksPath=/x&amp;#34; passes validation (starts with --branch), but after split becomes [&amp;#34;--branch&amp;#34;, &amp;#34;main&amp;#34;, &amp;#34;--config&amp;#34;, &amp;#34;core.hooksPath=/x&amp;#34;]. Git applies the config and executes attacker hooks during clone. This issue has been patched in version 3.1.47.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; gitpython-developers GitPython&lt;/p&gt;
&lt;p&gt;GitPython is a python library used to interact with Git repositories. Prior to version 3.1.47, _clone() validates multi_options as the original list, then executes shlex.split(&amp;#34; &amp;#34;.join(multi_options)). A string like &amp;#34;--branch main --config core.hooksPath=/x&amp;#34; passes validation (starts with --branch), but after split becomes [&amp;#34;--branch&amp;#34;, &amp;#34;main&amp;#34;, &amp;#34;--config&amp;#34;, &amp;#34;core.hooksPath=/x&amp;#34;]. Git applies the config and executes attacker hooks during clone. This issue has been patched in version 3.1.47.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-42284</guid>
    </item>
    <item>
      <title>GHSA-x2qx-6953-8485 — GitPython: Unsafe option check validates multi_options before shlex.split transformation</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-x2qx-6953-8485</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: GitPython&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`_clone()` validates `multi_options` as the original list, then executes `shlex.split(&amp;#34; &amp;#34;.join(multi_options))`. A string like `&amp;#34;--branch main --config core.hooksPath=/x&amp;#34;` passes validation (starts with `--branch`), but after split becomes `[&amp;#34;--branch&amp;#34;, &amp;#34;main&amp;#34;, &amp;#34;--config&amp;#34;, &amp;#34;core.hooksPath=/x&amp;#34;]`. Git applies the config and executes attacker hooks during clone.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The vulnerable code is in [`git/repo/base.py` line 1383](https://github.com/gitpython-developers/GitPython/blob/5937d14a2c5e532fcb3ece0f45bf75e5bf18539e/git/repo/base.py#L1383):
```python
multi = shlex.split(&amp;#34; &amp;#34;.join(multi_options))
```&lt;/p&gt;
&lt;p&gt;Then validation runs on the **original** list at [line 1390](https://github.com/gitpython-developers/GitPython/blob/5937d14a2c5e532fcb3ece0f45bf75e5bf18539e/git/repo/base.py#L1390):
```python
Git.check_unsafe_options(options=multi_options, unsafe_options=cls.unsafe_git_clone_options)
```&lt;/p&gt;
&lt;p&gt;Then execution uses the **transformed** result at [line 1392](https://github.com/gitpython-developers/GitPython/blob/5937d14a2c5e532fcb3ece0f45bf75e5bf18539e/git/repo/base.py#L1392):
```python
proc = git.clone(multi, &amp;#34;--&amp;#34;, url, path, ...)
```&lt;/p&gt;
&lt;p&gt;The [check at `git/cmd.py` line 959](https://github.com/gitpython-developers/GitPython/blob/5937d14a2c5e532fcb3ece0f45bf75e5bf18539e/git/cmd.py#L959) uses `startswith`:
```python
if option.startswith(unsafe_option) or option == bare_option:
```&lt;/p&gt;
&lt;p&gt;`&amp;#34;--branch main --config ...&amp;#34;` does not start with `&amp;#34;--config&amp;#34;`, so it passes. After `shlex.…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: GitPython&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`_clone()` validates `multi_options` as the original list, then executes `shlex.split(&amp;#34; &amp;#34;.join(multi_options))`. A string like `&amp;#34;--branch main --config core.hooksPath=/x&amp;#34;` passes validation (starts with `--branch`), but after split becomes `[&amp;#34;--branch&amp;#34;, &amp;#34;main&amp;#34;, &amp;#34;--config&amp;#34;, &amp;#34;core.hooksPath=/x&amp;#34;]`. Git applies the config and executes attacker hooks during clone.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The vulnerable code is in [`git/repo/base.py` line 1383](https://github.com/gitpython-developers/GitPython/blob/5937d14a2c5e532fcb3ece0f45bf75e5bf18539e/git/repo/base.py#L1383):
```python
multi = shlex.split(&amp;#34; &amp;#34;.join(multi_options))
```&lt;/p&gt;
&lt;p&gt;Then validation runs on the **original** list at [line 1390](https://github.com/gitpython-developers/GitPython/blob/5937d14a2c5e532fcb3ece0f45bf75e5bf18539e/git/repo/base.py#L1390):
```python
Git.check_unsafe_options(options=multi_options, unsafe_options=cls.unsafe_git_clone_options)
```&lt;/p&gt;
&lt;p&gt;Then execution uses the **transformed** result at [line 1392](https://github.com/gitpython-developers/GitPython/blob/5937d14a2c5e532fcb3ece0f45bf75e5bf18539e/git/repo/base.py#L1392):
```python
proc = git.clone(multi, &amp;#34;--&amp;#34;, url, path, ...)
```&lt;/p&gt;
&lt;p&gt;The [check at `git/cmd.py` line 959](https://github.com/gitpython-developers/GitPython/blob/5937d14a2c5e532fcb3ece0f45bf75e5bf18539e/git/cmd.py#L959) uses `startswith`:
```python
if option.startswith(unsafe_option) or option == bare_option:
```&lt;/p&gt;
&lt;p&gt;`&amp;#34;--branch main --config ...&amp;#34;` does not start with `&amp;#34;--config&amp;#34;`, so it passes. After `shlex.…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-x2qx-6953-8485</guid>
    </item>
    <item>
      <title>PYSEC-2026-2161</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-2161</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: gitpython&lt;/p&gt;
&lt;p&gt;GitPython is a python library used to interact with Git repositories. Prior to version 3.1.47, _clone() validates multi_options as the original list, then executes shlex.split(&amp;#34; &amp;#34;.join(multi_options)). A string like &amp;#34;--branch main --config core.hooksPath=/x&amp;#34; passes validation (starts with --branch), but after split becomes [&amp;#34;--branch&amp;#34;, &amp;#34;main&amp;#34;, &amp;#34;--config&amp;#34;, &amp;#34;core.hooksPath=/x&amp;#34;]. Git applies the config and executes attacker hooks during clone. This issue has been patched in version 3.1.47.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: gitpython&lt;/p&gt;
&lt;p&gt;GitPython is a python library used to interact with Git repositories. Prior to version 3.1.47, _clone() validates multi_options as the original list, then executes shlex.split(&amp;#34; &amp;#34;.join(multi_options)). A string like &amp;#34;--branch main --config core.hooksPath=/x&amp;#34; passes validation (starts with --branch), but after split becomes [&amp;#34;--branch&amp;#34;, &amp;#34;main&amp;#34;, &amp;#34;--config&amp;#34;, &amp;#34;core.hooksPath=/x&amp;#34;]. Git applies the config and executes attacker hooks during clone. This issue has been patched in version 3.1.47.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-2161</guid>
    </item>
  </channel>
</rss>
