Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessConnect anonymously to broker
-
DeliverySet durable session client ID '<victim>_meta'
-
ExploitCollide message map with victim metadata map
-
ExecutionCorrupt shared H2 MVStore head/tail
-
ImpactRead/overwrite victim queued messages or drop delivery
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Resource identifier sanitization
|
| Exploitation Conditions | Requires the broker to use DURABLE/persistent sessions backed by the H2 MVStore (H2PersistentQueue) - the vulnerable code path only exists for durable queues. The attacker must connect a durable session using a client ID ending in '_meta' that matches a real victim's client ID (i.e., '<victim>_meta'), so knowledge or predictability of a target client ID is required. Moquette accepts anonymous clients by default (PR:N), so authentication is not necessarily needed, but the collision only yields cross-session impact when two durable sessions with the colliding names coexist. Deployments without H2 durable persistence, or single-tenant setups where no meaningful victim client ID can be targeted, are not exploitable. |
| Impact | The vendor-supplied CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:L, 8.8) frames this as a network, unauthenticated, integrity-dominant flaw, which aligns with Moquette accepting anonymous MQTT clients by default. However, several signals temper the 8.8 rating. First, exploitation is materially gated: it only affects DURABLE (persistent) sessions backed by the H2 MVStore, and the attacker must connect with a client ID of the form '<victim>_meta' - meaning the attacker needs to know or guess a legitimate victim's client ID whose derived map name it can collide with. That is a real attack requirement not reflected by AC:L/AT:N, so I assess higher complexity (AC:H / AT:P). Second, the vendor set VC:N, yet the description explicitly states the collision can cause 'exposure of queued content across sessions,' which is a confidentiality impact - so VC:N appears understated and I assess VC:L. There is no EPSS score, no CISA KEV listing, and no independent active-exploitation evidence, so this is not a widespread-exploitation priority. Reproduction/exploit code effectively exists (the security advisory ships source-only PoCs run on JDK 17, and the fix PR adds a unit test that directly reproduces the map collision), so treat it as 'publicly available exploit code exists' rather than actively exploited. Net: a legitimate integrity/data-corruption and limited cross-session disclosure bug worth patching for anyone running durable H2 persistence in a multi-tenant broker, but not an internet-wide emergency given the niche product footprint and the durable-session precondition. |
| Exploit ScenarioDerived | A multi-tenant Moquette deployment uses durable (persistent) sessions with H2 persistence. An attacker connects anonymously with a durable session whose client ID is '<victimClientId>_meta'; its message map ('queue_<victim>_meta') then aliases the victim's metadata map ('queue_<victim>_meta'), corrupting the victim's queue head/tail and causing message loss, misdelivery, failed queue reloads, or leakage of the victim's queued messages into the attacker's session. The GHSA advisory provides source-only PoCs (JDK 17) and the fix PR includes a unit test that reproduces the exact collision. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 23, 2026
Durable MQTT sessions in Moquette 0.18.0 and earlier can corrupt each other's persisted queues when a client connects with an identifier ending in '_meta', allowing cross-session message loss, misdelivery, or exposure of queued content. The flaw only exists when the broker is configured with H2 MVStore-backed durable/persistent sessions, and the attacker must use a client ID shaped like '<victim_client_id>_meta', so some knowledge or predictability of a target client ID is required; Moquette accepts anonymous clients by default, so authentication is not necessarily a barrier (assessed CVSS 3.1 AV:N/AC:H/PR:N/UI:N/C:L/I:H/A:L). The impact is integrity-dominant with limited confidentiality loss - this is a JVM memory-safe broker and no RCE is involved; the upstream advisory that covers this bug also ships source-only PoC code for a companion pattern-ACL bypass, but no public exploit identified at time of analysis and no CISA KEV listing. The issue is fixed in Moquette 0.18.1.
RemediationAI
Vendor-released patch: upgrade to Moquette 0.18.1, which namespaces the queue metadata map under a distinct 'queuemeta_' prefix and automatically and idempotently migrates any pre-existing 'queue_<clientId>_meta' head/tail values into the new map on first open, then removes the legacy map - the migration is safe to leave in place across restarts, but back up the H2 MVStore file before upgrading if you need to retain or inspect durable queued messages. Because 0.18.1 also fixes the companion pattern-ACL bypass, broker-crash DoS, and Will-message authorization bypass, treat the upgrade as covering the whole advisory cluster rather than this CVE alone (advisory: https://github.com/moquette-io/moquette/security/advisories/GHSA-5f42-97gr-vfhq; patch PR: https://github.com/moquette-io/moquette/pull/964). If immediate upgrade is impossible, the most direct compensating control is to disable H2 durable persistence and run sessions in memory (with the trade-off that durable sessions, offline message queuing, and QoS 1/2 delivery across broker restarts are lost); a weaker stopgap is to enforce, via the authenticator/authorizator or a connection-time client-ID policy, that no client ID ends in '_meta' and that client IDs are assigned rather than chosen by clients - but this only blocks the specific collision shape, does not fix the underlying naming defect, and can be evaded if client IDs are attacker-chosen or if other identifier-shape collisions exist, so it should be treated as temporary. Finally, require authentication and restrict which principals may open durable sessions, since Moquette permits anonymous clients by default and an anonymous attacker who can guess or observe a victim client ID can trigger the collision without credentials.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in maven, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Moquette is a lightweight Java MQTT broker that persists durable session state in an H2 MVStore (a log-structured key/value store of named maps). In H2PersistentQueue (broker/src/main/java/io/moquette/persistence/H2PersistentQueue.java), each queue previously derived both its message map name and its metadata map name from the same 'queue_' prefix: messages went into 'queue_' + clientId and the head/tail bookkeeping (a String->Long map) went into 'queue_' + clientId + '_meta'. The client ID is attacker-controlled and is never checked for characters that would make these two derived identifiers overlap, which is the CWE-99 resource-identifier injection class: an untrusted identifier is concatenated into a resource name without namespacing or normalization, so 'sensor_meta' produces a message map named 'queue_sensor_meta' that is byte-for-byte identical to the metadata map of the unrelated session 'sensor'. Because MVStore maps are typed, two writers using incompatible value types on the same map corrupt the stored head/tail offsets and the interleaved message records, which explains the integrity-dominant CVSS profile (VI:H) with only limited cross-session data exposure (VC:L). The fix (PR #964, commit 72d6c8257191d2e4b2e3aa11ab25fd09f88c6cb7, released in v0.18.1) moves metadata to a distinct 'queuemeta_' prefix that differs from 'queue_' at a fixed position, so no client ID can ever cause the two names to collide, and adds a one-time idempotent migrateLegacyMetadata routine that copies existing 'queue_<name>_meta' head/tail values into the new map and deletes the legacy map. Note that the same GitHub security advisory (GHSA-5f42-97gr-vfhq) bundles several related but separate findings - a pattern-ACL wildcard injection cross-tenant bypass, a broker-wide DoS via an unresettable SessionEventLoop, a Will-message authorization bypass, and a fail-open authenticator loading path - fixed in the same 0.18.1 release via PRs #957, #958 and #964; only the durable cross-session corruption is tracked as CVE-2026-95847.
Know when Moquette 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:N/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N
Network and anonymous-by-default (PR:N), but AC:H because it needs H2 durable persistence plus a colliding known victim client ID; integrity-dominant corruption (I:H), limited cross-session disclosure (C:L) and message loss (A:L).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Moquette is a lightweight Java MQTT broker. Prior to 0.18.1, H2PersistentQueue derives a session's message-map name as queue_ plus the client ID and its metadata-map name as queue_ plus the client ID plus _meta. A durable session whose client ID ends in _meta can therefore make its message map collide with another client's metadata map. The colliding sessions read and write the same H2 MVStore map with incompatible value types, which can corrupt queue head and tail data and cause message loss, misdelivery, failed queue reloads, or exposure of queued content across sessions. This issue is fixed in version 0.18.1.
Technical POC Analysis
Bug class: CWE-99, Improper Control of Resource Identifiers ("Resource Injection"), realised here as a namespace collision between two H2 MVStore maps whose names are built from an unvalidated client…
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Moquette MQTT broker versions 0.18.0 and earlier, when configured with H2 MVStore-backed durable sessions, can allow unauthenticated attackers to corrupt cross-session message queues, resulting in message loss, misdelivery, or unintended exposure of queued content. Organizations relying on Moquette for reliable messaging may face operational disruptions and data integrity issues, particularly in deployments that accept anonymous clients. While no public exploit has been identified, the high CVSS score and integrity-dominant impact warrant immediate attention.
Apply vendor patch.
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
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Moquette MQTT brokers running versions prior to 0.18.1 fail to enforce topic write ACLs on Last Will and Testament messa
Moquette MQTT brokers prior to 0.18.1 can start up with authentication and authorization silently disabled whenever a co
Remote, pre-authentication denial of service in the Moquette MQTT broker (moquette-io moquette-broker) through 0.18.0 al
Denial of service in the Moquette lightweight Java MQTT broker prior to 0.18.1: a single remote, unauthenticated MQTT cl
Unbounded per-session message queuing in Moquette MQTT Broker before 0.18.1 permits remote unauthenticated clients to ex
Remote unauthenticated clients can crash a Moquette MQTT broker running 0.18.0 or earlier by publishing or subscribing w
Unauthorized message injection in the Moquette lightweight Java MQTT broker affects all releases prior to 0.18.1: PostOf
EUVD-2026-85417
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB