CVE-2026-120730 (GCVE-0-2026-120730)

Vulnerability from cvelistv5 – Published: 2026-11-10 10:43 – Updated: 2026-11-10 10:43
VLAI
Title
Mass assignment of organization, product and deployment group IDs allows users to write into other organizations and receive their firmware
Summary
Improperly Controlled Modification of Dynamically-Determined Object Attributes vulnerability in the device API, device forms, signing key and product forms and JITP settings in nerves-hub nerves_hub_web allows an authenticated user who manages devices in any organization to write into other organizations via submitted org_id, product_id and deployment_id fields. The device API create and update actions and the dashboard device forms pass the request parameters to NervesHub.Devices.Device.changeset/2, which casts the organization, product, deployment group and update state as given. The signing key and product forms merge the session's organization into the submitted parameters so that a submitted org_id wins, and the JITP changeset accepts any product_id. Each request requires the manage role only in the user's own organization, and any account can create one. A device placed on another organization's deployment group, or moved into its product, is sent that organization's firmware with a download URL. The user cannot change or control devices that already belong to the other organization, and cannot upload firmware to it. This issue affects nerves_hub: from 1.0.0 before 2.5.3.
CWE
  • CWE-639 - Authorization Bypass Through User-Controlled Key
  • CWE-915 - Improperly Controlled Modification of Dynamically-Determined Object Attributes
Assigner
EEF CNA
Impacted products
Vendor Product Version
nerves-hub nerves_hub_web Affected: 1.0.0 , < 2.5.3 (other)
    cpe:2.3:a:nerves-hub:nerves_hub_web:*:*:*:*:*:*:*:*
Create a notification for this product.
nerves-hub nerves_hub_web Affected: 1.0.0 , < 2.5.3 (semver)
    cpe:2.3:a:nerves-hub:nerves_hub_web:*:*:*:*:*:*:*:*
