Aedes MQTT Broker
CVE-2026-63341
HIGH
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessConnect to broker MQTT listener
-
DeliverySend PUBLISH/SUBSCRIBE (or set Will) with deeply nested topic
-
Exploitqlobber._split_words throws uncaught 'too many words'
-
ExecutionException escapes to Node.js event loop
-
ImpactBroker process crashes, all clients dropped until restart
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A10:2025 - Mishandling of Exceptional Conditions
ASVS 5.0
V16 - Security Logging and Error Handling Exception handling completeness
|
| Exploitation Conditions | The attacker must be able to establish an MQTT session to the broker's listener (default TCP 1883) and then either (a) send a PUBLISH or SUBSCRIBE whose topic exceeds qlobber's hard-coded max_words limit of 100 '/'-separated levels (the PoC uses topics like 'a/' repeated ~30000 times), or (b) register a Will message with such a deeply nested topic, which crashes the broker on ungraceful disconnect because the Will publish path calls broker.publish directly and bypasses the PUBLISH handler. The key LIMITING factor is reachability and authentication: PR:N applies to default/open brokers (e.g. the official moscajs/aedes Docker image, which is unauthenticated), whereas a broker configured to require authentication forces the attacker to hold valid credentials first. All stable versions through 1.1.0 are affected; 1.1.1 rejects over-deep topics via the new maxTopicLevels guard (default 100). |
| Impact | This is a genuine, easy-to-trigger availability risk rather than a high-CVSS-but-low-real-risk issue. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H = 7.5) is internally consistent with the evidence: a single malformed MQTT packet over the network, with no user interaction and low complexity, crashes the whole broker - the GHSA advisory states the broker 'dies instantly on the very first packet.' Impact is availability-only (C:N/I:N), so this is not a data-breach or RCE issue; it is a service-kill. A complete working Python PoC is published directly in the GitHub Security Advisory, so publicly available exploit code exists, but the vulnerability is NOT listed in CISA KEV and NO EPSS score was provided in the input, so there is no signal of active, widespread exploitation at time of analysis - treat exploitation as feasible and demonstrated, not confirmed in-the-wild. The vuln.today decision label is 'this_week', consistent with a trivially exploitable DoS that is not an emergency-level RCE. One caveat requiring verification: the CVSS carries PR:N (unauthenticated), but the description and PoC note that authentication is 'authenticated or unauthenticated according to broker configuration' - PR:N reflects the default/open deployment (e.g. the official Docker image), while a broker that enforces authentication raises the bar to a client holding valid credentials. SSVC-style automatable judgement: the trigger is a single stateless packet, so exploitation is highly automatable against reachable brokers. |
| Exploit ScenarioDerived | An attacker who can reach the broker's MQTT listener (default TCP 1883) connects - unauthenticated against a default/open broker such as the official Docker image, or with valid credentials where authentication is enforced - and sends one PUBLISH or SUBSCRIBE whose topic contains tens of thousands of '/' delimiters (or registers a deeply nested Will topic that fires on ungraceful disconnect). A full working Python PoC is published in the GHSA advisory, and the broker crashes on the first packet, disconnecting every legitimate IoT device/application until the process is restarted. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 30, 2026
Remote denial of service in the Aedes MQTT broker through version 1.1.0 lets any client able to open an MQTT session crash the broker process with a single over-deep PUBLISH or SUBSCRIBE topic, or by registering a Will message with such a topic that fires on ungraceful disconnect. The crash comes from a synchronous 'too many words' throw inside the qlobber topic matcher that Aedes does not catch, so it reaches the Node.js event loop and terminates the process, disconnecting every connected client and blocking reconnection until restart. The vendor advisory includes a public proof-of-concept script that reliably kills the official moscajs/aedes Docker image on the first packet; the fix ships in 1.1.1 as a topic-level guard defaulting to 100 levels.
RemediationAI
Upgrade to aedes 1.1.1, which is the vendor-released patch (https://github.com/moscajs/aedes/releases/tag/v1.1.1, commit b9024faa4cb416c4c6980760b4d7f55336315f2d); the fix introduces the maxTopicLevels option, defaults it to 100 levels, and clamps any configured value into the 1-100 range, so do not attempt to raise it above 100 because the bundled mqemitter and aedes-persistence build qlobber with its default max_words of 100 and Aedes cannot increase it. The same guard is applied at the protocol boundary in the SUBSCRIBE, UNSUBSCRIBE and PUBLISH handlers and inside broker.publish/broker.subscribe, which is what closes the Will-message bypass that reached broker.publish directly on ungraceful disconnect. No configuration-only workaround is described in the advisory for pre-1.1.1 releases, and the assessment notes that exposure is governed by listener reachability and authentication: brokers requiring valid MQTT credentials force an attacker to authenticate before reaching the vulnerable code path, while default open listeners such as the official Docker image are reachable unauthenticated, so restricting who can open an MQTT session limits exposure but does not remove the flaw - only the 1.1.1 upgrade does that. Details are in https://github.com/moscajs/aedes/security/advisories/GHSA-xxqp-5qx8-gj5q.
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
MQTT topics are '/'-separated hierarchies, and Aedes routes them through mqemitter into qlobber, the wildcard-matching library used for subscription matching; aedes-persistence builds a second qlobber-backed trie. qlobber splits a topic into words on '/' and enforces a hard-coded max_words limit of 100, throwing a synchronous plain Error('too many words') from Qlobber._split_words (lib/qlobber.js:604) once a topic exceeds it. Aedes performed no bound on topic depth or structural complexity, and the calls reaching that throw - Aedes.subscribe via SubState.addSubs in handlers/subscribe.js, and the publishing logic - were never wrapped in try/catch, so per CWE-248 (uncaught exception, with CWE-400 uncontrolled resource consumption also assigned) the exception propagates to the Node.js event loop and kills the whole broker rather than failing a single operation. The Will path is independently reachable: on ungraceful client disconnect the stored Will is republished by calling broker.publish directly, bypassing the PUBLISH protocol handler entirely, so a delivered Will with a deeply nested topic crashes the broker without any subsequent PUBLISH. The 1.1.1 fix adds a maxTopicLevels option (default 100, clamped to the range 1-100 because the bundled mqemitter and aedes-persistence construct qlobber with its default max_words of 100 and Aedes cannot raise it), implements topicLevelCount in lib/utils.js by counting '/' separators, and rejects over-deep topics in validateTopic for SUBSCRIBE/UNSUBSCRIBE, in handlers/publish.js before any ack or persistence side effect, and in broker.publish/broker.subscribe so the Will and programmatic API paths are covered too.
Know when Aedes 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
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Single network packet with no interaction crashes the whole broker, so AV:N/AC:L/UI:N and A:H; PR:N reflects the unauthenticated default deployment; no confidentiality/integrity impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
DescriptionCVE.org
Aedes is an MQTT broker that can run on any stream server. Prior to 1.1.1, the MQTT broker does not bound topic depth or structural complexity before passing topics through mqemitter into qlobber. A PUBLISH, SUBSCRIBE, or registered Will message containing an excessively deep topic can reach qlobber._split_words in lib/qlobber.js and trigger an uncaught too many words exception. Calls from handlers/subscribe.js and the publishing logic are not protected against that exception, so it escapes to the Node.js event loop and terminates the entire broker. The Will path is independently reachable when a client disconnects ungracefully: it calls broker.publish directly and bypasses the PUBLISH handler. An attacker must be able to establish an MQTT session, authenticated or unauthenticated according to broker configuration. A successful attack disconnects all legitimate clients and prevents reconnection until the broker process restarts. This issue is fixed in version 1.1.1.
Technical POC Analysis
CWE-248 (Uncaught Exception), with the advisory also scoring CWE-400.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A high-severity vulnerability in the Aedes MQTT broker (versions through 1.1.0) allows any client to crash the broker with a single crafted message, causing service disruption for all connected devices. Organizations using this broker in production, especially for IoT or real-time messaging, face operational downtime until the service is restarted, affecting availability and potentially business continuity.
No vendor-released patch identified at time of analysis; interim mitigations include restricting network access to the MQTT broker, deploying a filtering proxy to block overly deep topic hierarchies, and monitoring for abnormal client disconnections.
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.
Affected Products (CPE)CVE.org
An issue was discovered in MoscaJS Aedes 0.42.0. Rated high severity (CVSS 7.5), this vulnerability is remotely exploita
Improper authorization in aedes version <0.35.0 will publish a LWT in a channel when a client is not authorized. Rated m
NVD
CVE.org
EPSS
GitHub
Exploit-DB