PST-068: Administrators and the log collector can read members' activity (hosts, captured addresses, file names) in the logs #797
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#797
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-068. 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/plugins/registry.py(454,479);src/postulo/documents/scrub.py(103-121);src/postulo/core/server_views.py(506-540)Who can do it, and what they need. An administrator reading Server settings → Logs, or a holder of POSTULO_LOGS_TOKEN. Precondition: a member captures a posting whose source raises, or a logo fetch fails — ordinary events on any instance.
How it works.
A member captures
https://careers.example-employer.com/job/123and a source plugin raises;logger.exception("Capture source %r failed on %r", source.name, url)writes the URL (andlogger.exception("Could not list the places on %r", url),logger.warning("Filling gaps with %s failed on %r", ..., url)).Find logoon a company writeslogger.info("Logo for %s: %s", host, problem). These lines appear on the administrator's Logs page and in the NDJSON handed to a collector. The Logs page acknowledges this ("These records can name people and their applications"), but the threat model's row for administrators says they "see accounts, never anyone's applications or documents".Impact. An administrator (or an external collector) learns which employers' postings a member is capturing and which companies they record — a record of the person's job search — contradicting the documented administrator boundary. Limited scope: only failing captures/logo fetches, and the reader is trusted.
Verification (verdict: confirmed; severity after verification: Informational; first-pass claim: Low). File and line references are accurate (registry.py:454 and :479, builtin/init.py:498, logos.py:428). Correct the characterisation. The threat-model line that Server settings shows administrators "accounts, never anyone's applications or documents" is about the accounts and records pages. The Logs page and /logs endpoint are explicitly carved out by the project's own warnings and docstrings, so there is no contradiction with the documented boundary. The only readers are an administrator, who is trusted with the database anyway, and an operator-configured collector holding POSTULO_LOGS_TOKEN. …
Suggested remediation. Log the capture id and the source name rather than the URL (the review page already shows the URL to its owner), and the company pk rather than the host for logo problems; or reduce such lines to DEBUG so they reach neither the file nor the page by default.
Also covered by this issue.
src/postulo/documents/scrub.py(103-121); Informational). A person's upload file name can be a name, a document type or a health or union reference, plus the owner id. It reaches people the project says should only see account metadata. …src/postulo/core/server_views.py(506-540); Informational). A limited contradiction of 'administrators see accounts, never anyone's applications or documents': the log names companies and job-posting addresses a member is pursuing, though not the member's name on the same line. …Fixed in
0c655eacbon main.