Skip to main content

Moquette MQTT Broker EUVDEUVD-2026-85411

| CVE-2026-85724 CRITICAL
Improper Neutralization of Wildcards or Matching Symbols (CWE-155)
2026-09-23 https://github.com/moquette-io/moquette GHSA-5f42-97gr-vfhq
9.6
CVSS 3.1 · Vendor: https://github.com/moquette-io/moquette
View

Attack ChainAIDerived

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

  1. Access
    Connect as anonymous/low-priv MQTT client
  2. Delivery
    Send CONNECT with wildcard clientId (e.g. +)
  3. Exploit
    Wildcard substituted raw into pattern ACL
  4. Execution
    ACL match grants cross-tenant scope
  5. Persist
    Subscribe/publish to other tenants' topics
  6. Impact
    Cross-tenant eavesdropping and injection

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Wildcard neutralization
Exploitation Conditions

The critical cross-tenant ACL bypass requires that the broker be configured with pattern-based ACL rules using %c (clientId) or %u (username) substitution - without such rules this vector does not apply. moquette accepts anonymous clients by default, so the DoS components (malformed $share/grp SUBSCRIBE → StringIndexOutOfBoundsException, deeply nested topics → StackOverflowError, ACL NPE, unbounded subscription/retained/interceptor state → OOM) and the Will-message authorization bypass are reachable pre-authentication with no special configuration. The fail-open behavior additionally triggers only if a custom authenticator/authorizator class fails to load. Limiting factors: the highest-impact (cross-tenant C:H/I:H) outcome is gated on a multi-tenant pattern-ACL configuration; single-tenant or non-pattern-ACL deployments are exposed mainly to DoS and Will-topic authz bypass. Fixed in version 0.18.1.

Impact

The CVSS vector (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N, base 9.6) reflects the headline issue - a pattern-ACL wildcard-injection that yields cross-tenant read AND write (S:C, C:H, I:H). Real-world risk is materially shaped by preconditions the raw score hides: the critical ACL bypass only applies when pattern-based ACL rules with %c/%u substitution are configured (a common but not universal multi-tenant setup), while the DoS cluster (SessionEventLoop catching only InterruptedException, malformed $share SUBSCRIBE, CTrie StackOverflow, unbounded state → OOM) is trivially reachable pre-authentication because moquette accepts anonymous clients by default. Note the vendor set A:N even though the advisory explicitly documents whole-broker denial of service (A:H in reality) - this is an internal inconsistency: the score captures the confidentiality/integrity bracket but understates availability. No EPSS score, no CISA KEV entry, and no SSVC decision data are provided, so exploitation-probability signals are absent; however, source-level proof-of-concept code (PoCPatternAcl, PoCSharedSubCrash, PoCMapCollision) is published in the GHSA advisory, and a fix (0.18.1) is available. This is a genuine priority for anyone running moquette as a shared/multi-tenant broker, but the ACL-bypass severity is gated on configuration; single-tenant deployments face primarily the unauthenticated DoS surface. Author explicitly states no RCE was found - the ceiling is authz bypass + DoS + cross-session integrity.

Exploit ScenarioDerived

