Pterodactyl, Race Condition Vulnerability, CVE-2023-XXXX (Critical)

Listen to this Post

The vulnerability is a classic race condition within the Pterodactyl Panel’s resource creation logic (e.g., for databases, backups). When a user requests a new resource, the application first checks if the server’s configured resource limit has been reached. This check (SELECT COUNT() FROM resources WHERE server_id = X) occurs early in the request cycle without implementing a mutex lock or database transaction with sufficient isolation on the server’s resource count. A malicious actor can exploit this by sending a high-volume burst of concurrent `POST` requests to the creation endpoint (e.g., /api/client/servers/<uuid>/databases). Each request independently passes the initial limit check because they all read the same, not-yet-updated count from the database. Subsequently, each request proceeds to insert a new resource record (INSERT INTO resources ...), thereby exceeding the administrative quota. This lack of atomic “check-and-create” logic allows the limit to be bypassed entirely through concurrent execution.
Platform: Pterodactyl Panel
Version: < 1.11.6
Vulnerability : Race Condition
Severity: Critical
date: 2023-10-11

Prediction: 2023-11-01

What Undercode Say:

Concurrent request simulation
seq 1 50 | xargs -n1 -P50 -I {} curl -X POST -H "Authorization: Bearer $CLIENT_API_KEY" https://panel.host.example/api/client/servers/$SERVER_UUID/databases -d '{"database": "db_{}", "remote": "%"}'
Resource exhaustion check
curl -H "Authorization: Bearer $ADMIN_API_KEY" https://panel.host.example/api/application/servers/$SERVER_UUID | jq '.attributes.limits.database'
Example vulnerable code logic (simplified)
1. CHECK: current_count = Resource.where(server_id: server_id).count
2. IF current_count < server.limit
3. THEN Resource.create(server_id: server_id, ...) RACE WINDOW

How Exploit:

1. Acquire client API key.

2. Identify target server UUID.

3. Craft requests for resource creation (database/backup/port).

  1. Use tooling (e.g., httpx, custom script) to flood endpoint with concurrent requests.
  2. Verify bypass by checking created resource count exceeds limit.

Protection from this CVE:

  • Implement pessimistic locking (SELECT FOR UPDATE) on the server record during the check-and-create transaction.
  • Use database-level unique constraints or atomic increment checks.
  • Apply distributed rate-limiting per server at the proxy/application layer.
  • Upgrade to patched version (e.g., v1.11.6+).

Impact:

  • Resource Exhaustion (Node/Backup)
  • Denial of Service
  • Quota Bypass

🎯Let’s Practice Exploiting & Learn Patching For Free:

Sources:

Reported By: github.com
Extra Source Hub:
Undercode

🔐JOIN OUR CYBER WORLD [ CVE News • HackMonitor • UndercodeNews ]

💬 Whatsapp | 💬 Telegram

📢 Follow DailyCVE & Stay Tuned:

𝕏 formerly Twitter 🐦 | @ Threads | 🔗 Linkedin Featured Image

Scroll to Top