PST-071: /healthz tells unauthenticated callers the exact Postulo version and database state #800
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#800
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found in the security audit of 2026-10-10 (
SECURITY-AUDIT-2026-10-10.md), run againstmainatc30851bfrom 8 to 10 October 2026, as PST-071. Severity: Informational.The text below is the audit's entry, unchanged apart from links to the other issues it names. The finding was produced by automated review and checked by a second automated pass; re-check it before acting on it.
src/postulo/core/views.py(50-58)Who can do it, and what they need. Any stranger on the internet who finds the address.
How it works.
Impact. Version fingerprinting helps target an unpatched instance; the endpoint is intentional (container HEALTHCHECK) and reveals nothing personal.
Verification (verdict: confirmed; severity after verification: Informational). No correction to file or line. Precondition: the stranger must send a Host the instance answers to (HealthProbeMiddleware only waives that from 127.0.0.1), which any browser does. The disclosure is a recorded design decision (#172, base.html comment) and the wiki documents the endpoint; the one observation to add is that #172's stated aim of keeping the version off pages a crawler reads is only partly met while /healthz is open.
Suggested remediation. Return the version only to loopback probes (HealthProbeMiddleware already identifies them) or to signed-in administrators, and keep the public answer to status and database.
Also covered by this issue.
src/postulo/core/views.py(50-58); Informational). Target selection for a future disclosed vulnerability; contradicts the stated intent in base.html that 'the version is for people signed in' (which admits '/healthz still says it, to a monitor').src/postulo/core/views.py(50-58); Informational). Precise fingerprinting of an instance that otherwise says nothing to strangers (the threat model's first row), aiding targeted exploitation after a disclosure. No direct data exposure.src/postulo/core/views.py(50-58); Informational). Version fingerprinting; no data exposure. Documented behaviour with its own tests (test_health_probe_host.py, test_health_redirect.py).src/postulo/core/views.py(50-58); Informational). Fingerprinting an instance and matching it to published advisories without signing in; a minor aid to a stranger, and already acknowledged in the template comment.Fixed in
95617f5e5on main./healthztreats a request as forwarded only onX-Forwarded-For, so behind a loopback proxy every visitor is a "probe" #977