CVE-2026-86000
ŚrednieCVSS 5.3Streszczenie
Soup Sieve to biblioteka selektorów CSS przeznaczona do użycia z Beautiful Soup 4. Przed wersją 2.9 parser selektorów w src/soupsieve/css_parser.py definiuje IDENTIFIER z sąsiadującymi grupami ilościowymi na nakładających się klasach znaków, a VALUE osadza IDENTIFIER dla selektorów atrybutów. Gdy selektor kontrolowany przez atakującego zawiera długi identyfikator lub niecytowany ciąg wartości atrybutu, po którym następuje dane wejściowe powodujące niepowodzenie ogólnego dopasowania, silnik wyrażeń regularnych przeszukuje kwadratowo wiele podziałów między nakładającymi się grupami. Selektory kontrolowane przez użytkownika mogą dotrzeć do tej ścieżki przez soupsieve.compile(), soupsieve.select() lub BeautifulSoup.select(), podczas gdy aplikacje używające tylko zakodowanych na stałe selektorów nie są dotknięte. Wynikające z tego zużycie CPU może utrzymać GIL Pythona, wyczerpać pracowników aplikacji i zatrzymać usługę; udane dopasowania zwykłych identyfikatorów są liniowe, a problem nie powoduje uszkodzenia pamięci ani wykonania kodu. Problem został naprawiony w wersji 2.9.
Ocena ryzyka
Ryzyko polega na możliwości przeprowadzenia ataku DoS poprzez przeciążenie CPU, co może prowadzić do niedostępności usługi dla użytkowników.
Rekomendacja
Zaleca się aktualizację biblioteki Soup Sieve do wersji 2.9 lub nowszej, która zawiera poprawkę eliminującą problem.
Inne podatności w Soup Sieve
Zobacz wszystkie- CVE-2026-85999Średnie
Soup Sieve to biblioteka selektorów CSS przeznaczona do użycia z Beautiful Soup 4. Przed wersją 2.9, selector_iter w src/soupsieve/css_parser.py przycina surowy selektor za pomocą RE_WS_END, wyrażenia kończącego się na WSC (białe znaki i komentarze) używanego z search(), więc silnik wyrażeń regularnych ponawia zachłanne skanowanie przy każdej pozycji początkowej. Selektor kontrolowany przez atakującego zawierający długi ciąg białych znaków wewnętrznych lub selektor zawierający długi ciąg komentarzy CSS, po którym następuje inny token, powoduje kwadratowe obciążenie CPU przed tokenizacją. Selektory kontrolowane przez użytkownika mogą dotrzeć do ścieżki przez soupsieve.compile() i BeautifulSoup.select(), podczas gdy aplikacje używające tylko zakodowanych na stałe selektorów nie są dotknięte. Ta przyczyna źródłowa jest oddzielona od podatności na cofanie się IDENTIFIER i VALUE, ponieważ koszt występuje w RE_WS_END.search podczas przycinania, a nie podczas dopasowywania tokenów. Wynikające z tego zużycie CPU może utrzymać GIL Pythona, wyczerpać pracowników i zatrzymać usługę bez powodowania uszkodzenia pamięci lub wykonania kodu. Problem został naprawiony w wersji 2.9.
- CVE-2026-49477Wysokie
Biblioteka Soup Sieve w wersjach przed 2.8.4 zawiera podatność na atak DoS poprzez wyrażenie regularne podatne na katastroficzne cofanie się. Atakujący może dostarczyć niesprawdzony selektor CSS z nieprawidłowo zamkniętą wartością atrybutu, co prowadzi do wyczerpania zasobów CPU.
- CVE-2026-49476Wysokie
Biblioteka Soup Sieve przed wersją 2.8.4 przydziela nieograniczoną pamięć podczas kompilowania dużych list selektorów oddzielonych przecinkami. Atakujący może dostarczyć spreparowany ciąg selektora do funkcji soupsieve.compile() lub Beautiful Soup .select()/.select_one(), co prowadzi do alokacji setek megabajtów pamięci i odmowy usługi.
Oryginalny opis (angielski, źródło NVD)
Soup Sieve is a CSS selector library designed to be used with Beautiful Soup 4. Prior to 2.9, the selector parser in src/soupsieve/css_parser.py defines IDENTIFIER with adjacent quantified groups over overlapping character classes, and VALUE embeds IDENTIFIER for attribute selectors. When an attacker-controlled selector contains a long identifier or unquoted attribute-value run followed by input that makes the overall match fail, the regular expression engine explores quadratically many splits between the overlapping groups. User-controlled selectors can reach this path through soupsieve.compile(), soupsieve.select(), or BeautifulSoup.select(), while applications using only hard-coded selectors are unaffected. The resulting CPU consumption can hold the Python GIL, exhaust application workers, and stall a service; successful plain identifier matches are linear, and the issue does not cause memory corruption or code execution. The issue is fixed in version 2.9.