In a multi-tenant moquette deployment using pattern ACLs (e.g. sensor/%c/#), an attacker connects with a clientId containing an MQTT wildcard such as +, which is substituted raw into the ACL rule and matched, granting cross-tenant read and write to other tenants' topics. Alternatively, any anonymous client sends a malformed $share/grp SUBSCRIBE or a deeply nested topic to throw an uncaught exception on the never-restarted SessionEventLoop, wedging every co-located session and crashing the broker. Source-only proof-of-concept code for both the ACL bypass and the DoS is published in the GitHub advisory.

Act Now Prioritize within 24-48h. Why: CRITICAL severity + public POC available.
1 public PoC Patch available 0.3% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Sep 23, 2026

Cross-tenant authorization bypass combined with pre-authentication denial of service in Moquette Broker 0.18.0 and earlier lets unauthenticated remote MQTT clients read and write other tenants' topics and repeatedly wedge or exhaust the broker. The critical flaw is wildcard injection through pattern-based ACLs that substitute %c/%u with an unvalidated clientId, so a client connecting with clientId '+' turns a rule such as sensor/%c/

into the filter sensor/+/#; from the same unauthenticated position an attacker can also trigger a $share/grp SUBSCRIBE StringIndexOutOfBoundsException, a StackOverflowError on deeply nested topics, an ACL NPE, unauthorized Will-message publishes, and unbounded subscription/retained/interceptor state that causes memory or disk exhaustion. Publicly available exploit code exists in the form of source-only PoCs (JDK 17) for the pattern-ACL bypass, the shared-subscription crash, and the H2 metadata collision; the vendor-released fix is 0.18.1, and no CISA KEV entry or confirmed in-the-wild exploitation was provided. Score of 9.6 reflects scope change with high confidentiality and integrity impact, gated on a multi-tenant pattern-ACL configuration for the worst outcome.

RemediationAI

Vendor-released patch: 0.18.1 - upgrade io.moquette:moquette-broker to 0.18.1 (release tag v0.18.1, see https://github.com/moquette-io/moquette/releases/tag/v0.18.1), which incorporates the fixes in PRs 957 (SessionEventLoop now catches Throwable so a failing command no longer kills the shared loop), 958, and 959 and the associated commits (14a2f4fd, 26498631, 72d6c825, 86feb7c3, affdc71f, b4a98bb3, c65b3e90, ca17e0be, d7775354, f5a323fe), with full details in the advisory https://github.com/moquette-io/moquette/security/advisories/GHSA-5f42-97gr-vfhq. If an immediate upgrade is impossible, apply the following compensating controls in order of value: reject any CONNECT whose clientId or username contains '+'/'#' (strongest single control - it kills the pattern-ACL wildcard injection and the clientId-'#' ACL NPE, at the cost of breaking clients that legitimately use those characters in their identifiers); eliminate or rewrite pattern ACLs that interpolate %c/%u into topics that are then wildcard-matched, or convert them to exact-match rules (removes the cross-tenant read/write vector but requires per-client ACL maintenance); disable anonymous access and require authentication, which removes pre-authentication reachability of the $share/grp crash, nested-topic StackOverflow, and unbounded-state OOM paths (may break unauthenticated IoT fleets); add a broker-side filter validator rejecting malformed $share/grp and over-deep topic trees at the front door; enforce resource caps on subscriptions, retained messages, in-flight windows, topic aliases, and the broker interceptor queue together with bounded session expiry (prevents OOM/disk exhaustion but caps legitimate high-fan-out clients); and, for deployments using H2 durable storage, isolate or escape the queue_<clientId> namespace so metadata maps cannot collide (note this requires a code change - the vendor fix is the reliable path). Do not rely on network segmentation alone, since the broker port itself is the attack surface; monitor for CONNECT attempts containing MQTT wildcard characters and for repeated broker session-loop stalls as detection signals for exploitation attempts.

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 Java (memory-safe JVM) MQTT 3.1.1/5 broker distributed as the Maven artifact pkg:maven/io.moquette:moquette-broker; because it accepts anonymous clients by default, every byte arriving on the wire - including pre-authentication CONNECT and SUBSCRIBE packets - is untrusted. In AuthorizationsCollector.canDoOperation (AuthorizationsCollector.java:116-131, line 123) the broker builds the rule topic via auth.topic.toString().replace("%c", client).replace("%u", username) and then calls topic.match(substitutedTopic); the clientId is never validated for MQTT wildcard metacharacters '+' and '#' at MQTTConnection.processConnect, so the substitution semantics are inverted - attacker-controlled wildcards expand the rule instead of being expanded by it. The root cause class is improper neutralization of special elements in an authorization decision (ACL wildcard injection leading to authz bypass), compounded by uncaught-exception handling defects: SessionEventLoop (SessionEventLoop.java:40-54) catches only InterruptedException and is never restarted by SessionEventLoopGroup, so any Throwable on that shared loop permanently wedges every co-located session. Reachable throwables include SharedSubscriptionUtils.extractShareName on a malformed $share/grp filter, recursive CTrie descent on deeply nested topics, and a null-token NPE in Topic.match (Topic.java:173) when clientId '#' produces an invalid filter such as sensor/#/#. Additional root causes include missing canWrite/reserved-topic checks on Last-Will publication in PostOffice.publishWill, H2PersistentQueue namespace collisions from unescaped queue_"+clientId and queue_"+clientId+"_meta keys (client id 'sensor_meta' aliasing a victim's metadata map and corrupting head/tail), an unbounded BrokerInterceptor queue, and fail-open behavior in Server.java:483-531 where a custom authenticator/authorizator class that fails to load degrades to PermitAll/AcceptAll. No CWE identifier was supplied in the source data; the analyst characterization above maps the issues to authorization-bypass, uncaught-exception/DoS, and integrity-corruption classes. The author explicitly states no RCE was found and none is claimed: the impact ceiling on this JVM is authorization/ACL bypass, denial of service, and cross-session integrity.

Know when Java 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 (https://github.com/moquette-io/moquette) PRIMARY 9.6 CRITICAL
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N
vuln.today AI 10.0 CRITICAL

Anonymous-by-default access justifies PR:N; cross-tenant reach gives S:C with C:H/I:H, and the documented pre-auth whole-broker crash warrants A:H (vendor's A:N understates it).

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

Primary rating from Vendor (https://github.com/moquette-io/moquette).

CVSS VectorVendor: https://github.com/moquette-io/moquette

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Confidentiality
High
Integrity
High
Availability
None

DescriptionCVE.org

moquette is reachable by untrusted MQTT clients (anonymous by default), so every byte from any client, including pre-authentication, is untrusted. This is a memory-safe JVM: the ceiling is authorization/ACL bypass + denial of service + cross-session integrity, not RCE (I did not find one and do not claim one). Audited at commit da7f719a6bab9829d520b5838e13ea7b1f9be3ef, module broker/.

What a connecting client can do

  1. (Critical) Bypass pattern-based ACLs across tenants. In AuthorizationsCollector.canDoOperation (AuthorizationsCollector.java:116-131, esp. line 123) the clientId/username is substituted raw into a pattern ACL rule and then wildcard-matched, and the clientId is never validated for MQTT wildcard characters +/

at CONNECT (MQTTConnection.processConnect):

Topic substitutedTopic = new Topic(auth.topic.toString().replace("%c", client).replace("%u", username)); if (topic.match(substitutedTopic)) return true;

A client that connects with clientId + turns sensor/%c/

into the filter sensor/+/#, gaining cross-tenant read AND write. (Precondition: pattern ACL rules configured - a common multi-tenant setup.)

  1. (High) Crash the whole broker. SessionEventLoop (SessionEventLoop.java:40-54) catches only InterruptedException and is never restarted (SessionEventLoopGroup), so any uncaught exception on it wedges every co-located client. Trivially reachable inputs: malformed $share/grp SUBSCRIBE (SharedSubscriptionUtils.extractShareName -> StringIndexOutOfBoundsException), deeply nested topic (CTrie recursion -> StackOverflowError), and ACL NPE below. Unbounded subscriptions / retained / in-flight / topic-alias / interceptor state (BrokerInterceptor uses an unbounded queue) also allow OOM; durable stores allow disk exhaustion.
  2. (High) NPE in ACL sink on clientId

(invalid filter sensor/#/

-> null tokens -> Topic.match NPE at Topic.java:173).

  1. (High) Will-message authorization bypass. Last-Will topic is published (PostOffice.publishWill) without canWrite/reserved-topic checks used for normal PUBLISH.
  2. (Medium) Cross-session durable corruption. H2PersistentQueue opens queue_"+clientId and queue_"+clientId+"_meta; client id sensor_meta collides with victim sensor metadata map -> corrupts head/tail.
  3. (Medium) Fail-open if authenticator/authorizator class fails to load -> PermitAll/AcceptAll (Server.java:483-531).

Proof of concept

Source-only, no network; PoCs run on JDK 17:

  • PoCPatternAcl - clientId + gains cross-tenant read/write; clientId

triggers NPE

  • PoCSharedSubCrash - extractShareName("$share/grp") throws StringIndexOutOfBoundsException
  • PoCMapCollision - H2 MVStore collision overwrites victim metadata pointer

Impact

Cross-tenant eavesdropping and injection, whole-broker DoS, unauthorized Will publishes, and cross-session durable corruption.

Remediation

  1. Reject clientId/username containing +/

(and / if structural) at CONNECT; expand %c/%u as literal tokens.

  1. Harden SessionEventLoop (catch Throwable + restart supervision) and validate $share filters.
  2. Apply authorization to Will publishes like normal PUBLISH.
  3. Add resource caps (connections, queues, retained, aliases, interceptor queue) + bounded session expiry.
  4. Separate H2 namespaces and fail closed on auth-class load failure.

Technical POC Analysis

CWE-155, Improper Neutralization of Wildcards or Matching Symbols.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Latest POC

1 public PoC link from github

Sign in to open the public PoC links collected for this CVE.

Executive ViewAI

Why It Matters

Moquette Broker 0.18.0 and earlier - the MQTT backbone for tenant-facing messaging in affected deployments - allows a single remote client to cross tenant boundaries, reading and writing other tenants' topics while repeatedly degrading or exhausting the broker itself. Because publicly available exploit code exists, the gap between disclosure and attempted abuse is short, and the blast radius spans every tenant on a shared broker rather than an isolated account, making customer data confidentiality and service availability the primary business exposures. Leadership should treat this as a near-term remediation priority anywhere a multi-tenant Moquette broker is reachable by external or lower-trust clients.

Business Impact: Severe
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.3%
Top 84% exploitable
Prevalence
Low
niche open-source Java MQTT broker, limited enterprise footprint
Threat Intel
1
1 source
Social Media
2
Sightings
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 CRITICAL
CISA KEV No
Public POC Yes
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity + public POC available
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
No
Human Impact
Very High
Technical Impact
Total

Priority Score

68
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +48
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.

More in Java

View all
CVE-2012-4681 CRITICAL POC
9.8 Aug 28

Oracle Java SE 7 Update 6 and earlier contains multiple sandbox bypass vulnerabilities via the ClassFinder and forName m

CVE-2015-7450 CRITICAL POC
9.8 Jan 02

Remote code execution in IBM Sterling B2B Integrator, Sterling Integrator, and Tivoli Common Reporting allows unauthenti

CVE-2013-2465 CRITICAL POC
9.8 Jun 18

Java Runtime Environment sandbox bypass via incorrect image channel verification in 2D component allows remote unauthent

CVE-2011-3544 CRITICAL POC
9.8 Oct 19

Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug

CVE-2010-1871 HIGH POC
8.8 Aug 05

JBoss Seam 2 in Red Hat JBoss EAP 4.3.0 fails to sanitize JBoss Expression Language inputs, allowing remote attackers to

CVE-2012-1723 CRITICAL POC
9.8 Jun 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 update 4 and earlier, 6 up

CVE-2013-0422 CRITICAL POC
9.8 Jan 10

Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using

CVE-2012-0507 CRITICAL POC
9.8 Jun 07

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 2 and earlier, 6 Up

CVE-2015-4852 CRITICAL POC
9.8 Nov 18

The WLS Security component in Oracle WebLogic Server 10.3.6.0, 12.1.2.0, 12.1.3.0, and 12.2.1.0 allows remote attackers

CVE-2012-5076 CRITICAL POC
9.8 Oct 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 7 and earlier allow

CVE-2017-3066 CRITICAL POC
9.8 Apr 27

Remote unauthenticated attackers can execute arbitrary code on Adobe ColdFusion servers through Java deserialization fla

CVE-2012-0391 CRITICAL POC
9.8 Jan 08

The ExceptionDelegator component in Apache Struts before 2.2.3.1 interprets parameter values as OGNL expressions during

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