GHSA-c7jf-qcx9-xxf8: Improper session invalidation keeps removed or demoted members' open pages and device consoles working at their old role
Summary
Improper Session Invalidation vulnerability in the dashboard pages, device console and local shell channels in nerves-hub nerveshubweb allows an organization member who is removed or given a lower role to keep acting at their old role through anything they had open at the time. The dashboard reads the member's role once when a page mounts, in the assignorgtoscope hook of NervesHubWeb.Auth, and the console, local shell and device event stream channels check membership once at join. Removing a member or changing their role tells none of them, so open pages keep carrying out actions and open consoles keep running commands on the device until the page reloads or the socket disconnects.
The dashboard also opens consoles over NervesHubWeb.UserSocket with a token that holds only the user's id, is accepted for 24 hours, and is not revoked by signing out, which disconnects only the session's LiveViews. Whoever holds a token taken from a page can open consoles as that user, within the user's current membership, until it expires.
This issue affects nerveshub: from 1.0.0 before 2.5.3.
Proof of concept
1. In an organization, A is an admin and B has the manage role. B opens a device's page and its Console tab. 2. A removes B from the organization on the organization's Users page, or lowers B's role to view. 3. Without reloading, B's open page still carries out actions and B's console still accepts input, until B reloads the page or the socket disconnects. 4. For the socket token: while signed in, copy the data-user-token attribute of the #console element, sign out, and within 24 hours connect a Phoenix socket client to /socket/websocket with that token. Joining user:console:identifier-<device identifier> succeeds.
Impact
A member who is removed from an organization or given a lower role keeps their old access through whatever they had open at the time, including device consoles and local shells that run commands on the device, until the page reloads or the socket disconnects. Anyone holding the dashboard's socket token taken from a page can open consoles as that user, within that user's current permissions, for up to 24 hours after they sign out.
Workarounds
After removing a member or lowering their role, restart the web nodes. That closes every open page and console, and each one is checked again when it reconnects. A socket token cannot be revoked before it expires short of changing SECRETKEYBASE, which signs everyone out.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
nerves_hubto a version that resolves this vulnerability.Fixed in 2.5.3 - Operational
After removing a member or lowering their role, restart the web nodes to close open pages and consoles and force membership checks on reconnect.
- Operational
Change SECRET_KEY_BASE to revoke socket tokens; this signs everyone out.
Event History
Frequently Asked Questions
Which versions are affected?
The issue affects nerves_hub versions from 1.0.0 before 2.5.3.
What access does an attacker need to retain elevated capabilities?
The attacker must already be an organization member with an open dashboard page, device console, local shell, or device event-stream connection established while they still had the higher role. Removal or role reduction is not rechecked on those existing connections.
When does access through an already open page or console stop?
Stale dashboard privileges persist until the page reloads, and channel access persists until the socket disconnects. Open consoles can continue running commands on the device during that time.
Does signing out revoke console authentication tokens?
No. Signing out disconnects only the session's LiveViews; it does not revoke the UserSocket token used for consoles, which is accepted for 24 hours.
What is the impact if a UserSocket token is obtained from a page?
A holder of that token can open consoles as the associated user until the token expires. The console access is limited by that user's current organization membership.