CVE-2026-21696: Pterodactyl Wings Denial of Service via SQLite Variable Exhaustion

Published on

A high-severity denial of service vulnerability in Pterodactyl Wings lets low-privileged users crash the daemon by flooding the activity log database. Here is what it is, how it works, and how to patch it.

Written by Jochem Wassenaar – CEO of Space-Node – 15+ years combined experience in game server hosting, VPS infrastructure, and 24/7 streaming solutions. Learn more

CVE-2026-21696 is a denial of service vulnerability in Pterodactyl Wings, the daemon component that runs on each node and manages game server containers. Unlike CVE-2025-49132 which targeted the web panel, this vulnerability lives in the backend daemon itself.

The attack does not require elevated privileges. A regular user with access to a server on your node can trigger it. The result is a crashed Wings daemon, which severs communication between all game servers on that node and the panel. Every server on the node goes dark simultaneously.

The fix is upgrading Wings to version 1.12.0.


How Wings Works

Pterodactyl operates on a two-component architecture:

  • Panel: The web frontend. Handles user accounts, server listings, and configuration. Runs PHP/Laravel.
  • Wings: The daemon. Runs as a binary on each physical node. Starts and stops Docker containers, executes console commands, streams logs back to the panel, and records activity.

Wings stores its local state, including activity logs, in an SQLite database on the node. SQLite is a file-based database engine. It does not run as a separate service; it is embedded directly in the Wings binary.


The Vulnerability Mechanism

Wings keeps an activity log. Every significant action taken on a server instance gets written to this log: start, stop, power commands, file operations, installs. These log entries accumulate over time.

Wings periodically cleans old log entries to prevent the database from growing indefinitely. The cleanup query deletes log entries that are older than a defined threshold. The query looks broadly like this:

DELETE FROM activity_logs WHERE id IN (?, ?, ?, ...)

The list of IDs to delete is constructed dynamically at runtime by fetching all IDs older than the threshold and building a parameterized query.

SQLite has a hard limit on the number of parameters a single query can contain. The default limit is 999 variables per query. If the Wings daemon attempts to delete more than 999 entries in a single query, SQLite raises an error:

too many SQL variables

This error is not handled gracefully in the affected versions. Wings crashes. The daemon terminates. All containers lose their management connection.


How a Low-Privileged User Triggers This

A server with a high volume of activity log entries accumulates those entries faster. An attacker who controls a server on the node can generate massive amounts of activity events deliberately: starting and stopping the server rapidly, executing console commands repeatedly, triggering file system operations in bulk.

Once the log entry count exceeds a threshold where a cleanup query would need to process more than 999 IDs, the next cleanup cycle crashes the daemon.

This does not require any special permissions beyond having a server on the affected node.


The Impact

When Wings crashes:

  1. All game servers on the node continue running inside their Docker containers, but the panel loses visibility into them
  2. The panel shows all servers on that node as "offline" or "unknown"
  3. Power commands (start, stop, restart) stop working for all servers on the node
  4. Console access through the panel is severed for all servers
  5. Server metrics (CPU, RAM, bandwidth) stop updating

Recovery requires SSH access to the node to restart the Wings process manually. If the Wings process is not running as a systemd service with automatic restart enabled, servers remain unmanageable until an administrator intervenes.


Fixing It: Upgrade to Wings 1.12.0

Version 1.12.0 resolves the issue by implementing batch processing for the deletion query. Instead of constructing a single query with potentially thousands of parameters, Wings now splits large deletion operations into multiple queries with at most 999 IDs each.

To upgrade Wings:

# Stop the running Wings service
systemctl stop wings

# Download the latest Wings binary
curl -L -o /usr/local/bin/wings \
  https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64

# Make it executable
chmod u+x /usr/local/bin/wings

# Start Wings
systemctl start wings

# Check the version
wings --version

The output should show 1.12.0 or later.


Verifying the Fix

After upgrading, confirm Wings is running cleanly:

systemctl status wings

Look for Active: active (running) in the output with a clean start time.

Check the Wings log for any SQLite errors:

journalctl -u wings --since "10 minutes ago"

No too many SQL variables entries means the patch is working.


Hardening Your Wings Installation

Beyond patching, these practices reduce the impact of any future daemon vulnerability:

Run Wings as a non-root user where possible. Newer Wings versions support this. A compromised daemon running as a limited user is less dangerous than one running as root.

Enable automatic restart for the Wings service. Add this to your Wings systemd service file:

[Service]
Restart=on-failure
RestartSec=5s

This ensures a crash causes a service restart within 5 seconds rather than requiring manual intervention.

Limit activity log retention. Configure Wings to purge logs more aggressively. Shorter retention windows mean fewer rows accumulate, reducing the risk of hitting database limits even on heavily used nodes.

Monitor your Wings service. Set up process monitoring that alerts you when Wings stops responding. Tools like Uptime Kuma can check the Wings API health endpoint periodically.


The CVE comparison makes clear that Pterodactyl's security posture requires active maintenance. Both the panel and the daemon need to stay current.

| CVE | Component | Type | Max Impact | Fixed In | |---|---|---|---|---| | CVE-2025-49132 | Panel (web) | RCE via path traversal | Full system compromise | Panel 1.11.11 | | CVE-2026-21696 | Wings (daemon) | Denial of Service | All servers on node inaccessible | Wings 1.12.0 |

If you run your own Pterodactyl infrastructure, both patches should be applied immediately.

Jochem Wassenaar

About the Author

Jochem Wassenaar – CEO of Space-Node – Experts in game server hosting, VPS infrastructure, and 24/7 streaming solutions with 15+ years combined experience.

Since 2023
500+ servers hosted
4.8/5 avg rating

Our team specializes in Minecraft, FiveM, Rust, and 24/7 streaming infrastructure, operating enterprise-grade AMD Ryzen 9 hardware in Netherlands datacenters. We maintain GDPR compliance and ISO 27001-aligned security standards.

Read full author bio and credentials →

Launch Your VPS Today

Get started with professional VPS hosting powered by enterprise hardware. Instant deployment and 24/7 support included.

CVE-2026-21696: Pterodactyl Wings Denial of Service via SQLite Variable Exhaustion