Files
ihasvpn/SECURITY.md
T
jcoffey-dev 6c5183e7dc
ci / web (pull_request) Skipped
github/ci (branch) GitHub Actions
ci / github (pull_request) Successful in 1m31s
ci / go (pull_request) Skipped
ci / docker-build (pull_request) Skipped
ci / publish (pull_request) Skipped
Send security and conduct reports to Coffey Labs LLC addresses
Security reports now go to [email protected] and code-of-conduct reports to [email protected], replacing a personal address. Written in the same obfuscated form as before.
2026-10-06 00:22:21 -07:00

2.0 KiB

Security Policy

Supported versions

Security fixes go to main and the next release. Older releases are not patched.

Reporting a vulnerability

Please do not open a public issue for a security problem. Email securityATcoffeylabsDOTorg with what you found, how to reproduce it and what you think the impact is. You will get an acknowledgement within a few days and a fix or a plan before anything is made public.

What ihasvpn does to protect itself

  • The admin UI requires a password (argon2id, 64 MiB, 3 passes) and offers time-based one-time codes with recovery codes. Sessions are random 256-bit tokens stored hashed, HttpOnly, SameSite=Strict, with idle and absolute expiry.
  • Every state-changing request must come from the same origin (Sec-Fetch-Site / Origin are checked in addition to the cookie policy) and carry a JSON body; the first-run setup endpoint stops working the moment a user exists.
  • Login is rate-limited per address and per username, and a failed login for an unknown user takes as long as one for a known user.
  • Responses carry a strict Content-Security-Policy, X-Frame-Options: DENY, Referrer-Policy: no-referrer and, under TLS, HSTS.
  • Peer private keys never appear in list or detail responses; they are only returned through the configuration and QR endpoints, and each view is written to the audit log. The server's own private key never leaves the process.
  • The database file is created mode 0600 and the container image contains no shell tooling beyond what nftables and WireGuard need.

What you must do

  • Do not expose port 51821 to the internet without TLS. Either set IHASVPN_TLS_SELF_SIGNED=true (or IHASVPN_TLS_CERT/IHASVPN_TLS_KEY) or put a TLS-terminating reverse proxy in front and list it in IHASVPN_TRUSTED_PROXIES so client addresses in the audit log are right.
  • Turn on two-factor authentication for every administrator.
  • Keep the /data volume private: it holds every peer's private key.