Create a notification for this product.
nerves-hub nerves_hub_web Affected: f58d58233dbd355c58d3a140107ece18e8863f14 , < c367d7d17d07f843e78a70d15904665616dde964 (git)
    cpe:2.3:a:nerves-hub:nerves_hub_web:*:*:*:*:*:*:*:*
Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "collectionURL": "https://ghcr.io",
          "cpes": [
            "cpe:2.3:a:nerves-hub:nerves_hub_web:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.NervesHubWeb.API.DeviceController\u0027",
            "\u0027Elixir.NervesHub.Devices.Device\u0027",
            "\u0027Elixir.NervesHubWeb.Components.DevicePage.SettingsTab\u0027",
            "\u0027Elixir.NervesHubWeb.Live.Devices.New\u0027",
            "\u0027Elixir.NervesHubWeb.Live.Org.SigningKeys\u0027",
            "\u0027Elixir.NervesHubWeb.Live.Products.New\u0027",
            "\u0027Elixir.NervesHub.Devices.CACertificate.JITP\u0027",
            "\u0027Elixir.NervesHub.ManagedDeployments\u0027"
          ],
          "packageName": "nerves-hub/nerves-hub",
          "packageURL": "pkg:oci/nerves-hub?repository_url=ghcr.io%2Fnerves-hub",
          "product": "nerves_hub_web",
          "programFiles": [
            "lib/nerves_hub_web/controllers/api/device_controller.ex",
            "lib/nerves_hub/devices/device.ex",
            "lib/nerves_hub_web/components/device_page/settings_tab.ex",
            "lib/nerves_hub_web/live/devices/new.ex",
            "lib/nerves_hub_web/live/org/signing_keys.ex",
            "lib/nerves_hub_web/live/products/new.ex",
            "lib/nerves_hub/devices/ca_certificate/jitp.ex",
            "lib/nerves_hub/managed_deployments.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.NervesHubWeb.API.DeviceController\u0027:create/2"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.API.DeviceController\u0027:update/2"
            },
            {
              "name": "\u0027Elixir.NervesHub.Devices.Device\u0027:changeset/2"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Components.DevicePage.SettingsTab\u0027:hooked_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Live.Devices.New\u0027:handle_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Live.Org.SigningKeys\u0027:handle_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Live.Products.New\u0027:handle_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHub.Devices.CACertificate.JITP\u0027:changeset/2"
            }
          ],
          "vendor": "nerves-hub",
          "versions": [
            {
              "lessThan": "2.5.3",
              "status": "affected",
              "version": "1.0.0",
              "versionType": "other"
            }
          ]
        },
        {
          "cpes": [
            "cpe:2.3:a:nerves-hub:nerves_hub_web:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.NervesHubWeb.API.DeviceController\u0027",
            "\u0027Elixir.NervesHub.Devices.Device\u0027",
            "\u0027Elixir.NervesHubWeb.Components.DevicePage.SettingsTab\u0027",
            "\u0027Elixir.NervesHubWeb.Live.Devices.New\u0027",
            "\u0027Elixir.NervesHubWeb.Live.Org.SigningKeys\u0027",
            "\u0027Elixir.NervesHubWeb.Live.Products.New\u0027",
            "\u0027Elixir.NervesHub.Devices.CACertificate.JITP\u0027",
            "\u0027Elixir.NervesHub.ManagedDeployments\u0027"
          ],
          "packageName": "nerves_hub",
          "packageURL": "pkg:otp/nerves_hub?repository_url=https:%2F%2Fgithub.com%2Fnerves-hub%2Fnerves_hub_web\u0026vcs_url=git%20https:%2F%2Fgithub.com%2Fnerves-hub%2Fnerves_hub_web.git",
          "product": "nerves_hub_web",
          "programFiles": [
            "lib/nerves_hub_web/controllers/api/device_controller.ex",
            "lib/nerves_hub/devices/device.ex",
            "lib/nerves_hub_web/components/device_page/settings_tab.ex",
            "lib/nerves_hub_web/live/devices/new.ex",
            "lib/nerves_hub_web/live/org/signing_keys.ex",
            "lib/nerves_hub_web/live/products/new.ex",
            "lib/nerves_hub/devices/ca_certificate/jitp.ex",
            "lib/nerves_hub/managed_deployments.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.NervesHubWeb.API.DeviceController\u0027:create/2"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.API.DeviceController\u0027:update/2"
            },
            {
              "name": "\u0027Elixir.NervesHub.Devices.Device\u0027:changeset/2"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Components.DevicePage.SettingsTab\u0027:hooked_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Live.Devices.New\u0027:handle_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Live.Org.SigningKeys\u0027:handle_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Live.Products.New\u0027:handle_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHub.Devices.CACertificate.JITP\u0027:changeset/2"
            }
          ],
          "repo": "https://github.com/nerves-hub/nerves_hub_web",
          "vendor": "nerves-hub",
          "versions": [
            {
              "lessThan": "2.5.3",
              "status": "affected",
              "version": "1.0.0",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:nerves-hub:nerves_hub_web:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.NervesHubWeb.API.DeviceController\u0027",
            "\u0027Elixir.NervesHub.Devices.Device\u0027",
            "\u0027Elixir.NervesHubWeb.Components.DevicePage.SettingsTab\u0027",
            "\u0027Elixir.NervesHubWeb.Live.Devices.New\u0027",
            "\u0027Elixir.NervesHubWeb.Live.Org.SigningKeys\u0027",
            "\u0027Elixir.NervesHubWeb.Live.Products.New\u0027",
            "\u0027Elixir.NervesHub.Devices.CACertificate.JITP\u0027",
            "\u0027Elixir.NervesHub.ManagedDeployments\u0027"
          ],
          "packageName": "nerves-hub/nerves_hub_web",
          "packageURL": "pkg:github/nerves-hub/nerves_hub_web",
          "product": "nerves_hub_web",
          "programFiles": [
            "lib/nerves_hub_web/controllers/api/device_controller.ex",
            "lib/nerves_hub/devices/device.ex",
            "lib/nerves_hub_web/components/device_page/settings_tab.ex",
            "lib/nerves_hub_web/live/devices/new.ex",
            "lib/nerves_hub_web/live/org/signing_keys.ex",
            "lib/nerves_hub_web/live/products/new.ex",
            "lib/nerves_hub/devices/ca_certificate/jitp.ex",
            "lib/nerves_hub/managed_deployments.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.NervesHubWeb.API.DeviceController\u0027:create/2"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.API.DeviceController\u0027:update/2"
            },
            {
              "name": "\u0027Elixir.NervesHub.Devices.Device\u0027:changeset/2"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Components.DevicePage.SettingsTab\u0027:hooked_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Live.Devices.New\u0027:handle_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Live.Org.SigningKeys\u0027:handle_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHubWeb.Live.Products.New\u0027:handle_event/3"
            },
            {
              "name": "\u0027Elixir.NervesHub.Devices.CACertificate.JITP\u0027:changeset/2"
            }
          ],
          "repo": "https://github.com/nerves-hub/nerves_hub_web",
          "vendor": "nerves-hub",
          "versions": [
            {
              "lessThan": "c367d7d17d07f843e78a70d15904665616dde964",
              "status": "affected",
              "version": "f58d58233dbd355c58d3a140107ece18e8863f14",
              "versionType": "git"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:nerves-hub:nerves_hub_web:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "2.5.3",
                  "versionStartIncluding": "1.0.0",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "AND"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Josh Kalderimis"
        },
        {
          "lang": "en",
          "type": "reporter",
          "value": "Josh Kalderimis"
        },
        {
          "lang": "en",
          "type": "remediation developer",
          "value": "Josh Kalderimis"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Jonatan M\u00e4nnchen / EEF"
        }
      ],
      "dateAssigned": "2026-11-09T22:45:21.000Z",
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eImproperly Controlled Modification of Dynamically-Determined Object Attributes vulnerability in the device API, device forms, signing key and product forms and JITP settings in nerves-hub nerves_hub_web allows an authenticated user who manages devices in any organization to write into other organizations via submitted \u003ccode\u003eorg_id\u003c/code\u003e, \u003ccode\u003eproduct_id\u003c/code\u003e and \u003ccode\u003edeployment_id\u003c/code\u003e fields. The device API create and update actions and the dashboard device forms pass the request parameters to \u003ccode\u003eNervesHub.Devices.Device.changeset/2\u003c/code\u003e, which casts the organization, product, deployment group and update state as given. The signing key and product forms merge the session\u0027s organization into the submitted parameters so that a submitted \u003ccode\u003eorg_id\u003c/code\u003e wins, and the JITP changeset accepts any \u003ccode\u003eproduct_id\u003c/code\u003e. Each request requires the \u003ccode\u003emanage\u003c/code\u003e role only in the user\u0027s own organization, and any account can create one.\u003c/p\u003e\n\u003cp\u003eA device placed on another organization\u0027s deployment group, or moved into its product, is sent that organization\u0027s firmware with a download URL. The user cannot change or control devices that already belong to the other organization, and cannot upload firmware to it.\u003c/p\u003e\n\u003cp\u003eThis issue affects nerves_hub: from 1.0.0 before 2.5.3.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Improperly Controlled Modification of Dynamically-Determined Object Attributes vulnerability in the device API, device forms, signing key and product forms and JITP settings in nerves-hub nerves_hub_web allows an authenticated user who manages devices in any organization to write into other organizations via submitted `org_id`, `product_id` and `deployment_id` fields. The device API create and update actions and the dashboard device forms pass the request parameters to `NervesHub.Devices.Device.changeset/2`, which casts the organization, product, deployment group and update state as given. The signing key and product forms merge the session\u0027s organization into the submitted parameters so that a submitted `org_id` wins, and the JITP changeset accepts any `product_id`. Each request requires the `manage` role only in the user\u0027s own organization, and any account can create one.\n\nA device placed on another organization\u0027s deployment group, or moved into its product, is sent that organization\u0027s firmware with a download URL. The user cannot change or control devices that already belong to the other organization, and cannot upload firmware to it.\n\nThis issue affects nerves_hub: from 1.0.0 before 2.5.3."
            }
          ],
          "value": "Improperly Controlled Modification of Dynamically-Determined Object Attributes vulnerability in the device API, device forms, signing key and product forms and JITP settings in nerves-hub nerves_hub_web allows an authenticated user who manages devices in any organization to write into other organizations via submitted org_id, product_id and deployment_id fields. The device API create and update actions and the dashboard device forms pass the request parameters to NervesHub.Devices.Device.changeset/2, which casts the organization, product, deployment group and update state as given. The signing key and product forms merge the session\u0027s organization into the submitted parameters so that a submitted org_id wins, and the JITP changeset accepts any product_id. Each request requires the manage role only in the user\u0027s own organization, and any account can create one.\n\nA device placed on another organization\u0027s deployment group, or moved into its product, is sent that organization\u0027s firmware with a download URL. The user cannot change or control devices that already belong to the other organization, and cannot upload firmware to it.\n\nThis issue affects nerves_hub: from 1.0.0 before 2.5.3."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-77",
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAny user who manages devices in an organization of their own can attach their device to another organization\u0027s deployment group and receive its firmware, move devices into that organization\u0027s product, add firmware signing keys and products to it, and have a certificate authority provision devices into its product. Devices that already belong to the other organization are not controlled, and no firmware can be uploaded to it.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Any user who manages devices in an organization of their own can attach their device to another organization\u0027s deployment group and receive its firmware, move devices into that organization\u0027s product, add firmware signing keys and products to it, and have a certificate authority provision devices into its product. Devices that already belong to the other organization are not controlled, and no firmware can be uploaded to it."
                }
              ],
              "value": "Any user who manages devices in an organization of their own can attach their device to another organization\u0027s deployment group and receive its firmware, move devices into that organization\u0027s product, add firmware signing keys and products to it, and have a certificate authority provision devices into its product. Devices that already belong to the other organization are not controlled, and no firmware can be uploaded to it."
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "NONE",
            "attackVector": "NETWORK",
            "baseScore": 8.6,
            "baseSeverity": "HIGH",
            "privilegesRequired": "LOW",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
            "version": "4.0",
            "vulnAvailabilityImpact": "NONE",
            "vulnConfidentialityImpact": "HIGH",
            "vulnIntegrityImpact": "HIGH",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-639",
              "description": "CWE-639 Authorization Bypass Through User-Controlled Key",
              "lang": "en",
              "type": "CWE"
            }
          ]
        },
        {
          "descriptions": [
            {
              "cweId": "CWE-915",
              "description": "CWE-915 Improperly Controlled Modification of Dynamically-Determined Object Attributes",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-11-10T10:43:47.924Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "name": "Users can receive another organization\u2019s firmware and add devices, signing keys and products to it",
          "tags": [
            "vendor-advisory",
            "related"
          ],
          "url": "https://github.com/nerves-hub/nerves_hub_web/security/advisories/GHSA-rpp7-x9hm-jrmr"
        },
        {
          "name": "EEF CNA record for CVE-2026-120730",
          "tags": [
            "related"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-120730.html"
        },
        {
          "name": "OSV record EEF-CVE-2026-120730",
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-120730"
        },
        {
          "name": "Introducing commit f58d582 in nerves-hub/nerves_hub_web",
          "tags": [
            "related"
          ],
          "url": "https://github.com/nerves-hub/nerves_hub_web/commit/f58d58233dbd355c58d3a140107ece18e8863f14"
        },
        {
          "name": "Fix commit c367d7d in nerves-hub/nerves_hub_web",
          "tags": [
            "patch"
          ],
          "url": "https://github.com/nerves-hub/nerves_hub_web/commit/c367d7d17d07f843e78a70d15904665616dde964"
        }
      ],
      "solutions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eThe fixed release\u0027s migration takes every device off a deployment group that belongs to a different product and logs each one. Upgrading undoes nothing else done this way. After upgrading, check the database for devices whose organization does not own their product, for signing keys in \u003ccode\u003eorg_keys\u003c/code\u003e whose \u003ccode\u003ecreated_by_id\u003c/code\u003e has never been a member of the key\u0027s organization, and for certificate authorities whose JITP product belongs to another organization, and remove what you do not recognize. A device moved wholly into another organization, and a product added to one, leave nothing that sets them apart, so review your organization\u0027s devices and products as well.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "The fixed release\u0027s migration takes every device off a deployment group that belongs to a different product and logs each one. Upgrading undoes nothing else done this way. After upgrading, check the database for devices whose organization does not own their product, for signing keys in `org_keys` whose `created_by_id` has never been a member of the key\u0027s organization, and for certificate authorities whose JITP product belongs to another organization, and remove what you do not recognize. A device moved wholly into another organization, and a product added to one, leave nothing that sets them apart, so review your organization\u0027s devices and products as well."
            }
          ],
          "value": "The fixed release\u0027s migration takes every device off a deployment group that belongs to a different product and logs each one. Upgrading undoes nothing else done this way. After upgrading, check the database for devices whose organization does not own their product, for signing keys in org_keys whose created_by_id has never been a member of the key\u0027s organization, and for certificate authorities whose JITP product belongs to another organization, and remove what you do not recognize. A device moved wholly into another organization, and a product added to one, leave nothing that sets them apart, so review your organization\u0027s devices and products as well."
        }
      ],
      "source": {
        "discovery": "UNKNOWN"
      },
      "title": "Mass assignment of organization, product and deployment group IDs allows users to write into other organizations and receive their firmware",
      "x_proofOfConcept": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eAs an admin of organization A, with organization B having an active deployment group whose current release is firmware B:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003ePOST /api/orgs/\u0026lt;A\u0026gt;/products/\u0026lt;A\u0027s product\u0026gt;/devices\u003c/code\u003e with \u003ccode\u003e{\"identifier\": \"planted\", \"deployment_id\": \u0026lt;B\u0027s deployment group ID\u0026gt;}\u003c/code\u003e. The device is created in A, on B\u0027s deployment group.\u003c/li\u003e\n\u003cli\u003eCreate a device key for it, then connect it, reporting the platform and architecture of firmware B. When the deployment runs, the device is sent an update for firmware B with its download URL.\u003c/li\u003e\n\u003cli\u003eTo move a device instead, \u003ccode\u003ePUT /api/orgs/\u0026lt;A\u0026gt;/products/\u0026lt;A\u0027s product\u0026gt;/devices/\u0026lt;identifier\u0026gt;\u003c/code\u003e with \u003ccode\u003e{\"org_id\": \u0026lt;B\u0027s ID\u0026gt;, \"product_id\": \u0026lt;B\u0027s product ID\u0026gt;}\u003c/code\u003e. The response is \u003ccode\u003e201\u003c/code\u003e, and the device is now in B\u0027s product.\u003c/li\u003e\n\u003c/ol\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "As an admin of organization A, with organization B having an active deployment group whose current release is firmware B:\n\n1. `POST /api/orgs/\u003cA\u003e/products/\u003cA\u0027s product\u003e/devices` with `{\"identifier\": \"planted\", \"deployment_id\": \u003cB\u0027s deployment group ID\u003e}`. The device is created in A, on B\u0027s deployment group.\n2. Create a device key for it, then connect it, reporting the platform and architecture of firmware B. When the deployment runs, the device is sent an update for firmware B with its download URL.\n3. To move a device instead, `PUT /api/orgs/\u003cA\u003e/products/\u003cA\u0027s product\u003e/devices/\u003cidentifier\u003e` with `{\"org_id\": \u003cB\u0027s ID\u003e, \"product_id\": \u003cB\u0027s product ID\u003e}`. The response is `201`, and the device is now in B\u0027s product."
            }
          ],
          "value": "As an admin of organization A, with organization B having an active deployment group whose current release is firmware B:\n\n* POST /api/orgs/\u003cA\u003e/products/\u003cA\u0027s product\u003e/devices with {\"identifier\": \"planted\", \"deployment_id\": \u003cB\u0027s deployment group ID\u003e}. The device is created in A, on B\u0027s deployment group.\n* Create a device key for it, then connect it, reporting the platform and architecture of firmware B. When the deployment runs, the device is sent an update for firmware B with its download URL.\n* To move a device instead, PUT /api/orgs/\u003cA\u003e/products/\u003cA\u0027s product\u003e/devices/\u003cidentifier\u003e with {\"org_id\": \u003cB\u0027s ID\u003e, \"product_id\": \u003cB\u0027s product ID\u003e}. The response is 201, and the device is now in B\u0027s product."
        }
      ],
      "x_technicalAnalysis": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003e\u003cstrong\u003e1. Device API and device forms.\u003c/strong\u003e \u003ccode\u003eNervesHubWeb.API.DeviceController.create/2\u003c/code\u003e sets \u003ccode\u003eorg_id\u003c/code\u003e and \u003ccode\u003eproduct_id\u003c/code\u003e from the route, then hands the rest of the request to \u003ccode\u003eDevice.changeset/2\u003c/code\u003e; \u003ccode\u003eupdate/2\u003c/code\u003e hands the whole request over. The changeset casts \u003ccode\u003eorg_id\u003c/code\u003e, \u003ccode\u003eproduct_id\u003c/code\u003e, \u003ccode\u003edeployment_id\u003c/code\u003e, \u003ccode\u003edeleted_at\u003c/code\u003e and the server-managed update state, so an update can move the device into another organization\u0027s product and either request can place it on another organization\u0027s deployment group. The device settings form in \u003ccode\u003eNervesHubWeb.Components.DevicePage.SettingsTab\u003c/code\u003e and the new device form in \u003ccode\u003eNervesHubWeb.Live.Devices.New\u003c/code\u003e reach the same changeset with the same effect.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. Signing key and product forms.\u003c/strong\u003e \u003ccode\u003eNervesHubWeb.Live.Org.SigningKeys\u003c/code\u003e and \u003ccode\u003eNervesHubWeb.Live.Products.New\u003c/code\u003e build their parameters with \u003ccode\u003eEnum.into(submitted, %{\"org_id\" =\u0026gt; session_org_id})\u003c/code\u003e, so a submitted \u003ccode\u003eorg_id\u003c/code\u003e overrides the session\u0027s, and the key or product is created in the organization named by the client.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. JITP settings.\u003c/strong\u003e \u003ccode\u003eNervesHub.Devices.CACertificate.JITP.changeset/2\u003c/code\u003e casts any \u003ccode\u003eproduct_id\u003c/code\u003e, through the API and the dashboard, so devices the certificate authority provisions are created in another organization\u0027s product.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4. Firmware delivery.\u003c/strong\u003e When a planted device connects, \u003ccode\u003eNervesHub.ManagedDeployments\u003c/code\u003e checks its deployment group membership by firmware version, platform and architecture only, all reported by the device, so it stays on the foreign group and is sent that group\u0027s current release with a download URL.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "**1. Device API and device forms.** `NervesHubWeb.API.DeviceController.create/2` sets `org_id` and `product_id` from the route, then hands the rest of the request to `Device.changeset/2`; `update/2` hands the whole request over. The changeset casts `org_id`, `product_id`, `deployment_id`, `deleted_at` and the server-managed update state, so an update can move the device into another organization\u0027s product and either request can place it on another organization\u0027s deployment group. The device settings form in `NervesHubWeb.Components.DevicePage.SettingsTab` and the new device form in `NervesHubWeb.Live.Devices.New` reach the same changeset with the same effect.\n\n**2. Signing key and product forms.** `NervesHubWeb.Live.Org.SigningKeys` and `NervesHubWeb.Live.Products.New` build their parameters with `Enum.into(submitted, %{\"org_id\" =\u003e session_org_id})`, so a submitted `org_id` overrides the session\u0027s, and the key or product is created in the organization named by the client.\n\n**3. JITP settings.** `NervesHub.Devices.CACertificate.JITP.changeset/2` casts any `product_id`, through the API and the dashboard, so devices the certificate authority provisions are created in another organization\u0027s product.\n\n**4. Firmware delivery.** When a planted device connects, `NervesHub.ManagedDeployments` checks its deployment group membership by firmware version, platform and architecture only, all reported by the device, so it stays on the foreign group and is sent that group\u0027s current release with a download URL."
            }
          ],
          "value": "1. Device API and device forms. NervesHubWeb.API.DeviceController.create/2 sets org_id and product_id from the route, then hands the rest of the request to Device.changeset/2; update/2 hands the whole request over. The changeset casts org_id, product_id, deployment_id, deleted_at and the server-managed update state, so an update can move the device into another organization\u0027s product and either request can place it on another organization\u0027s deployment group. The device settings form in NervesHubWeb.Components.DevicePage.SettingsTab and the new device form in NervesHubWeb.Live.Devices.New reach the same changeset with the same effect.\n\n2. Signing key and product forms. NervesHubWeb.Live.Org.SigningKeys and NervesHubWeb.Live.Products.New build their parameters with Enum.into(submitted, %{\"org_id\" =\u003e session_org_id}), so a submitted org_id overrides the session\u0027s, and the key or product is created in the organization named by the client.\n\n3. JITP settings. NervesHub.Devices.CACertificate.JITP.changeset/2 casts any product_id, through the API and the dashboard, so devices the certificate authority provisions are created in another organization\u0027s product.\n\n4. Firmware delivery. When a planted device connects, NervesHub.ManagedDeployments checks its deployment group membership by firmware version, platform and architecture only, all reported by the device, so it stays on the foreign group and is sent that group\u0027s current release with a download URL."
        }
      ]
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-120730",
    "datePublished": "2026-11-10T10:43:47.924Z",
    "dateReserved": "2026-11-03T03:45:01.695Z",
    "dateUpdated": "2026-11-10T10:43:47.924Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline

Sightings and recorded dates, grouped by day · UTC

JSON
Events included in the timeline

Loading timeline…


    Loading…

    Loading…

    Loading…

    Related by attack behaviour

    Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.