<?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, 01 Oct 2026 21:45:49 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-102938 — virtualenv writes prompt values into pyvenv.cfg without sanitizing line boundaries, allowing configuration injection</title>
      <link>https://db.gcve.eu/vuln/cve-2026-102938</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; pypa virtualenv&lt;/p&gt;
&lt;p&gt;virtualenv is a tool for creating isolated virtual python environments. Prior to 21.7.11, PyEnvCfg.write() writes prompt values verbatim to the line-oriented pyvenv.cfg format while PyEnvCfg._read_values() parses the file with str.splitlines() and accepts the last value for duplicate keys. An attacker who influences --prompt, VIRTUALENV_PROMPT, or configuration input can insert a recognized line boundary and additional keys, including home, causing consumers to use an attacker-selected base interpreter or corrupted environment metadata. The security impact requires prompt input from outside the operator&amp;#39;s trust boundary; directly supplied prompt content primarily corrupts the operator&amp;#39;s own environment. This issue is fixed in version 21.7.11.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; pypa virtualenv&lt;/p&gt;
&lt;p&gt;virtualenv is a tool for creating isolated virtual python environments. Prior to 21.7.11, PyEnvCfg.write() writes prompt values verbatim to the line-oriented pyvenv.cfg format while PyEnvCfg._read_values() parses the file with str.splitlines() and accepts the last value for duplicate keys. An attacker who influences --prompt, VIRTUALENV_PROMPT, or configuration input can insert a recognized line boundary and additional keys, including home, causing consumers to use an attacker-selected base interpreter or corrupted environment metadata. The security impact requires prompt input from outside the operator&amp;#39;s trust boundary; directly supplied prompt content primarily corrupts the operator&amp;#39;s own environment. This issue is fixed in version 21.7.11.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/cve-2026-102938</guid>
    </item>
    <item>
      <title>GHSA-9h9j-4vrj-gf7g — virtualenv writes prompt values into pyvenv.cfg without sanitizing line boundaries, allowing configuration injection</title>
      <link>https://db.gcve.eu/vuln/ghsa-9h9j-4vrj-gf7g</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: virtualenv&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`pyvenv.cfg` is a line-based format with no escape syntax. `PyEnvCfg.write()` wrote values verbatim, while `PyEnvCfg._read_values()` parses the file with `str.splitlines()`. A value containing a line boundary therefore became additional configuration lines, and because reading is last-wins, the injected keys replaced any key written earlier in the file.&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;The `prompt` value is the reachable input: it is set by `--prompt`, by the `VIRTUALENV_PROMPT` environment variable, or from the config file, and `write()` emits `prompt` before `home`. A crafted prompt can therefore set `home` in the generated `pyvenv.cfg`:&lt;/p&gt;
&lt;p&gt;```console
$ virtualenv --prompt $&amp;#39;x&amp;#34;\nhome = /attacker/path\nprompt = &amp;#34;z&amp;#39; venv
$ grep &amp;#39;^home&amp;#39; venv/pyvenv.cfg
home = /attacker/path
```&lt;/p&gt;
&lt;p&gt;`home` is what tooling reads to locate the base interpreter, so a consumer that trusts it can be pointed elsewhere. `implementation`, `version_info`, `version`, `executable`, `command` and `virtualenv` are also written before `prompt` and can be replaced the same way.&lt;/p&gt;
&lt;p&gt;This requires the prompt to come from somewhere other than the person running the command, for example a CI job templating a branch name into it, tooling deriving an environment name from user-supplied data, or an inherited `VIRTUALENV_PROMPT`. Where the operator supplies the prompt directly they already control the command line, and the effect is corruption rather than privilege gain: the value is truncated at the boundary and read back with a…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: virtualenv&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`pyvenv.cfg` is a line-based format with no escape syntax. `PyEnvCfg.write()` wrote values verbatim, while `PyEnvCfg._read_values()` parses the file with `str.splitlines()`. A value containing a line boundary therefore became additional configuration lines, and because reading is last-wins, the injected keys replaced any key written earlier in the file.&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;The `prompt` value is the reachable input: it is set by `--prompt`, by the `VIRTUALENV_PROMPT` environment variable, or from the config file, and `write()` emits `prompt` before `home`. A crafted prompt can therefore set `home` in the generated `pyvenv.cfg`:&lt;/p&gt;
&lt;p&gt;```console
$ virtualenv --prompt $&amp;#39;x&amp;#34;\nhome = /attacker/path\nprompt = &amp;#34;z&amp;#39; venv
$ grep &amp;#39;^home&amp;#39; venv/pyvenv.cfg
home = /attacker/path
```&lt;/p&gt;
&lt;p&gt;`home` is what tooling reads to locate the base interpreter, so a consumer that trusts it can be pointed elsewhere. `implementation`, `version_info`, `version`, `executable`, `command` and `virtualenv` are also written before `prompt` and can be replaced the same way.&lt;/p&gt;
&lt;p&gt;This requires the prompt to come from somewhere other than the person running the command, for example a CI job templating a branch name into it, tooling deriving an environment name from user-supplied data, or an inherited `VIRTUALENV_PROMPT`. Where the operator supplies the prompt directly they already control the command line, and the effect is corruption rather than privilege gain: the value is truncated at the boundary and read back with a…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-9h9j-4vrj-gf7g</guid>
    </item>
    <item>
      <title>PYSEC-2026-4012 — virtualenv writes prompt values into pyvenv.cfg without sanitizing line boundaries, allowing configuration injection</title>
      <link>https://db.gcve.eu/vuln/pysec-2026-4012</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: virtualenv&lt;/p&gt;
