Skip to main content

Moquette MQTT Broker CVE-2026-95847

| EUVDEUVD-2026-85417 HIGH
Improper Control of Resource Identifiers ('Resource Injection') (CWE-99)
2026-09-23 GitHub_M
8.8
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Connect anonymously to broker
  2. Delivery
    Set durable session client ID '<victim>_meta'
  3. Exploit
    Collide message map with victim metadata map
  4. Execution
    Corrupt shared H2 MVStore head/tail
  5. Impact
    Read/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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.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 – 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

moquette < 0.18.1

Affected Packages

maven io.moquette:moquette-broker fix: 0.18.1
euvd moquette fix: 0.18.1

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

Vendor (GitHub_M) PRIMARY 8.8 HIGH
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
vuln.today AI 7.0 HIGH

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).

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

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

Lifecycle Timeline

2
Patch available
Sep 23, 2026 - 18:17 EUVD
CVE Published
Sep 23, 2026 - 16:29 cve.org
HIGH 8.8

DescriptionCVE.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

Why It Matters

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.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.4%
Top 68% exploitable
Prevalence
Low
niche open-source lightweight Java MQTT broker, limited enterprise footprint
Data Quality
6 sources
Confidence: High

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 HIGH
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.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
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Partial

Priority Score

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

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

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