<?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 12:57:11 +0000</lastBuildDate>
    <item>
      <title>BREW-acronym-CVE-2026-81727 — NLTK: Downloader.download follows hardlinks and overwrites outside-root files</title>
      <link>https://vulnerability.circl.lu/vuln/brew-acronym-cve-2026-81727</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: acronym&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;NLTK&amp;#39;s downloader now blocks symlink escapes during ZIP extraction, but it still treats pre-existing hardlinks inside the install tree as ordinary in-root files. A normal package install can therefore overwrite an outside-root inode through that hardlink.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;- **Vulnerability type:** Filesystem containment bypass
- **Affected component:** `nltk.downloader.Downloader.download`, `nltk.downloader.Downloader.incr_download`
- **Affected versions:** Published `3.9.4` and current source `v3.10.0-rc2` both reproduced for the extraction-stage overwrite.
- **Patched versions:** 3.10.3
- **Root cause:** The downloader validates traversal and symlink conditions but does not reject pre-existing hardlink aliases inside the install tree.&lt;/p&gt;
&lt;p&gt;The install flow correctly rejects a pre-existing symlink at an extraction target, yet it accepts a pre-existing hardlink at the same path. When the package is installed, extracted member data is written through the hardlink and mutates the outside inode.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;**Preconditions**
- The attacker can plant files inside a writable shared downloader root on the same filesystem as the target file.&lt;/p&gt;
&lt;p&gt;**Steps**
1. Prepare a downloader root and create a hardlink inside it that points to an outside target file.
2. Confirm a symlink at the same path is rejected as a negative control.
3. Run a normal `Downloader.download()` package install whose extracted member lands on the hardlink path.
4. Observe the outside target file is overwritten w…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: acronym&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;NLTK&amp;#39;s downloader now blocks symlink escapes during ZIP extraction, but it still treats pre-existing hardlinks inside the install tree as ordinary in-root files. A normal package install can therefore overwrite an outside-root inode through that hardlink.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;- **Vulnerability type:** Filesystem containment bypass
- **Affected component:** `nltk.downloader.Downloader.download`, `nltk.downloader.Downloader.incr_download`
- **Affected versions:** Published `3.9.4` and current source `v3.10.0-rc2` both reproduced for the extraction-stage overwrite.
- **Patched versions:** 3.10.3
- **Root cause:** The downloader validates traversal and symlink conditions but does not reject pre-existing hardlink aliases inside the install tree.&lt;/p&gt;
&lt;p&gt;The install flow correctly rejects a pre-existing symlink at an extraction target, yet it accepts a pre-existing hardlink at the same path. When the package is installed, extracted member data is written through the hardlink and mutates the outside inode.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;**Preconditions**
- The attacker can plant files inside a writable shared downloader root on the same filesystem as the target file.&lt;/p&gt;
&lt;p&gt;**Steps**
1. Prepare a downloader root and create a hardlink inside it that points to an outside target file.
2. Confirm a symlink at the same path is rejected as a negative control.
3. Run a normal `Downloader.download()` package install whose extracted member lands on the hardlink path.
4. Observe the outside target file is overwritten w…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/brew-acronym-cve-2026-81727</guid>
    </item>
    <item>
      <title>CVE-2026-81727 — NLTK before 3.10.3 Hardlink File Overwrite via downloader</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-81727</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; nltk&lt;/p&gt;
&lt;p&gt;NLTK versions before 3.10.3 contain a filesystem containment bypass vulnerability in the Downloader.download and Downloader.incr_download methods that allows attackers to overwrite files outside the install root through pre-existing hardlinks. Attackers with write access to a shared downloader directory can create hardlinks pointing to outside-root files that are then overwritten during normal package extraction, mutating files outside the intended install tree.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; nltk&lt;/p&gt;
&lt;p&gt;NLTK versions before 3.10.3 contain a filesystem containment bypass vulnerability in the Downloader.download and Downloader.incr_download methods that allows attackers to overwrite files outside the install root through pre-existing hardlinks. Attackers with write access to a shared downloader directory can create hardlinks pointing to outside-root files that are then overwritten during normal package extraction, mutating files outside the intended install tree.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-81727</guid>
    </item>
    <item>
      <title>GHSA-f794-5jv7-7672 — NLTK: Downloader.download follows hardlinks and overwrites outside-root files</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-f794-5jv7-7672</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nltk&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;NLTK&amp;#39;s downloader now blocks symlink escapes during ZIP extraction, but it still treats pre-existing hardlinks inside the install tree as ordinary in-root files. A normal package install can therefore overwrite an outside-root inode through that hardlink.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;- **Vulnerability type:** Filesystem containment bypass
- **Affected component:** `nltk.downloader.Downloader.download`, `nltk.downloader.Downloader.incr_download`
- **Affected versions:** Published `3.9.4` and current source `v3.10.0-rc2` both reproduced for the extraction-stage overwrite.
- **Patched versions:** 3.10.3
- **Root cause:** The downloader validates traversal and symlink conditions but does not reject pre-existing hardlink aliases inside the install tree.&lt;/p&gt;
&lt;p&gt;The install flow correctly rejects a pre-existing symlink at an extraction target, yet it accepts a pre-existing hardlink at the same path. When the package is installed, extracted member data is written through the hardlink and mutates the outside inode.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;**Preconditions**
- The attacker can plant files inside a writable shared downloader root on the same filesystem as the target file.&lt;/p&gt;
&lt;p&gt;**Steps**
1. Prepare a downloader root and create a hardlink inside it that points to an outside target file.
2. Confirm a symlink at the same path is rejected as a negative control.
3. Run a normal `Downloader.download()` package install whose extracted member lands on the hardlink path.
4. Observe the outside target file is overwritten w…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nltk&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;NLTK&amp;#39;s downloader now blocks symlink escapes during ZIP extraction, but it still treats pre-existing hardlinks inside the install tree as ordinary in-root files. A normal package install can therefore overwrite an outside-root inode through that hardlink.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;- **Vulnerability type:** Filesystem containment bypass
- **Affected component:** `nltk.downloader.Downloader.download`, `nltk.downloader.Downloader.incr_download`
- **Affected versions:** Published `3.9.4` and current source `v3.10.0-rc2` both reproduced for the extraction-stage overwrite.
- **Patched versions:** 3.10.3
- **Root cause:** The downloader validates traversal and symlink conditions but does not reject pre-existing hardlink aliases inside the install tree.&lt;/p&gt;
&lt;p&gt;The install flow correctly rejects a pre-existing symlink at an extraction target, yet it accepts a pre-existing hardlink at the same path. When the package is installed, extracted member data is written through the hardlink and mutates the outside inode.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;**Preconditions**
- The attacker can plant files inside a writable shared downloader root on the same filesystem as the target file.&lt;/p&gt;
&lt;p&gt;**Steps**
1. Prepare a downloader root and create a hardlink inside it that points to an outside target file.
2. Confirm a symlink at the same path is rejected as a negative control.
3. Run a normal `Downloader.download()` package install whose extracted member lands on the hardlink path.
4. Observe the outside target file is overwritten w…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-f794-5jv7-7672</guid>
    </item>
  </channel>
</rss>