&lt;p&gt;`pyvenv.cfg` is a line-based format with no escape syntax. `PyEnvCfg.write()`
wrote values verbatim, while `PyEnvCfg._read_values()` parses the file with
`str.splitlines()`. A value containing a line boundary therefore became
additional configuration lines, and because reading is last-wins, the injected
keys replaced any key written earlier in the file.&lt;/p&gt;
&lt;p&gt;The `prompt` value is the reachable input: it is set by `--prompt`, by the
`VIRTUALENV_PROMPT` environment variable, or from the config file, and
`write()` emits `prompt` before `home`. A crafted prompt can therefore set
`home` in the generated `pyvenv.cfg`. `home` is what tooling reads to locate
the base interpreter, so a consumer that trusts it can be pointed elsewhere.
`implementation`, `version_info`, `version`, `executable`, `command` and
`virtualenv` are also written before `prompt` and can be replaced the same
way.&lt;/p&gt;
&lt;p&gt;This requires the prompt to come from somewhere other than the person running
the command, for example a CI job templating a branch name into it, tooling
deriving an environment name from user-supplied data, or an inherited
`VIRTUALENV_PROMPT`.&lt;/p&gt;
&lt;p&gt;The boundary set is the one `str.splitlines()` recognizes, which is wider than
`\n`: `\r`, `\v`, `\f`, the file, group and record separators, `U+0085`,
`U+2028` and `U+2029` were all written through unchanged and all split the
line when read back.&lt;/p&gt;
&lt;p&gt;Fixed in 21.7.11: `PyEnvCfg.write()` now collapses those boundaries to spaces
as it serializes each line, so it cannot…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: virtualenv&lt;/p&gt;
&lt;p&gt;`pyvenv.cfg` is a line-based format with no escape syntax. `PyEnvCfg.write()`
wrote values verbatim, while `PyEnvCfg._read_values()` parses the file with
`str.splitlines()`. A value containing a line boundary therefore became
additional configuration lines, and because reading is last-wins, the injected
keys replaced any key written earlier in the file.&lt;/p&gt;
&lt;p&gt;The `prompt` value is the reachable input: it is set by `--prompt`, by the
`VIRTUALENV_PROMPT` environment variable, or from the config file, and
`write()` emits `prompt` before `home`. A crafted prompt can therefore set
`home` in the generated `pyvenv.cfg`. `home` is what tooling reads to locate
the base interpreter, so a consumer that trusts it can be pointed elsewhere.
`implementation`, `version_info`, `version`, `executable`, `command` and
`virtualenv` are also written before `prompt` and can be replaced the same
way.&lt;/p&gt;
&lt;p&gt;This requires the prompt to come from somewhere other than the person running
the command, for example a CI job templating a branch name into it, tooling
deriving an environment name from user-supplied data, or an inherited
`VIRTUALENV_PROMPT`.&lt;/p&gt;
&lt;p&gt;The boundary set is the one `str.splitlines()` recognizes, which is wider than
`\n`: `\r`, `\v`, `\f`, the file, group and record separators, `U+0085`,
`U+2028` and `U+2029` were all written through unchanged and all split the
line when read back.&lt;/p&gt;
&lt;p&gt;Fixed in 21.7.11: `PyEnvCfg.write()` now collapses those boundaries to spaces
as it serializes each line, so it cannot…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/pysec-2026-4012</guid>
    </item>
  </channel>
</rss>
