<?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>Mon, 28 Sep 2026 21:36:19 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-85999 — Soup Sieve: Polynomial-time ReDoS (O(n²)) in the whitespace/comment trimming regex `RE_WS_END` (triggers on VALID selec…</title>
      <link>https://db.gcve.eu/vuln/cve-2026-85999</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; facelessuser soupsieve&lt;/p&gt;
&lt;p&gt;Soup Sieve is a CSS selector library designed to be used with Beautiful Soup 4. Prior to 2.9, selector_iter in src/soupsieve/css_parser.py trims the raw selector with RE_WS_END, an end-anchored WSC whitespace-and-comment expression used with search(), so the regular expression engine retries a greedy scan at every starting offset. An attacker-controlled valid selector containing a long internal whitespace run, or a selector containing a long CSS comment run followed by another token, causes quadratic CPU work before tokenization. User-controlled selectors can reach the path through soupsieve.compile() and BeautifulSoup.select(), while applications using only hard-coded selectors are unaffected. This root cause is separate from the IDENTIFIER and VALUE backtracking vulnerability because the cost occurs in RE_WS_END.search during trimming rather than token matching. The resulting CPU consumption can hold the Python GIL, exhaust workers, and stall a service without causing memory corruption or code execution. The issue is fixed in version 2.9.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; facelessuser soupsieve&lt;/p&gt;
&lt;p&gt;Soup Sieve is a CSS selector library designed to be used with Beautiful Soup 4. Prior to 2.9, selector_iter in src/soupsieve/css_parser.py trims the raw selector with RE_WS_END, an end-anchored WSC whitespace-and-comment expression used with search(), so the regular expression engine retries a greedy scan at every starting offset. An attacker-controlled valid selector containing a long internal whitespace run, or a selector containing a long CSS comment run followed by another token, causes quadratic CPU work before tokenization. User-controlled selectors can reach the path through soupsieve.compile() and BeautifulSoup.select(), while applications using only hard-coded selectors are unaffected. This root cause is separate from the IDENTIFIER and VALUE backtracking vulnerability because the cost occurs in RE_WS_END.search during trimming rather than token matching. The resulting CPU consumption can hold the Python GIL, exhaust workers, and stall a service without causing memory corruption or code execution. The issue is fixed in version 2.9.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/cve-2026-85999</guid>
    </item>
    <item>
      <title>GHSA-j934-xhv5-fg8f — Soup Sieve: Polynomial-time ReDoS (O(n²)) in the whitespace/comment trimming regex `RE_WS_END` (triggers on VALID selec…</title>
      <link>https://db.gcve.eu/vuln/ghsa-j934-xhv5-fg8f</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: soupsieve&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;Before tokenizing, `selector_iter` trims leading/trailing whitespace and comments by running two regexes over the whole raw selector with `.search()`. The trailing one, `RE_WS_END = re.compile(r&amp;#39;{WSC}*$&amp;#39;)`, is anchored only at the end (`$`), not the start. Because `.search()` retries the pattern at every offset, a long run of whitespace or CSS comments that is not sitting exactly at the end of the string makes each retry greedily consume the run and then fail `$`, producing O(n²) time. This triggers on perfectly valid selectors — e.g. a descendant combinator with a long whitespace gap, `a` + `&amp;#34; &amp;#34;*n` + `b` — so no malformed input is required. A single valid ~20 KB selector stalls the interpreter for ~10 s of CPU.&lt;/p&gt;
&lt;p&gt;## Trust model (Q0)&lt;/p&gt;
&lt;p&gt;The selector string is the input, reaching this code via `soupsieve.compile()`, the `soupsieve.select/iselect/match/filter` helpers, and BeautifulSoup&amp;#39;s `soup.select(selector)` / `soup.select_one(selector)`. Exploitable wherever an application passes a user-controlled CSS selector to BeautifulSoup/soupsieve. Applications using only hard-coded selectors are unaffected.&lt;/p&gt;
&lt;p&gt;## Root cause (exact anchors) — `src/soupsieve/css_parser.py`&lt;/p&gt;
&lt;p&gt;```python
# line 185-186
RE_WS_BEGIN = re.compile(fr&amp;#39;^{WSC}*&amp;#39;)   # anchored at start -&amp;gt; .search() only tries pos 0 -&amp;gt; linear (safe)
RE_WS_END   = re.compile(fr&amp;#39;{WSC}*$&amp;#39;)   # NOT anchored at start -&amp;gt; .search() tries every offset&lt;/p&gt;
&lt;p&gt;# selector_iter, lines ~1322-1326
m = RE_WS_BEGIN.search(pattern)
index = m.end…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: soupsieve&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;Before tokenizing, `selector_iter` trims leading/trailing whitespace and comments by running two regexes over the whole raw selector with `.search()`. The trailing one, `RE_WS_END = re.compile(r&amp;#39;{WSC}*$&amp;#39;)`, is anchored only at the end (`$`), not the start. Because `.search()` retries the pattern at every offset, a long run of whitespace or CSS comments that is not sitting exactly at the end of the string makes each retry greedily consume the run and then fail `$`, producing O(n²) time. This triggers on perfectly valid selectors — e.g. a descendant combinator with a long whitespace gap, `a` + `&amp;#34; &amp;#34;*n` + `b` — so no malformed input is required. A single valid ~20 KB selector stalls the interpreter for ~10 s of CPU.&lt;/p&gt;
&lt;p&gt;## Trust model (Q0)&lt;/p&gt;
&lt;p&gt;The selector string is the input, reaching this code via `soupsieve.compile()`, the `soupsieve.select/iselect/match/filter` helpers, and BeautifulSoup&amp;#39;s `soup.select(selector)` / `soup.select_one(selector)`. Exploitable wherever an application passes a user-controlled CSS selector to BeautifulSoup/soupsieve. Applications using only hard-coded selectors are unaffected.&lt;/p&gt;
&lt;p&gt;## Root cause (exact anchors) — `src/soupsieve/css_parser.py`&lt;/p&gt;
&lt;p&gt;```python
# line 185-186
RE_WS_BEGIN = re.compile(fr&amp;#39;^{WSC}*&amp;#39;)   # anchored at start -&amp;gt; .search() only tries pos 0 -&amp;gt; linear (safe)
RE_WS_END   = re.compile(fr&amp;#39;{WSC}*$&amp;#39;)   # NOT anchored at start -&amp;gt; .search() tries every offset&lt;/p&gt;
&lt;p&gt;# selector_iter, lines ~1322-1326
m = RE_WS_BEGIN.search(pattern)
index = m.end…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-j934-xhv5-fg8f</guid>
    </item>
  </channel>
</rss>
