EEF-CVE-2026-120730: Mass assignment of organization, product and deployment group IDs allows users to write into other organizations and receive their firmware

Published Nov 10, 2026
·
Updated

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 nerveshubweb allows an authenticated user who manages devices in any organization to write into other organizations via submitted orgid, productid and deploymentid 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 orgid wins, and the JITP changeset accepts any productid. 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 nerveshub: from 1.0.0 before 2.5.3.

Details

1. Device API and device forms. NervesHubWeb.API.DeviceController.create/2 sets orgid and productid from the route, then hands the rest of the request to Device.changeset/2; update/2 hands the whole request over. The changeset casts orgid, productid, deploymentid, deletedat and the server-managed update state, so an update can move the device into another organization's product and either request can place it on another organization's 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.

2. Signing key and product forms. NervesHubWeb.Live.Org.SigningKeys and NervesHubWeb.Live.Products.New build their parameters with Enum.into(submitted, %{"orgid" => sessionorgid}), so a submitted orgid overrides the session's, and the key or product is created in the organization named by the client.

3. JITP settings. NervesHub.Devices.CACertificate.JITP.changeset/2 casts any productid, through the API and the dashboard, so devices the certificate authority provisions are created in another organization's product.

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's current release with a download URL.

Proof of concept

As an admin of organization A, with organization B having an active deployment group whose current release is firmware B:

1. POST /api/orgs/<A>/products/<A's product>/devices with {"identifier": "planted", "deploymentid": <B's deployment group ID>}. The device is created in A, on B's deployment group. 2. 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. 3. To move a device instead, PUT /api/orgs/<A>/products/<A's product>/devices/<identifier> with {"orgid": <B's ID>, "productid": <B's product ID>}. The response is 201, and the device is now in B's product.

Impact

Any user who manages devices in an organization of their own can attach their device to another organization's deployment group and receive its firmware, move devices into that organization's 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.

Solutions

The fixed release's 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 orgkeys whose createdbyid has never been a member of the key's 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's devices and products as well.

Affected Software

1 affected component
hex/nerves_hub>=1.0.0<2.5.3

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade nerves_hub to a version that resolves this vulnerability.

    Fixed in 2.5.3
  2. Operational

    After upgrading, review the database for devices whose organization does not own their product, signing keys in org_keys whose created_by_id has never been a member of the key's organization, and certificate authorities whose JITP product belongs to another organization; remove anything unrecognized.

Event History

Nov 10, 2026
CVE Published
via OSV·10:43 AM
Data Sourced
via OSV·10:43 AM
DescriptionSeverityWeakness

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203