GHSA-xfqj-r5qw-8g4j: Paperclip Unauthenticated Access To Multiple API Vulnerability

HIGH
CVSS 8.3
CWE-306
Published
Advisory Summary

GHSA-xfqj-r5qw-8g4j is a HIGH (CVSS 8.3) unauthenticated access to multiple api vulnerability (CWE-306: Missing Authentication for Critical Function) affecting Paperclip libraries in the npm ecosystem. The issue involves unauthenticated access to multiple api endpoints in authenticated mode. Remediation is available by upgrading affected packages to version 2026.416.0.

GHSA-xfqj-r5qw-8g4j at a Glance

CVE Identifier N/A
GHSA Identifier GHSA-xfqj-r5qw-8g4j
Severity HIGH
CVSS v3.1 Base Score 8.3
CWE Classification CWE-306: Missing Authentication for Critical Function
Affected Product Paperclip
Package Ecosystem npm
Published Date
Last Updated

Security Impact

CVSS: 8.3

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required Low (PR:L)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality High (C:H)
Integrity High (I:H)
Availability Low (A:L)

How to Fix GHSA-xfqj-r5qw-8g4j

To remediate this vulnerability, upgrade all affected Paperclip dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

@paperclipai/server fixed: 2026.416.0
npm install @paperclipai/server@2026.416.0
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

npm ls @paperclipai/server

How to Check if You Are Affected

To determine whether your Node.js application is affected by GHSA-xfqj-r5qw-8g4j, inspect your project dependencies using npm:

npm ls @paperclipai/server

Analyze the terminal output to locate any version of Paperclip in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 2026.416.0), your application is affected.

Note: The npm ls @paperclipai/server command inspects dependencies declared in your package.json and lockfile; it does not perform automated runtime dynamic scanning.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-306: Missing Authentication for Critical Function, where the product does not perform any authentication for functionality that requires a provable user identity or consumes a significant amount of resources. In Paperclip, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

## Summary Several API endpoints in `authenticated` mode have no authentication at all. They respond to completely unauthenticated requests with sensitive data or allow state-changing operations. No account, no session, no API key needed. Verified against the latest version. Discord: sagi03581 ## Steps to Reproduce ### 1. Unauthenticated issue data access `GET /api/heartbeat-runs/:runId/issues` returns issue data for a heartbeat run with zero authentication. Every other endpoint in `server/src/routes/activity.ts` calls `assertCompanyAccess`, but this one was missed. ```bash curl -s http://<target>:3100/api/heartbeat-runs/00000000-0000-0000-0000-000000000001/issues # -> [] (HTTP 200, not 401 or 403) ``` If an attacker obtains a valid run UUID (from logs, error messages, shared URLs, or by probing), they can read issue data without any credentials. ### 2. Unauthenticated CLI auth challenge creation `POST /api/cli-auth/challenges` creates a CLI authentication challenge with no actor check at all. The handler at `server/src/routes/access.ts:1638-1659` skips any auth verification. ```bash curl -s -X POST -H "Content-Type: application/json" \ -d '{"command":"test"}' \ http://<target>:3100/api/cli-auth/challenges # returns challenge ID, token, and a pre-generated board API key ``` The response includes a `boardApiToken` that becomes active once the challenge is approved. Combined with open registration (separate report), this enables persistent API key generation. ### 3. Unauthenticated agent instruction / system prompt leakage These endpoints in `server/src/routes/access.ts` require no authentication: ```bash curl -s http://<target>:3100/api/skills/index # returns all available skill endpoints curl -s http://<target>:3100/api/skills/paperclip # returns the FULL agent heartbeat procedure including: # - every API endpoint and its parameters # - authentication mechanism (env var names, header formats) # - the complete agent coordination protocol # - the agent creation/hiring workflow curl -s http://<target>:3100/api/skills/paperclip-create-agent # returns the full agent creation workflow with adapter configs ``` This hands an attacker a complete map of the internal API without authenticating. It also leaks how agents authenticate, how heartbeats work, and what adapter configurations are available. ### 4. Unauthenticated deployment configuration disclosure `GET /api/health` returns deployment mode, exposure setting, auth status, bootstrap status, version, and feature flags. ```bash curl -s http://<target>:3100/api/health # { # "deploymentMode": "authenticated", # "deploymentExposure": "public", # "authReady": true, # "bootstrapStatus": "ready", # "version": "2026.403.0", # ... # } ``` Tells an attacker exactly how the instance is configured, whether registration is available, and what version is running. ## Impact - **Data exposure**: heartbeat run issues accessible without credentials. Agent instructions and full API structure exposed to anyone. - **Reconnaissance**: an attacker can fingerprint the deployment (mode, version, features) and map the entire internal API before attempting anything else. - **Auth bypass stepping stone**: unauthenticated CLI challenge creation is a building block for the full RCE chain (reported separately). ## Suggested Fixes 1. **Add authentication to heartbeat run issues** in `server/src/routes/activity.ts`: - `GET /api/heartbeat-runs/:runId/issues` -- add `assertCompanyAccess` like every other endpoint in the same file 2. **Add authentication to CLI challenge creation** in `server/src/routes/access.ts`: - `POST /api/cli-auth/challenges` -- add `assertBoard` at minimum 3. **Add authentication to skill endpoints** in `server/src/routes/access.ts`: - `GET /api/skills/available` - `GET /api/skills/index` - `GET /api/skills/:skillName` 4. **Reduce health endpoint information** -- consider removing `deploymentMode`, `deploymentExposure`, and `version` from the unauthenticated response, or gating the full response behind `assertBoard` 5. Consider a **global auth rejection middleware** for all `/api/*` routes in `authenticated` mode. Currently unauthenticated requests get `actor: { type: "none" }` and pass through to `next()`, relying on each route handler to check individually. A missing check means an open endpoint. Rejecting `type: "none"` at the middleware level for all routes except an explicit public allowlist (health, sign-in, sign-up, webhooks) would prevent this class of bug entirely. ## Contact Discord: sagi03581 Happy to help verify fixes or provide additional details.

