Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconJoin presence channel using '__proto__' or 'constructor' as key
-
DeliveryServer tracks and broadcasts malicious presence key to all subscribers
-
ExploitVictim client Presence.syncState performs bare state[key] lookup
-
InstallLookup returns Object.prototype instead of undefined
-
C2.metas.map() call on prototype throws uncaught TypeError
-
ExecutePresence message handler exits without updating local state
-
ImpactonSync never fires; attack re-triggered on every server presence push
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A10:2025 - Mishandling of Exceptional Conditions
ASVS 5.0
V16 - Security Logging and Error Handling Unusual condition handling
|
| Exploitation Conditions | The attacker must be able to join a Phoenix Channel topic that uses Phoenix Presence tracking, and the application must allow the attacker to control the string used as their presence key (typically a username, display name, or client-supplied session identifier). Both Presence.syncState and Presence.syncDiff use the same vulnerable pattern, so either code path can be triggered. Exploitation is prevented if the application assigns server-generated presence keys (e.g., numeric database IDs or UUIDs) rather than accepting free-form client strings, since an attacker cannot then supply a prototype-colliding key. Impact is bounded to the single channel topic the attacker joins and lasts only as long as the attacker remains connected. No server-side code is affected and no mutation of Object.prototype occurs - the attacker cannot leverage this to escalate beyond client-side availability disruption. |
| Impact | The CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N, score 6.3) accurately captures the attack profile: network-accessible, low complexity, no elevated privileges, but gated by the Attack Requirement that the attacker must be able to join the targeted channel (AT:P). Impact is purely a low-severity client-side availability loss with no confidentiality, integrity, or server-side consequences. The vulnerability is not listed in CISA KEV and no public proof-of-concept exploit was provided in the input; EPSS data is absent. Despite the moderate score, the persistence mechanism significantly amplifies real-world impact: because the malicious key is tracked server-side, it is re-broadcast on every presence update, meaning the TypeError re-throws continuously rather than once. In applications where presence is a core UX signal - real-time collaboration, live event attendee lists, chat rooms - this persistent breakage could be highly disruptive to all legitimate users of an affected topic. Risk is bounded, however, by the requirement for channel access: if applications gate channel joins behind authentication or assign server-generated presence keys (e.g., numeric user IDs) rather than accepting free-form client-supplied strings, exploitation is prevented. |
| Exploit ScenarioDerived | An attacker connects to a Phoenix Channel whose topic uses Phoenix Presence tracking and sends a join payload specifying 'toString' (or any other Object.prototype member) as their presence key - an operation indistinguishable from a normal join. The Phoenix server records this presence and broadcasts it to all subscribers; every affected viewer's browser-side Presence.syncState or Presence.syncDiff then throws an uncaught TypeError when processing the update, freezing their presence display. The attacker remains connected, causing the server to re-broadcast the malicious key on every subsequent presence event, ensuring presence sync stays permanently broken for all viewers of that topic. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Jul 07, 2026
Phoenix Framework's Presence JavaScript client allows any user with ordinary channel access to permanently break presence synchronization for all other viewers of an affected channel topic. By joining a channel using a key name that collides with an Object.prototype property (such as '__proto__', 'constructor', or 'toString'), an attacker causes an uncaught TypeError inside Presence.syncState and Presence.syncDiff that halts all further presence updates for every connected viewer until the attacker disconnects. This is not in CISA KEV, no public exploit has been identified, and the CVSS 4.0 score of 6.3 reflects the limited but persistent client-side availability impact with no server-side exposure.
RemediationAI
Upgrade to the patched release for your version branch: Phoenix 1.5.15, 1.6.17, 1.7.24, or 1.8.9. Four patch commits are publicly available on GitHub (7f7b971c1ea0994e3fbd1c11ddb05e780bd38ad8, 89a1c4be161e436241e12b2378a719904b9bd96f, b90b22521465ece00eb5a19d5aa2b9465b209c85, beffc4da1e787e572121f68902c63daf4fe7d9c2); the vendor security advisory at https://github.com/phoenixframework/phoenix/security/advisories/GHSA-63mc-hw7g-86rr provides full context. If immediate upgrade is not feasible, a compensating control is to validate and reject presence keys on the server side before they are broadcast: specifically, reject any join or presence tracking request whose key matches a reserved JavaScript Object.prototype property name (__proto__, constructor, toString, valueOf, hasOwnProperty, isPrototypeOf, propertyIsEnumerable, toLocaleString). The trade-off is that this deny-list must be maintained as JavaScript evolves and requires application-level custom channel join callbacks. Alternatively, applications that assign server-generated numeric or UUID presence keys rather than accepting free-form client-supplied strings are not exploitable regardless of library version.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in npm
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The vulnerability resides in assets/js/phoenix/presence.js within the Presence.syncState and Presence.syncDiff routines (CPE: cpe:2.3:a:phoenixframework:phoenix:*:*:*:*:*:*:*:*). Both functions maintain a local presence map and check whether a given key already exists using a bare property access (state[key]) rather than an own-property guard such as Object.prototype.hasOwnProperty.call(state, key) or Object.hasOwn(state, key). In JavaScript, bare bracket notation traverses the prototype chain, so any key that matches a built-in Object.prototype member resolves to the prototype object itself instead of undefined. Because the prototype is truthy, the existence check passes, and the code then tries to call .metas.map() on the prototype - which has no such property - throwing a TypeError. CWE-754 (Improper Check for Unusual or Exceptional Conditions) precisely captures this root cause: the code fails to account for the exceptional case where JavaScript's implicit prototype inheritance makes a bare key lookup return an unexpected truthy value. Critically, this is a read-time confusion, not prototype pollution; Object.prototype is never mutated.
Know when Phoenix gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
S:C applied because attacker's channel join causes availability loss in other users' independent client sessions, crossing a security boundary; PR:N reflects ordinary channel access; A:L limited to presence sync disruption.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Improper Check for Unusual or Exceptional Conditions vulnerability in phoenixframework phoenix (Presence JavaScript client) allows an attacker with ordinary channel access to cause a persistent client-side denial of service against every viewer of a presence channel topic.
This vulnerability is associated with program files assets/js/phoenix/presence.js and program routines Presence.syncState and Presence.syncDiff.
The Phoenix JavaScript presence client checks whether a presence already exists with a bare truthiness test (state[key]) instead of an own-property check. Presence keys are attacker-controlled, because applications track presences under a username or id supplied by the client. A user who joins a channel choosing a key that is an Object.prototype member name (__proto__, constructor, toString, hasOwnProperty, and similar) makes that lookup return JavaScript's built-in Object.prototype instead of undefined. Because the prototype is truthy, the code treats it as an existing presence and reads .metas.map(...) off it, which throws an uncaught TypeError.
The exception propagates out of the presence message handler, so the local state is never updated and onSync() never fires. Because the malicious key is tracked on the server, it is re-pushed on every presence update and keeps re-throwing, so presence sync stays broken for every viewer of that channel topic until the attacker leaves. Both syncState and syncDiff use the same unsafe existence-check pattern. The impact is limited to the affected topic and is a read-time confusion of the prototype object, not a mutation of Object.prototype (it is not prototype pollution).
This issue affects phoenix: from 1.2.0 before 1.5.15, from 1.6.0 before 1.6.17, from 1.7.0 before 1.7.24, and from 1.8.0 before 1.8.9.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Unauthenticated remote denial-of-service in Phoenix Framework 1.7.0-1.7.21 and 1.8.0-1.8.5 allows attackers to crash Eli
The Phoenix Framework versions 1.0.0 through 1.0.4, 1.1.0 through 1.1.6, 1.2.0, 1.2.2 and 1.3.0-rc.0 are vulnerable to u
In Phoenix SCT WinFlash 1.1.12.0 through 1.5.74.0, the included drivers could be used by a malicious Windows application
Denial of service in the Phoenix Framework (Elixir) affects any endpoint mounting a Phoenix.Socket with a reachable WebS
socket/transport.ex in Phoenix before 1.6.14 mishandles check_origin wildcarding. Rated high severity (CVSS 7.5), this v
Session fixation in the Elixir/Phoenix authentication library ash_authentication (0.2.0 before 4.15.0, and 5.0.0-rc.0 be
Filesystem path disclosure in Tidewave Phoenix 0.8.0 through 0.9.1 lets a hostile web page read the framework's configur
EUVD-2026-42050
GHSA-63mc-hw7g-86rr
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB