PST-033: Any API token, including a captures-only one, learns the account's email address from GET /me #762
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#762
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-033. Severity: Low.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/api/api.py(408-425; 409-424)Who can do it, and what they need. Someone holding a leaked browser-extension token (
capturesonly), or any other low-scope token.How it works.
GET /api/v1/mewith the token.owner: <email>as well as the time zone. Verified: a captures-only token received{'owner': 'applicant@example.org', ...}; a token issued with no scopes at all also received it.Impact. The email is the sign-in identifier for the account and is personal data; a leaked extension token now also yields a phishing/credential-stuffing target tied to a known job seeker, beyond the 'capture API only' reach the threat model assigns it.
Evidence.
Verification (verdict: confirmed; severity after verification: Low). Correct the file reference to api.py 409-424 plus the TokenAuth class in auth.py 74-85 and TokenOut in schemas.py 1033-1040. It is intended and test-pinned ('any live token may ask /me'), so the threat model should either say it or the field should shrink. Options: return
owneronly to tokens holdingread, or return a masked address. Confidence in the facts is high, and the severity is at most low.Suggested remediation. Return the email only to a token holding
read(or drop it: a client needs the scopes and the time zone, not the address). Consider refusing tokens that hold no scope at all inApiToken.issue.Also covered by this issue.
src/postulo/api/api.py(409-424); Informational). Small: the person who installed the extension already knows their address; a thief learns the account identity, which helps target phishing or a sign-in attempt. No record data.Fixed in
016158c9bon main.