GHSA-xfqj-r5qw-8g4j Affected Paperclip Versions

1 component(s)
Fixed Versions:
2026.416.0
Product / Package Ecosystem Affected Versions Fixed Version
@paperclipai/server
npm
< 2026.416.0
2026.416.0

References

Frequently Asked Questions

What is GHSA-xfqj-r5qw-8g4j?
GHSA-xfqj-r5qw-8g4j is a security vulnerability in Paperclip involving Unauthenticated Access to Multiple API Endpoints in Authenticated Mode under CWE-306: Missing Authentication for Critical Function.
Which Paperclip versions are affected?
Affected versions include releases prior to 2026.416.0 across affected packages: @paperclipai/server.
What version fixes GHSA-xfqj-r5qw-8g4j?
Upgrading to 2026.416.0 (or the latest patched release for your respective branch) resolves the vulnerability.
Is @paperclipai/server affected?
Yes, @paperclipai/server is affected in releases prior to 2026.416.0. Upgrade your dependency to 2026.416.0 or later.
What is the CVSS score of GHSA-xfqj-r5qw-8g4j?
GHSA-xfqj-r5qw-8g4j has a CVSS v3.1 base score of 8.3 (HIGH) with vector string CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L.
What CWE is associated with GHSA-xfqj-r5qw-8g4j?
GHSA-xfqj-r5qw-8g4j is classified under CWE-306: Missing Authentication for Critical Function (The product does not perform any authentication for functionality that requires a provable user identity or consumes a significant amount of resources.).
How can I check npm dependencies for GHSA-xfqj-r5qw-8g4j?
Run the dependency tree command: 'npm ls @paperclipai/server'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-xfqj-r5qw-8g4j",
  "modified" : "2026-04-16T22:47:05Z",
  "published" : "2026-04-16T22:47:05Z",
  "aliases" : [ ],
  "summary" : "Paperclip: Unauthenticated Access to Multiple API Endpoints in Authenticated Mode",
  "details" : "## Summary\n\nSeveral API endpoints in `authenticated` mode have no authentication at all. They respond to completely unauthenticated requests with sensitive data or allow state-changing operations. No account, no session, no API key needed.\n\nVerified against the latest version.\n\nDiscord: sagi03581\n\n## Steps to Reproduce\n\n### 1. Unauthenticated issue data access\n\n`GET /api/heartbeat-runs/:runId/issues` returns issue data for a heartbeat run with zero authentication. Every other endpoint in `server/src/routes/activity.ts` calls `assertCompanyAccess`, but this one was missed.\n\n```bash\ncurl -s http://<target>:3100/api/heartbeat-runs/00000000-0000-0000-0000-000000000001/issues\n# -> []  (HTTP 200, not 401 or 403)\n```\n\nIf an attacker obtains a valid run UUID (from logs, error messages, shared URLs, or by probing), they can read issue data without any credentials.\n\n### 2. Unauthenticated CLI auth challenge creation\n\n`POST /api/cli-auth/challenges` creates a CLI authentication challenge with no actor check at all. The handler at `server/src/routes/access.ts:1638-1659` skips any auth verification.\n\n```bash\ncurl -s -X POST -H \"Content-Type: application/json\" \\\n  -d '{\"command\":\"test\"}' \\\n  http://<target>:3100/api/cli-auth/challenges\n# returns challenge ID, token, and a pre-generated board API key\n```\n\nThe response includes a `boardApiToken` that becomes active once the challenge is approved. Combined with open registration (separate report), this enables persistent API key generation.\n\n### 3. Unauthenticated agent instruction / system prompt leakage\n\nThese endpoints in `server/src/routes/access.ts` require no authentication:\n\n```bash\ncurl -s http://<target>:3100/api/skills/index\n# returns all available skill endpoints\n\ncurl -s http://<target>:3100/api/skills/paperclip\n# returns the FULL agent heartbeat procedure including:\n#   - every API endpoint and its parameters\n#   - authentication mechanism (env var names, header formats)\n#   - the complete agent coordination protocol\n#   - the agent creation/hiring workflow\n\ncurl -s http://<target>:3100/api/skills/paperclip-create-agent\n# returns the full agent creation workflow with adapter configs\n```\n\nThis hands an attacker a complete map of the internal API without authenticating. It also leaks how agents authenticate, how heartbeats work, and what adapter configurations are available.\n\n### 4. Unauthenticated deployment configuration disclosure\n\n`GET /api/health` returns deployment mode, exposure setting, auth status, bootstrap status, version, and feature flags.\n\n```bash\ncurl -s http://<target>:3100/api/health\n# {\n#   \"deploymentMode\": \"authenticated\",\n#   \"deploymentExposure\": \"public\",\n#   \"authReady\": true,\n#   \"bootstrapStatus\": \"ready\",\n#   \"version\": \"2026.403.0\",\n#   ...\n# }\n```\n\nTells an attacker exactly how the instance is configured, whether registration is available, and what version is running.\n\n## Impact\n\n- **Data exposure**: heartbeat run issues accessible without credentials. Agent instructions and full API structure exposed to anyone.\n- **Reconnaissance**: an attacker can fingerprint the deployment (mode, version, features) and map the entire internal API before attempting anything else.\n- **Auth bypass stepping stone**: unauthenticated CLI challenge creation is a building block for the full RCE chain (reported separately).\n\n## Suggested Fixes\n\n1. **Add authentication to heartbeat run issues** in `server/src/routes/activity.ts`:\n   - `GET /api/heartbeat-runs/:runId/issues` -- add `assertCompanyAccess` like every other endpoint in the same file\n\n2. **Add authentication to CLI challenge creation** in `server/src/routes/access.ts`:\n   - `POST /api/cli-auth/challenges` -- add `assertBoard` at minimum\n\n3. **Add authentication to skill endpoints** in `server/src/routes/access.ts`:\n   - `GET /api/skills/available`\n   - `GET /api/skills/index`\n   - `GET /api/skills/:skillName`\n\n4. **Reduce health endpoint information** -- consider removing `deploymentMode`, `deploymentExposure`, and `version` from the unauthenticated response, or gating the full response behind `assertBoard`\n\n5. Consider a **global auth rejection middleware** for all `/api/*` routes in `authenticated` mode. Currently unauthenticated requests get `actor: { type: \"none\" }` and pass through to `next()`, relying on each route handler to check individually. A missing check means an open endpoint. Rejecting `type: \"none\"` at the middleware level for all routes except an explicit public allowlist (health, sign-in, sign-up, webhooks) would prevent this class of bug entirely.\n\n## Contact\n\nDiscord: sagi03581\n\nHappy to help verify fixes or provide additional details.",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "npm",
      "name" : "@paperclipai/server"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "2026.416.0"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/paperclipai/paperclip/security/advisories/GHSA-xfqj-r5qw-8g4j"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/paperclipai/paperclip"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-306" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-04-16T22:47:05Z",
    "nvd_published_at" : null
  }
}