Repository navigation
deps: add a soupsieve>=2.9 security floor - #208
Merged
Merged
Conversation
soupsieve 2.8.4 has PYSEC-2026-4170 and PYSEC-2026-4171 (ReDoS in the selector parser), fixed in 2.9. 2.8.3 also has PYSEC-2026-3071 and PYSEC-2026-3072, fixed in 2.8.4. soupsieve is a transitive of beautifulsoup4, which only asks for soupsieve>=1.6.1. Without a line of its own, pip does not upgrade it in an existing venv unless run with --upgrade --upgrade-strategy eager, and PyInstaller bundles it. The floor cannot go to 3.x: every soupsieve 3.x requires Python >=3.11 (>=3.11.5 from 3.0.2). The appimage job in build.yml (Python 3.10) and the snap (core22, Python 3.10) both install requirements.txt, and the release job needs the appimage job. Measured with a real Python 3.10.9: ">=2.9" resolves to 2.10, and ">=3.0.3" gives "No matching distribution". New tests/test_soupsieve_py310.py fails if the soupsieve line stops admitting 2.10, so a Dependabot PR that raises it goes red. Also: a new SECURITY_FLOORS entry in tests/test_dependency_security_floors.py, soupsieve added to FLATPAK_OMITTED (beautifulsoup4 is not in the Flatpak either), and flatpak/README.md corrected to match. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Contributor
Python dependencies security checkpip-audit:
|
| Package | Pin | Latest on PyPI | Status |
|---|---|---|---|
| PySide6 | PySide6>=6.11.1,<6.12 |
6.12.0 |
outdated |
| pypdf | pypdf>=6.19.0 |
6.21.0 |
outdated |
| cryptography | cryptography>=50.0.1 |
50.0.2 |
outdated |
| qtawesome | qtawesome>=1.4.2 |
1.4.2 |
up-to-date |
| pillow | pillow>=12.3.0 |
12.3.0 |
up-to-date |
| pymupdf | pymupdf>=1.28.2 |
1.28.2 |
up-to-date |
| pytesseract | pytesseract>=0.3.13 |
0.3.13 |
up-to-date |
| python-docx | python-docx>=1.2.0 |
1.2.0 |
up-to-date |
| python-pptx | python-pptx>=1.0.2 |
1.0.2 |
up-to-date |
| openpyxl | openpyxl>=3.1.5 |
3.1.5 |
up-to-date |
| beautifulsoup4 | beautifulsoup4>=4.15.0 |
4.15.0 |
up-to-date |
| ebooklib | ebooklib>=0.20 |
0.20 |
up-to-date |
| lxml | lxml>=6.1.3 |
6.1.3 |
up-to-date |
| urllib3 | urllib3>=2.8.0 |
2.8.0 |
up-to-date |
| idna | idna>=3.18 |
3.20 |
outdated |
| soupsieve | soupsieve>=2.9 |
3.0.3 |
outdated |
| pyinstaller | pyinstaller>=6.22.3 |
6.22.3 |
up-to-date |
Auto-generated by security-deps workflow. Merge is blocked only when pip-audit --strict reports vulnerabilities.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
soupsieve 2.8.4 has PYSEC-2026-4170 and PYSEC-2026-4171 (ReDoS in the selector parser), fixed in 2.9. 2.8.3 also has PYSEC-2026-3071 and PYSEC-2026-3072, fixed in 2.8.4.
soupsieve is a transitive of beautifulsoup4, which only asks for
soupsieve>=1.6.1. Without a line of its own inrequirements.txt, pip does not upgrade it in an existing venv unless run with--upgrade --upgrade-strategy eager(table below), and PyInstaller bundles it.Why not 3.x
Every soupsieve 3.x requires Python >= 3.11.
Requires-Pythonon PyPI, measured on 2026-10-16:Two builds install
requirements.txton Python 3.10: theappimagejob inbuild.yml(ubuntu-22.04, Python 3.10), which thereleasejob needs, and the snap (core22, Python 3.10).Measured with a real Python 3.10.9:
soupsieve>=2.9resolves to 2.10, andsoupsieve>=3.0.3gives "No matching distribution".A Dependabot PR raising this to >=3.0.3 will go red on test_soupsieve_py310.py; close it by hand while the AppImage/snap build on Python 3.10.
Changes
requirements.txt:soupsieve>=2.9, with a comment covering the advisories, the Python 3.10 ceiling and when to lift it.tests/test_soupsieve_py310.py(new): fails if the soupsieve line stops admitting 2.10 or gains an environment marker.tests/test_dependency_security_floors.py: newSECURITY_FLOORSentry,"soupsieve": ("2.9", ("2.8.3", "2.8.4")).tests/test_flatpak_dependency_pins.py:soupsieveadded toFLATPAK_OMITTED(beautifulsoup4 is not in the Flatpak either); comment above the set rewritten.flatpak/README.md: nine omitted entries instead of eight, asoupsieveentry under the floor-only pins, and thepyinstallerentry corrected (it builds the Windows, macOS and Linux executables inbuild.yml, not only the Windows one).Verification
Full suite on this change: Windows 996 passed, 2 skipped; Linux 995 passed, 3 skipped.
Mutations of the soupsieve line in
requirements.txt, each run againsttest_soupsieve_py310.py,test_dependency_security_floors.py,test_flatpak_dependency_pins.pyandtest_pyside6_ceiling.py:soupsieve>=2.9(unchanged)soupsieve>=3.0.3test_requirements_keep_admitting_soupsieve_2_10test_requirements_keep_admitting_soupsieve_2_10,test_specifier_rejects_every_release_below_the_first_clean_one[soupsieve],test_specifier_rejects_every_known_affected_release[soupsieve]soupsieve>=2.8.4test_specifier_rejects_every_release_below_the_first_clean_one[soupsieve],test_specifier_rejects_every_known_affected_release[soupsieve]soupsieve>2.8.4test_specifier_rejects_every_release_below_the_first_clean_one[soupsieve]soupsieve>=2.9rc1test_specifier_rejects_every_release_below_the_first_clean_one[soupsieve]pip-audit==2.10.1 --strict: "No known vulnerabilities found" on bothrequirements.txtandflatpak/requirements-pinned.txt.pip behaviour, in a venv with beautifulsoup4 4.15.0 and soupsieve 2.8.4 (pip 26.1.2, Python 3.14), resetting to 2.8.4 before each case:
pip install -rwithbeautifulsoup4>=4.15.0onlypip install --upgrade -rwithbeautifulsoup4>=4.15.0onlypip install --upgrade --upgrade-strategy eager -rwithbeautifulsoup4>=4.15.0onlypip install -rwithbeautifulsoup4>=4.15.0andsoupsieve>=2.9🤖 Generated with Claude Code