Historical foundation dependency audit
This records the pre-runtime-rationalization audit. See the current security baseline for the Python 3.11–3.14 closure.
Recorded 2026-09-20. The audit exits 1; the security gate is intentionally blocking. No advisories are ignored and no findings are automatically fixed.
The command exports the actual universal uv.lock with all dependency groups
to PEP 751 and passes that lockfile to pip-audit 2.10.1. The auditor checks every
locked package/version variant, including versions used only on older Python
or other operating systems. It does not filter to the audit host's environment.
The local editable project is omitted because it is the code under analysis,
not an external dependency.
The audit examined 243 package/version entries and reported findings in 29 entries across 18 packages: 79 distinct package/version/advisory combinations after deduplicating repeated advisory IDs. Aliases can still describe the same underlying vulnerability.
Compatibility constraints
The newest compatible versions in the lock still include older releases for Python 3.8 and 3.9. PyPI metadata for the listed fixed releases requires newer Python versions. Resolving all findings would require a support-policy change, upstream backports or a separately reviewed replacement; this PR does none of those. The table records the newest fix listed across each package's findings, not a promise that updating that one package resolves the complete graph. Some entries are development or documentation dependencies, not runtime code. The audit includes those intentionally. Exploitability in Apizr has not been established by the dependency scanner.
| Package | Affected locked versions | Latest listed fix | Fix requires Python |
|---|---|---|---|
| anyio | 4.5.2, 4.12.1 | 4.14.2 | >=3.10 |
| black | 24.8.0, 25.11.0 | 26.3.1 | >=3.10 |
| bleach | 6.1.0, 6.2.0 | 6.4.0 | >=3.10 |
| click | 8.1.8 | 8.3.3 | >=3.10 |
| filelock | 3.16.1, 3.19.1 | 3.20.3 | >=3.10 |
| markdown | 3.7 | 3.8.1 | >=3.9 |
| nbconvert | 7.16.6 | 7.17.1 | >=3.9 |
| pygments | 2.19.2 | 2.20.0 | >=3.9 |
| pymdown-extensions | 10.15, 10.21.3 | 11.0.1 | >=3.10 |
| pytest | 8.3.5, 8.4.2 | 9.0.3 | >=3.10 |
| python-dotenv | 1.0.1, 1.2.1 | 1.2.2 | >=3.10 |
| python-multipart | 0.0.20 | 0.0.31 | >=3.10 |
| requests | 2.32.4, 2.32.5 | 2.33.0 | >=3.10 |
| soupsieve | 2.7, 2.8.4 | 2.9.0 | >=3.10 |
| starlette | 0.44.0, 0.49.3 | 1.3.1 | >=3.10 |
| tornado | 6.4.2 | 6.5.8 | >=3.9 |
| urllib3 | 2.2.3, 2.6.3 | 2.7.0 | >=3.10 |
| wheel | 0.45.1 | 0.46.2 | >=3.9 |
Findings by locked version
- anyio 4.5.2:
CVE-2026-63374,CVE-2026-64847. - anyio 4.12.1:
CVE-2026-63374,CVE-2026-64847. - black 24.8.0:
PYSEC-2026-2120,PYSEC-2026-2121. - black 25.11.0:
PYSEC-2026-2120,PYSEC-2026-2121. - bleach 6.1.0:
GHSA-8rfp-98v4-mmr6,GHSA-gj48-438w-jh9v. - bleach 6.2.0:
GHSA-8rfp-98v4-mmr6,GHSA-gj48-438w-jh9v. - click 8.1.8:
PYSEC-2026-2132. - filelock 3.16.1:
PYSEC-2026-1374,PYSEC-2026-1375. - filelock 3.19.1:
PYSEC-2026-1374,PYSEC-2026-1375. - markdown 3.7:
PYSEC-2026-89. - nbconvert 7.16.6:
PYSEC-2026-1691,PYSEC-2026-2229,PYSEC-2026-2230. - pygments 2.19.2:
PYSEC-2026-2987. - pymdown-extensions 10.15:
PYSEC-2026-1825,PYSEC-2026-2999,PYSEC-2026-3609,PYSEC-2026-3654. - pymdown-extensions 10.21.3:
PYSEC-2026-3609,PYSEC-2026-3654. - pytest 8.3.5:
PYSEC-2026-1845. - pytest 8.4.2:
PYSEC-2026-1845. - python-dotenv 1.0.1:
PYSEC-2026-2270. - python-dotenv 1.2.1:
PYSEC-2026-2270. - python-multipart 0.0.20:
PYSEC-2026-1852,PYSEC-2026-3036,PYSEC-2026-3037,PYSEC-2026-3038,PYSEC-2026-3039,PYSEC-2026-3040. - requests 2.32.4:
PYSEC-2026-2275. - requests 2.32.5:
PYSEC-2026-2275. - soupsieve 2.7:
CVE-2026-85999,CVE-2026-86000,PYSEC-2026-3071,PYSEC-2026-3072. - soupsieve 2.8.4:
CVE-2026-85999,CVE-2026-86000. - starlette 0.44.0:
PYSEC-2026-161,PYSEC-2026-1941,PYSEC-2026-1942,PYSEC-2026-2280,PYSEC-2026-2281,PYSEC-2026-248,PYSEC-2026-249. - starlette 0.49.3:
PYSEC-2026-161,PYSEC-2026-2280,PYSEC-2026-2281,PYSEC-2026-248,PYSEC-2026-249. - tornado 6.4.2:
GHSA-8423-8fgw-73vq,GHSA-pw6j-qg29-8w7f,PYSEC-2025-265,PYSEC-2025-266,PYSEC-2025-267,PYSEC-2026-140,PYSEC-2026-1974,PYSEC-2026-2287,PYSEC-2026-3387,PYSEC-2026-3388,PYSEC-2026-3389,PYSEC-2026-3928. - urllib3 2.2.3:
PYSEC-2026-141,PYSEC-2026-1994,PYSEC-2026-1996,PYSEC-2026-1997,PYSEC-2026-1998,PYSEC-2026-1999. - urllib3 2.6.3:
PYSEC-2026-141,PYSEC-2026-142. - wheel 0.45.1:
CVE-2026-24049.
Reproduce
uv sync --locked --group security
uv run --locked --group security python scripts/audit_dependencies.py
# Optional full descriptions, aliases and fix versions:
uv run --locked --group security python scripts/audit_dependencies.py --output /tmp/apizr-audit.json
Database results may change. The private reporting channel and execution boundary are documented in SECURITY.md. CodeQL is configured separately and must run in GitHub Actions; adding its workflow does not establish that analysis has passed.