Skip to main content

Phoenix Framework CVE-2026-56812

| EUVDEUVD-2026-42050 MEDIUM
Improper Check for Unusual or Exceptional Conditions (CWE-754)
2026-07-07 EEF GHSA-63mc-hw7g-86rr
6.3
CVSS 4.0 · Vendor: EEF
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Recon
    Join presence channel using '__proto__' or 'constructor' as key
  2. Delivery
    Server tracks and broadcasts malicious presence key to all subscribers
  3. Exploit
    Victim client Presence.syncState performs bare state[key] lookup
  4. Install
    Lookup returns Object.prototype instead of undefined
  5. C2
    .metas.map() call on prototype throws uncaught TypeError
  6. Execute
    Presence message handler exits without updating local state
  7. Impact
    onSync 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

phoenix 1.6.0 <1.6.17
phoenix 1.7.0 <1.7.24
phoenix 1.2.0 <1.5.15
phoenix 2270aaf21bd02c6a6a1022820564efb605a97655 <*
phoenix 1.8.0 <1.8.9

Affected Packages

npm phoenix fix: 1.5.15, 1.6.17, 1.7.24, 1.8.9

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

Vendor (EEF) PRIMARY 6.3 MEDIUM
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
vuln.today AI 5.8 MEDIUM

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.

3.1 AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:N/A:L
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N

Primary rating from Vendor (EEF).

CVSS VectorVendor: EEF

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
Low
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

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

EPSS Score
0.4%
Top 72% exploitable
Prevalence
Medium
widely-used Elixir real-time web framework, strong niche adoption
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub VulDB

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC Yes
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

52
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy