Skip to content

Security: braedonsaunders/openbooks

Security

SECURITY.md

Security policy

OpenBooks handles financial and identity data. Please report suspected vulnerabilities privately and give the maintainers a reasonable opportunity to investigate before public disclosure.

Supported versions

OpenBooks is currently in alpha. Security fixes are made on the latest published release and the main branch.

Version Supported
Latest 0.1.x alpha release Yes
Older builds and untagged snapshots No

Alpha status matters: OpenBooks has not yet completed an independent security audit or penetration test and does not claim a compliance certification. Operators should perform their own risk assessment before using it for production financial data.

Report a vulnerability

Use GitHub's private vulnerability reporting:

https://github.com/braedonsaunders/openbooks/security/advisories/new

Do not open a public issue for a suspected vulnerability.

Include:

  • affected version or commit;
  • deployment configuration relevant to the issue;
  • reproduction steps or a proof of concept;
  • expected and observed behavior;
  • likely impact and affected data;
  • whether the issue is already being exploited; and
  • a safe way to contact you.

The maintainers aim to acknowledge a complete report within three business days. Investigation and remediation time depend on severity and complexity. A fix may be released before full technical details are published.

OpenBooks does not currently operate a paid bug-bounty program.

Security architecture

The repository implements defense-in-depth controls including:

  • forced PostgreSQL row-level security for organization-owned tables;
  • an isolated migration owner used only by the one-shot bootstrap, with web and worker processes restricted to a NOSUPERUSER NOBYPASSRLS runtime role;
  • fail-closed runtime role checks that refuse production startup when the login, or a role it can assume, can defeat tenant isolation;
  • server-side RBAC and permission checks;
  • scoped, hashed API keys;
  • asynchronous, versioned scrypt password hashing with legacy compatibility and successful-login rehash, bounded to four active jobs and 32 queued jobs per web process, plus signed, server-side revocable session cookies;
  • PostgreSQL-backed login throttling, temporary lockout, and authentication events that store keyed email/network hashes rather than raw identifiers;
  • TOTP MFA with password-reauthenticated, session-bound, expiring enrollment, anti-replay steps, encrypted secrets, and salted one-time recovery-code hashes;
  • OIDC authorization-code SSO with state, nonce, PKCE, discovery issuer checks, asymmetric JWKS verification, and verified-email existing-user linking;
  • request-scoped nonce Content Security Policy in production, clickjacking and MIME-sniffing defenses, restrictive browser permissions, referrer controls, cross-origin opener/resource controls, and HSTS for TLS deployments;
  • encryption of stored connection secrets with OPENBOOKS_DATA_KEY;
  • database constraints for balanced postings and closed periods;
  • a SELECT-only database role for the SQL workbench;
  • sandboxed JavaScript execution;
  • rate limits and event/audit records on sensitive surfaces; and
  • idempotent deployment migrations under an advisory lock.

These controls reduce risk; they are not a warranty that the application is free of vulnerabilities.

Operator responsibilities

Production operators must:

  • replace every example credential and keep .env files out of version control;
  • terminate TLS at a trusted reverse proxy;
  • restrict database, Redis, and object-storage ports to private networks;
  • generate SESSION_SECRET from at least 32 random bytes and rotate it as a coordinated all-replica cutover;
  • protect OPENBOOKS_DATA_KEY and rotate it only with a decrypt-and-re-encrypt migration for existing encrypted records;
  • protect and rotate OPENBOOKS_INTERNAL_TOKEN, database credentials, and provider secrets;
  • back up PostgreSQL, object storage, and the deployment configuration;
  • test restoration and upgrades on isolated infrastructure;
  • restrict administrative access;
  • monitor health, authentication, audit, worker, database, and backup events;
  • keep the host, container runtime, images, and dependencies patched; and
  • verify legal, tax, privacy, retention, and residency requirements for their jurisdiction.

The included Compose stack is designed for evaluation and a single-host deployment. High-availability, regulated, or internet-exposed installations need an operator-designed production architecture.

When enabling OPENBOOKS_TRUST_PROXY, the proxy must remove client-supplied X-Forwarded-For, X-Real-IP, and CF-Connecting-IP headers before setting trusted values. Otherwise leave it disabled; identity lockout remains active. An always-on, high deployment-wide password-attempt ceiling skips unknown-user KDF work after saturation while remaining fail-open for real accounts, so it cannot lock out the whole deployment. It is deliberately coarse and is not a replacement for an edge/WAF rate policy on internet-exposed deployments. OIDC deployments must use HTTPS, protect the optional client secret, register only the documented callback URI, and configure the provider to return a verified email claim. OIDC does not create or reactivate users.

SESSION_SECRET rotation invalidates all browser sessions and in-progress OIDC flows and resets the privacy-hash namespace used by the short-lived login limiter; obsolete state is automatically pruned. Versioned salted MFA recovery hashes are independent of that key. Coordinate rotation across every replica.

Disclosure

Please avoid accessing data that is not yours, disrupting a service, retaining sensitive data, or using social engineering. Stop testing and report the issue if you encounter real user or financial information.

There aren't any published security advisories