CVE-2026-56811: Phoenix Framework Unbounded Channel Allocation Denial of Service
Phoenix is a popular web framework for Elixir applications. This vulnerability allows an attacker without credentials to crash a Phoenix application by opening a single WebSocket or long-polling connection and repeatedly sending join messages to create thousands of channel processes. The framework had no built-in limit on how many channels one connection could spawn, allowing a single attacker to exhaust the server's process capacity and prevent legitimate users from accessing the application. The fix introduces a configurable cap (default 100 channels per connection) that forces attackers to open multiple connections, where network-layer protections can block them.
Source data · NVD / CISA · public domain
- CVSS
- 3.1 · 7.5 HIGH · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
- Weaknesses (CWE)
- CWE-770
- Affected products
- 1 configuration(s)
- Published / Modified
- 2026-07-07 / 2026-07-09
NVD description (verbatim)
Allocation of Resources Without Limits or Throttling vulnerability in phoenixframework phoenix (Phoenix.Socket module) allows an unauthenticated attacker to cause a denial of service against any endpoint that mounts a Phoenix socket with a reachable channel transport (WebSocket or LongPoll). This vulnerability is associated with program files lib/phoenix/socket.ex and program routine 'Elixir.Phoenix.Socket':handle_in/4. Phoenix transports do not limit the number of channels that a single transport process may join. Every phx_join message a client sends over one connection starts a persistent channel process, and the socket process accepts an unbounded number of them. A single unauthenticated client can therefore open one WebSocket or LongPoll connection and stream a large number of phx_join messages, spawning hundreds of thousands of channel processes over that one connection and eventually reaching the BEAM maximum process limit. Once the process table is exhausted the virtual machine can no longer start new processes, denying service to legitimate traffic across the whole node. Because the amplification happens inside a single connection, network-layer connection caps and rate limiting do not mitigate it. The fix adds a :max_channels_per_transport option (default 100) that bounds the number of channels a single transport process can join, forcing abusive clients to open many connections instead, where external load balancers and reverse proxies can throttle them. This issue affects phoenix: from 0.11.0 before 1.5.15, from 1.6.0-rc.0 before 1.6.17, from 1.7.0-rc.0 before 1.7.24, and from 1.8.0-rc.0 before 1.8.9.
7 reference(s) · View on NVD →
SEC.co analysis · AI-assisted, reviewed against source
Technical summary
Phoenix.Socket.handle_in/4 in the Phoenix.Socket module processes incoming phx_join messages without enforcing a per-transport channel limit. An unauthenticated client establishes one WebSocket or LongPoll transport connection and streams repeated phx_join messages, each spawning a new channel process. Because the Erlang/OTP BEAM runtime has a finite process table, an attacker can exhaust this limit—potentially reaching hundreds of thousands of channels on a single connection—causing the entire BEAM node to fail when attempting to allocate new processes for any purpose. The vulnerability exists because the socket process accepts an unbounded number of channel join requests from a single transport without throttling. The remediation adds a :max_channels_per_transport configuration option (default value 100) that enforces a hard cap per transport connection, shifting the attack surface from internal process exhaustion to one where attackers must establish multiple external connections that can be rate-limited by load balancers and reverse proxies.
Business impact
Applications using vulnerable Phoenix versions face a trivial denial-of-service attack vector. An attacker with network access can crash the application or degrade it to the point of unavailability without authentication. This affects the availability pillar of security: users cannot access the service, potentially impacting revenue, customer trust, and SLAs. The attack requires no specialized knowledge—only the ability to send WebSocket frames or HTTP long-poll requests. For organizations running multi-tenant or publicly accessible Phoenix applications, this is a critical operational risk.
Affected systems
Phoenix framework versions 0.11.0 through 1.5.14, 1.6.0-rc.0 through 1.6.16, 1.7.0-rc.0 through 1.7.23, and 1.8.0-rc.0 through 1.8.8 are vulnerable. Any application built on these versions that exposes a Phoenix socket endpoint with WebSocket or LongPoll transport is at risk. Applications that do not use Phoenix.Socket (pure HTTP-only Phoenix apps) are not affected. The vulnerability is transport-agnostic: both WebSocket and LongPoll connections can be exploited in the same way.
Exploitability
Exploitation is trivial and requires no authentication. An attacker needs only network connectivity to the Phoenix socket endpoint and the ability to send repeated phx_join messages over a single transport connection. No special tools are required beyond a WebSocket client or HTTP client. The attack is reliable and deterministic—it will succeed against any vulnerable endpoint. There is no known public exploit code, but the attack is straightforward enough that attackers can implement it in hours. Network-based defenses (connection-rate limiting, IP blocking) are ineffective because the attack amplifies through a single connection; only per-connection channel limits or patching will stop it.
Remediation
Upgrade Phoenix to version 1.5.15 or later (for the 1.5.x series), 1.6.17 or later (for the 1.6.x series), 1.7.24 or later (for the 1.7.x series), or 1.8.9 or later (for the 1.8.x series). After upgrading, optionally configure the :max_channels_per_transport option in your socket configuration if you need to adjust the default limit of 100 channels per connection. No interim mitigations are available other than disabling socket endpoints or placing them behind additional authentication gates that require human interaction.
Patch guidance
Identify which versions of Phoenix your applications depend on by checking mix.lock or your mix.exs dependencies. Cross-reference your versions against the vulnerability ranges (0.11.0–1.5.14, 1.6.0-rc.0–1.6.16, 1.7.0-rc.0–1.7.23, 1.8.0-rc.0–1.8.8). If affected, update your mix.exs to specify the patched versions listed above. Run `mix deps.update phoenix` to pull the fixed version, then recompile and test thoroughly. Pay attention to any breaking changes in the release notes, though the :max_channels_per_transport option is backward compatible and defaults to 100. Consider adjusting this limit upward only if your application legitimately requires individual clients to join many channels simultaneously; most applications should use the default.
Detection guidance
Monitor your BEAM node's process count in real time using observer or :erlang.system_info(:process_count). A sudden spike in process count from a single source IP or connection indicates an active attack. Log phx_join messages and alert if a single transport connection accumulates an unusually high number of channel joins (e.g., >50 joins in a short window). If you cannot patch immediately, enable detailed logging in Phoenix.Socket and correlate spikes in process count with connection source IPs. Consider implementing a temporary reverse-proxy rule to block clients that open WebSocket connections and send >N join messages within a time window.
Why prioritize this
This vulnerability scores 7.5 (HIGH) on CVSS 3.1 because it is network-accessible, requires no authentication, and causes complete denial of service to the affected application. While it does not compromise confidentiality or integrity, the attack is trivial to execute and the impact is severe. Organizations should patch within 30 days, prioritizing internet-facing applications. Internal applications behind strict network access controls can be patched on a longer timeline, but should still be addressed promptly.
Risk score, explained
The CVSS 3.1 score of 7.5 reflects: (1) Network vector (AV:N) – attack requires only network access, no proximity; (2) Low complexity (AC:L) – no special conditions or user interaction required; (3) No privileges required (PR:N) – unauthenticated attacker can trigger the vulnerability; (4) No user interaction (UI:N) – attack is automatic; (5) Unchanged scope (S:U) – impact is limited to the Phoenix application itself; (6) High availability impact (A:H) – the entire service becomes unavailable. The vector does not include confidentiality or integrity impact because the attack is purely denial of service.
Frequently asked questions
Does this affect my application if I don't use Phoenix.Socket or only serve static HTML?
No. This vulnerability is specific to applications that expose a Phoenix socket endpoint (typically configured with a socket/1 macro in your endpoint or a separate UserSocket module). If your application is pure HTTP without WebSocket or long-polling channels, you are not affected.
Can I mitigate this without patching by increasing the BEAM process limit?
Increasing the process limit (erlang +P flag) delays the attack but does not prevent it. An attacker can still exhaust whatever limit you set; you would just run out of memory first. Patching is the only proper mitigation because it caps channels per connection, forcing attackers to open multiple connections where external load balancers can throttle them.
What is a reasonable value for :max_channels_per_transport for my application?
The default of 100 is suitable for most applications. Adjust upward only if you have legitimate use cases where a single client needs to join many channels simultaneously (e.g., a real-time dashboard displaying data from 200+ channels). Even then, consider 200–500 as a reasonable ceiling. Values above 1000 defeat the purpose of the fix.
Does this vulnerability require the attacker to know valid channel names?
No. The attack works by sending repeated phx_join messages; the vulnerability is triggered regardless of whether the channels exist or the join is accepted. The attacker does not need to be authenticated or know application secrets.
This analysis is based on publicly available information as of July 2026. While efforts have been made to ensure accuracy, SEC.co makes no warranty regarding completeness or correctness. Patch version numbers and affected version ranges should be verified against official Phoenix release notes and security advisories before deployment. Organizations should conduct their own testing in non-production environments prior to patching. The presence of a vulnerability does not guarantee it has been exploited in the wild, but organizations should assume active exploitation is possible for publicly disclosed flaws. Source: NVD (public-domain), retrieved 2026-08-16. Analysis generated by SEC.co (claude-haiku-4-5).
Related vulnerabilities
- CVE-2023-54365HIGHTraefik HTTP/2 Denial of Service Vulnerability – Rapid Reset Attack
- CVE-2025-46638HIGHDell BSAFE SSL-J Resource Exhaustion DoS Vulnerability
- CVE-2025-61028HIGHOpenLink Virtuoso DoS Vulnerability in time_t_to_dt Component
- CVE-2025-7737HIGHHitachi VSP iSCSI DoS Vulnerability – Patch Guide
- CVE-2026-11586HIGHcurl WebSocket Memory Exhaustion Denial-of-Service
- CVE-2026-11946HIGHopen62541 Memory Exhaustion via GetEndpoints Discovery Service
- CVE-2026-12151HIGHundici WebSocket Memory Exhaustion DoS Vulnerability
- CVE-2026-13698HIGHOpenVPN Memory Leak Denial of Service Vulnerability