Security Policy

The Nojoin team and community take all security vulnerabilities seriously. Thank you for your efforts to improve the security of Nojoin. We appreciate your efforts and responsible disclosure and will make every effort to acknowledge your contributions.

Active Development

Nojoin is still in active development and all releases should be considered pre-release. There may be security vulnerabilities in the application. Nojoin’s maintainers are not responsible for any data loss or security breaches that may occur as a result of using the application. We also advise users to take additional security measures in general but especially when deploying Nojoin over a publicly accessible URL. For example, we recommend using a VPN or a reverse proxy to secure your Nojoin instance.

First-Run Bootstrap Protection

Nojoin requires an operator-defined FIRST_RUN_PASSWORD before the first successful system initialisation can occur.

Operators should treat FIRST_RUN_PASSWORD as a secret and ensure reverse proxies, ingress layers, and HTTP logging do not record Authorization headers or setup request bodies. Nojoin also warns operators when FIRST_RUN_PASSWORD, DATA_ENCRYPTION_KEY, or the tracked Redis/PostgreSQL placeholder secrets still match the shipped deployment-template values. Those warnings appear in API or worker startup logs and in the authenticated frontend, but they are advisory only and do not block startup or first-run setup.

Browser Session Request Protection

Nojoin’s normal browser session uses a Secure HttpOnly cookie, but state-changing browser requests are not trusted solely because that cookie is present.

Standard JWT Containment

Standard browser session, explicit API, and MCP connector JWTs (token types session, api, and mcp) support active invalidation in addition to natural expiry.

MCP Connector Access

Nojoin’s built-in MCP connector (MCP.md) issues OAuth 2.1 access tokens of type mcp through Nojoin’s own authorization server.

CLI OAuth Subscription Access

Nojoin can route a user’s AI inference through their own Claude (Pro/Max) or ChatGPT (Plus/Pro) subscription (the per-user CLI OAuth AI-routing option, off by default). See ADR-0002 for the accepted-risk decision — this uses a consumer subscription contrary to the provider’s terms (Anthropic’s, or OpenAI’s for ChatGPT/Codex).

JWT Signing Key Rotation

JWT signing material is stored as a small keyring rather than a single static value.

Browser Capture Security

Live recording is initiated and controlled by the authenticated web app.

For end-user capture setup and troubleshooting, see CAPTURE.md.

Vulnerability Scanning and Severity Policy

Published container images are scanned for known vulnerabilities by Trivy before their rolling tags are published. The policy balances strong assurance against the reality that the worker image is built on a large CUDA/PyTorch base with a slow-moving, inherited CVE surface.

Supported Versions

As Nojoin is in active development, only the latest version is supported. We encourage all users to use the most up-to-date version of the application.

Version Supported
latest :white_check_mark:

Reporting a Vulnerability

Please report any security vulnerabilities privately. Do not open public GitHub issues or discuss vulnerabilities in public forums before they have been resolved.

Private Reporting Channel

We use GitHub’s Private Vulnerability Reporting feature to receive security disclosures securely and privately.

Expected Workflow

  1. Acknowledgement: You will receive an initial response confirming receipt of your report within 48 hours.
  2. Evaluation: The maintainers will investigate the report and determine the severity and scope of the vulnerability.
  3. Remediation: If the vulnerability is confirmed, we will work on a patch. A security advisory will be drafted, and a fix will be released.
  4. Disclosure: Once a patch is available and deployed, we will coordinate public disclosure through a GitHub Security Advisory.

Emergency Security Release and Artifact Revocation

When a confirmed vulnerability requires an out-of-band fix, maintainers follow an expedited release path. The goal is to ship a patched, verifiable image quickly without bypassing the integrity controls that make a release trustworthy.

Expedited Release

  1. Draft privately. Develop the fix on a private branch or through a GitHub Security Advisory draft so the change is not disclosed before an image is available.
  2. Bump and tag. Update docs/VERSION and push a strict vX.Y.Z tag exactly as for a normal release. The same release pipeline runs: full test, lint, build, documentation, and migration gates, followed by image build, vulnerability scan, the health and non-root smoke, and cosign signing. The security urgency does not remove these gates; it only compresses the schedule.
  3. Publish notes. The automated release notes are generated for the tag. Add an explicit security section describing the affected versions, severity, and required operator action (for example, “upgrade immediately”).
  4. Advisory. Publish or update the GitHub Security Advisory, request a CVE where appropriate, and credit the reporter per the coordinated-disclosure workflow above.

Artifact Revocation

If a published image is found to be compromised or dangerously vulnerable, revoke it rather than relying on a newer tag alone, because deployments may still be pulling the old tag or digest.

  1. Stop the bleeding. Repoint the rolling tags (latest, major.minor) to the patched image immediately by cutting the patched release; never leave latest pointing at a known-bad image.
  2. Remove or mark the bad version. Delete the affected immutable version tag and its digest from the GitHub Container Registry package, or, where deletion would break audit history, mark the version as deprecated and document it in the advisory. Note that container digests cannot be silently rewritten — a removed digest fails to pull, which is the intended fail-closed behaviour.
  3. Invalidate trust signals. Because images are signed by digest, a revoked digest should be called out in the advisory as no-longer-to-be-trusted. Operators verifying signatures should treat the advisory’s listed bad digests as untrusted even if a historical signature exists.
  4. Notify operators. Communicate the revocation through the GitHub Security Advisory and the release notes, including the bad digests, the fixed digest to upgrade to, and any data-safety steps. Operators who pin by digest must be told the exact digest to move to.
  5. Rotate exposed secrets. If the incident could have exposed signing material, deployment credentials, or registry tokens, rotate them and record the rotation in the advisory timeline.

Operators should subscribe to repository releases and security advisories so that emergency releases and revocations reach them promptly.