Security policy
Reporting a vulnerability
Please do not open a public issue.
Report it privately here. That form is visible only to the maintainers, and it is the fastest route.
Please include the version, a description of the isolation failure, and the smallest reproduction you can manage. You will get an acknowledgement within 3 working days and an assessment within 10.
If you cannot use GitHub, open a normal issue containing only the words "security report, please make contact" and nothing else — no details — and you will be contacted privately.
What counts
This library exists to keep one tenant's data away from another. Anything that defeats that is in scope, including:
- a tenant reading, writing or deleting another tenant's rows
- a tenant being resolved or bound when it should not have been, or from an untrusted source that should not have been consulted
- a tenant persisting on a pooled connection, a pooled thread, or a message listener beyond the unit of work that set it
- a configuration whose documented meaning is more restrictive than its behaviour
Also in scope: anything that causes isolation to be silently not applied while appearing to be configured — a policy that exists but never runs is the failure mode this project cares most about.
What does not
- Connecting the application as a Postgres superuser or table owner without
FORCE ROW LEVEL SECURITY. Both bypass row-level security by design; the documentation says so in several places. - Trusting
X-Tenant-IDfrom the public internet with no membership verification. That is documented as unsafe outside a gateway that overwrites the header; see docs/securing-resolution.md. - Code that unwraps a pooled connection to a raw
PgConnectionand issues statements on it.
If you are unsure which side of that line something falls on, report it.
Supported versions
During 0.x, the latest minor release only.