<?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>Tue, 29 Sep 2026 04:54:12 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-73621 — GitPython before 3.1.56 Arbitrary File Truncation via Commit.count</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-73621</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; gitpython-developers GitPython&lt;/p&gt;
&lt;p&gt;GitPython before 3.1.56 contains an argument injection vulnerability in the Commit.count() method, which forwards keyword arguments to &amp;#39;git rev-list&amp;#39; without the check_unsafe_options guard present in the sibling iter_items method. An attacker who can control options passed to Commit.count (e.g., via an application that forwards a user-supplied options dict) can supply output=&amp;lt;path&amp;gt;, causing &amp;#39;git rev-list --output=&amp;lt;path&amp;gt;&amp;#39; to open and truncate the target file to zero bytes before revision parsing. This allows destruction/blanking of an arbitrary file at the process&amp;#39;s privilege level (no content control, 0-byte truncation).&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 before 3.1.56 contains an argument injection vulnerability in the Commit.count() method, which forwards keyword arguments to &amp;#39;git rev-list&amp;#39; without the check_unsafe_options guard present in the sibling iter_items method. An attacker who can control options passed to Commit.count (e.g., via an application that forwards a user-supplied options dict) can supply output=&amp;lt;path&amp;gt;, causing &amp;#39;git rev-list --output=&amp;lt;path&amp;gt;&amp;#39; to open and truncate the target file to zero bytes before revision parsing. This allows destruction/blanking of an arbitrary file at the process&amp;#39;s privilege level (no content control, 0-byte truncation).&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-73621</guid>
    </item>
    <item>
      <title>GHSA-p538-c434-8v24 — GitPython: Arbitrary file truncation via git rev-list --output argument injection in unguarded Commit.count</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-p538-c434-8v24</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: GitPython&lt;/p&gt;
&lt;p&gt;## Summary
`Commit.count()` forwards `**kwargs` into `rev_list` with **no** `check_unsafe_options` guard (the guard exists only in the sibling `iter_items`, commit.py:341). `git rev-list --output=&amp;lt;path&amp;gt;` opens and truncates the target file to 0 bytes before revision parsing, so `count(output=&amp;#39;/victim&amp;#39;)` destroys/blanks an arbitrary file.&lt;/p&gt;
&lt;p&gt;## Root Cause
`commit.py:290-291` calls `self.repo.git.rev_list(self.hexsha, **kwargs)` with no `check_unsafe_options` and no `allow_unsafe_options` parameter. The sibling `iter_items` (commit.py:341) is guarded; `count` is not. This is a distinct, uncovered sink — GHSA-956x-8gvw-wg5v fixed `iter_commits`/`blame`, not `count`.&lt;/p&gt;
&lt;p&gt;## Impact
Destroy/blank an arbitrary file at process privilege (integrity/availability). Reachability is key-control only (`count` uses `self.hexsha`, not a user ref), and the write is a 0-byte truncation (no content control), so MEDIUM.&lt;/p&gt;
&lt;p&gt;## Proof of Concept
```python
commit.count(output=&amp;#39;/path/to/victim&amp;#39;)   # victim truncated to 0 bytes (verified)
# control: commit.iter_commits(output=...) raises UnsafeOptionError
```&lt;/p&gt;
&lt;p&gt;## Attack Chain
1. Entry: app forwards user options -&amp;gt; `commit.count(output=&amp;#39;/victim&amp;#39;)`. Guard: none. Bypass proof: `iter_commits(output=)` raises UnsafeOptionError; `count(output=)` does not — verified side-by-side.
2. Sink: `git rev-list &amp;lt;sha&amp;gt; --output=/victim` -&amp;gt; file truncated to 0 bytes. Impact: destroy/blank arbitrary file.&lt;/p&gt;
&lt;p&gt;## Bypass Evidence
Live-verified on HEAD (tag 3.1.53): `count(output=&amp;lt;v…&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
`Commit.count()` forwards `**kwargs` into `rev_list` with **no** `check_unsafe_options` guard (the guard exists only in the sibling `iter_items`, commit.py:341). `git rev-list --output=&amp;lt;path&amp;gt;` opens and truncates the target file to 0 bytes before revision parsing, so `count(output=&amp;#39;/victim&amp;#39;)` destroys/blanks an arbitrary file.&lt;/p&gt;
&lt;p&gt;## Root Cause
`commit.py:290-291` calls `self.repo.git.rev_list(self.hexsha, **kwargs)` with no `check_unsafe_options` and no `allow_unsafe_options` parameter. The sibling `iter_items` (commit.py:341) is guarded; `count` is not. This is a distinct, uncovered sink — GHSA-956x-8gvw-wg5v fixed `iter_commits`/`blame`, not `count`.&lt;/p&gt;
&lt;p&gt;## Impact
Destroy/blank an arbitrary file at process privilege (integrity/availability). Reachability is key-control only (`count` uses `self.hexsha`, not a user ref), and the write is a 0-byte truncation (no content control), so MEDIUM.&lt;/p&gt;
&lt;p&gt;## Proof of Concept
```python
commit.count(output=&amp;#39;/path/to/victim&amp;#39;)   # victim truncated to 0 bytes (verified)
# control: commit.iter_commits(output=...) raises UnsafeOptionError
```&lt;/p&gt;
&lt;p&gt;## Attack Chain
1. Entry: app forwards user options -&amp;gt; `commit.count(output=&amp;#39;/victim&amp;#39;)`. Guard: none. Bypass proof: `iter_commits(output=)` raises UnsafeOptionError; `count(output=)` does not — verified side-by-side.
2. Sink: `git rev-list &amp;lt;sha&amp;gt; --output=/victim` -&amp;gt; file truncated to 0 bytes. Impact: destroy/blank arbitrary file.&lt;/p&gt;
&lt;p&gt;## Bypass Evidence
Live-verified on HEAD (tag 3.1.53): `count(output=&amp;lt;v…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-p538-c434-8v24</guid>
    </item>
    <item>
      <title>PYSEC-2026-3950</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-3950</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: gitpython&lt;/p&gt;
&lt;p&gt;GitPython before 3.1.56 contains an argument injection vulnerability in the Commit.count() method, which forwards keyword arguments to &amp;#39;git rev-list&amp;#39; without the check_unsafe_options guard present in the sibling iter_items method. An attacker who can control options passed to Commit.count (e.g., via an application that forwards a user-supplied options dict) can supply output=&amp;lt;path&amp;gt;, causing &amp;#39;git rev-list --output=&amp;lt;path&amp;gt;&amp;#39; to open and truncate the target file to zero bytes before revision parsing. This allows destruction/blanking of an arbitrary file at the process&amp;#39;s privilege level (no content control, 0-byte truncation).&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 before 3.1.56 contains an argument injection vulnerability in the Commit.count() method, which forwards keyword arguments to &amp;#39;git rev-list&amp;#39; without the check_unsafe_options guard present in the sibling iter_items method. An attacker who can control options passed to Commit.count (e.g., via an application that forwards a user-supplied options dict) can supply output=&amp;lt;path&amp;gt;, causing &amp;#39;git rev-list --output=&amp;lt;path&amp;gt;&amp;#39; to open and truncate the target file to zero bytes before revision parsing. This allows destruction/blanking of an arbitrary file at the process&amp;#39;s privilege level (no content control, 0-byte truncation).&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-3950</guid>
    </item>
  </channel>
</rss>
