WebScan v2.5.3
WebScan v2.5.3 — Zero known security findings
🔒 Security — all known issues closed
A final, maximally-pedantic audit found 3 new MEDIUM + 3 confirmed LOW + 8 INFO
issues that survived v2.5.1/v2.5.2. All 14 are fixed in this release — the
codebase now has zero outstanding security findings at any severity level
(CRITICAL / HIGH / MEDIUM / LOW / INFO).
Fixed (MEDIUM)
-
M-NEW-1: H-1 fix was incomplete — TraceConfig now applied to all sessions
(CWE-200 / CWE-522). The original v2.5.1 fix only attached the
redirect-safe TraceConfig toengine.ScanEngine.scan_all(). Two other
aiohttp.ClientSession(...)constructions —cli._crawl_targets(carries
auth headers during crawling) andauth._form_login(POSTs the login form
with credentials) — were unprotected. Both now install the same
_build_redirect_safe_trace()._form_loginadditionally uses
allow_redirects=False. -
M-NEW-2: shell injection in
security-scan.ymlvia${{ github.event.inputs.target }}
(CWE-78 / CWE-94). Fixed via env-var indirection + URL regex validation. -
M-6:
mass_assignmentPUT now carries safety markers
(CWE-624 / CWE-639). Each probe carriesIdempotency-Key: webscan-<uuid>,
X-WebScan-Test: 1,X-WebScan-Dry-Run: 1, andallow_redirects=False.
Fixed (LOW)
-
L-1: dependency upper bounds + CVE coverage (CWE-1357 / CWE-1104).
aiohttp>=3.9.0→aiohttp>=3.10.11,<4closes CVE-2024-52304 and
CVE-2024-47881 (HTTP-parser DoS, directly exploitable from a hostile
target). All other deps now have<majorupper bounds. -
L-4: Dockerfile hardened. Base image pinned by digest
(python:3.12-slim@sha256:c2d8472b...). AddedHEALTHCHECKinstruction. -
L-6:
auto-release.ymltag validation (CWE-20). TAG is validated
against^v\d+\.\d+\.\d+(-[\w.]+)?$before use.
Fixed (INFO)
- INFO-1: explicit CORS deny-all middleware in
server.py. - INFO-2:
_safe_url()inreporter.pyblocksjavascript:/data:
schemes in HTML report<a href>(CWE-79 stored XSS). - INFO-3:
anonymize._PRIVATE_IPextended to IPv6 ULA / link-local /
loopback + CGNAT. - INFO-4: prompt-injection protection in
ai.py— scanner output wrapped
in<scanner_output>tags with explicit "treat as untrusted data"
system-prompt instructions. - INFO-5:
assert→if/raiseinai.py(Bandit B101). - INFO-6: URL credentials masked in
_progressbar (CWE-532). - INFO-7:
verify_sslparameter exposed inapi.scan(). - INFO-8: covered by M-NEW-1.
🧪 Tests — +20 new, 97% coverage sustained
- 860 tests (was 840), all passing
- New
tests/test_v253_security.py(20 tests) covers every fixed issue - ruff clean, mypy --strict clean (locally and in CI env)
📊 Numbers
- 38 plugins (unchanged)
- 860 tests (was 840)
- 97% coverage (sustained)
- 61 source files
- 0 known security findings at any severity (was 4 HIGH + 6 MEDIUM + 6 LOW)
⬆️ Upgrade
pip install --upgrade webscan-security==2.5.3📋 Audit summary
After three audit passes (initial → v2.5.1 fixes → final → v2.5.3 fixes),
the codebase has zero outstanding security findings at any severity level.
| Severity | Initial audit | After v2.5.1 | After v2.5.2 | After v2.5.3 |
|---|---|---|---|---|
| CRITICAL | 0 | 0 | 0 | 0 |
| HIGH | 4 | 0 | 0 | 0 |
| MEDIUM | 6 | 4 | 2 | 0 |
| LOW | 6 | 6 | 6 | 0 |
| INFO | — | — | — | 0 |
| Total | 16 | 10 | 8 | 0 |