mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
User Can Read Token Material for Other Users When Creating Token #7320
Closed
opened 2025-12-29 20:21:42 +01:00 by adam
·
10 comments
No Branch/Tag Specified
main
update-changelog-comments-docs
feature-removal-issue-type
20911-dropdown
20239-plugin-menu-classes-mutable-state
21097-graphql-id-lookups
feature
fix_module_substitution
20923-dcim-templates
20044-elevation-stuck-lightmode
feature-ip-prefix-link
v4.5-beta1-release
20068-import-moduletype-attrs
20766-fix-german-translation-code-literals
20378-del-script
7604-filter-modifiers-v3
circuit-swap
12318-case-insensitive-uniqueness
20637-improve-device-q-filter
20660-script-load
19724-graphql
20614-update-ruff
14884-script
02496-max-page
19720-macaddress-interface-generic-relation
19408-circuit-terminations-export-templates
20203-openapi-check
fix-19669-api-image-download
7604-filter-modifiers
19275-fixes-interface-bulk-edit
fix-17794-get_field_value_return_list
11507-show-aggregate-and-rir-on-api
9583-add_column_specific_search_field_to_tables
v4.5.0
v4.4.10
v4.4.9
v4.5.0-beta1
v4.4.8
v4.4.7
v4.4.6
v4.4.5
v4.4.4
v4.4.3
v4.4.2
v4.4.1
v4.4.0
v4.3.7
v4.4.0-beta1
v4.3.6
v4.3.5
v4.3.4
v4.3.3
v4.3.2
v4.3.1
v4.3.0
v4.2.9
v4.3.0-beta2
v4.2.8
v4.3.0-beta1
v4.2.7
v4.2.6
v4.2.5
v4.2.4
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.11
v4.1.10
v4.1.9
v4.1.8
v4.2-beta1
v4.1.7
v4.1.6
v4.1.5
v4.1.4
v4.1.3
v4.1.2
v4.1.1
v4.1.0
v4.0.11
v4.0.10
v4.0.9
v4.1-beta1
v4.0.8
v4.0.7
v4.0.6
v4.0.5
v4.0.3
v4.0.2
v4.0.1
v4.0.0
v3.7.8
v3.7.7
v4.0-beta2
v3.7.6
v3.7.5
v4.0-beta1
v3.7.4
v3.7.3
v3.7.2
v3.7.1
v3.7.0
v3.6.9
v3.6.8
v3.6.7
v3.7-beta1
v3.6.6
v3.6.5
v3.6.4
v3.6.3
v3.6.2
v3.6.1
v3.6.0
v3.5.9
v3.6-beta2
v3.5.8
v3.6-beta1
v3.5.7
v3.5.6
v3.5.5
v3.5.4
v3.5.3
v3.5.2
v3.5.1
v3.5.0
v3.4.10
v3.4.9
v3.5-beta2
v3.4.8
v3.5-beta1
v3.4.7
v3.4.6
v3.4.5
v3.4.4
v3.4.3
v3.4.2
v3.4.1
v3.4.0
v3.3.10
v3.3.9
v3.4-beta1
v3.3.8
v3.3.7
v3.3.6
v3.3.5
v3.3.4
v3.3.3
v3.3.2
v3.3.1
v3.3.0
v3.2.9
v3.2.8
v3.3-beta2
v3.2.7
v3.3-beta1
v3.2.6
v3.2.5
v3.2.4
v3.2.3
v3.2.2
v3.2.1
v3.2.0
v3.1.11
v3.1.10
v3.2-beta2
v3.1.9
v3.2-beta1
v3.1.8
v3.1.7
v3.1.6
v3.1.5
v3.1.4
v3.1.3
v3.1.2
v3.1.1
v3.1.0
v3.0.12
v3.0.11
v3.0.10
v3.1-beta1
v3.0.9
v3.0.8
v3.0.7
v3.0.6
v3.0.5
v3.0.4
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v2.11.12
v3.0-beta2
v2.11.11
v2.11.10
v3.0-beta1
v2.11.9
v2.11.8
v2.11.7
v2.11.6
v2.11.5
v2.11.4
v2.11.3
v2.11.2
v2.11.1
v2.11.0
v2.10.10
v2.10.9
v2.11-beta1
v2.10.8
v2.10.7
v2.10.6
v2.10.5
v2.10.4
v2.10.3
v2.10.2
v2.10.1
v2.10.0
v2.9.11
v2.10-beta2
v2.9.10
v2.10-beta1
v2.9.9
v2.9.8
v2.9.7
v2.9.6
v2.9.5
v2.9.4
v2.9.3
v2.9.2
v2.9.1
v2.9.0
v2.9-beta2
v2.8.9
v2.9-beta1
v2.8.8
v2.8.7
v2.8.6
v2.8.5
v2.8.4
v2.8.3
v2.8.2
v2.8.1
v2.8.0
v2.7.12
v2.7.11
v2.7.10
v2.7.9
v2.7.8
v2.7.7
v2.7.6
v2.7.5
v2.7.4
v2.7.3
v2.7.2
v2.7.1
v2.7.0
v2.6.12
v2.6.11
v2.6.10
v2.6.9
v2.7-beta1
Solcon-2020-01-06
v2.6.8
v2.6.7
v2.6.6
v2.6.5
v2.6.4
v2.6.3
v2.6.2
v2.6.1
v2.6.0
v2.5.13
v2.5.12
v2.6-beta1
v2.5.11
v2.5.10
v2.5.9
v2.5.8
v2.5.7
v2.5.6
v2.5.5
v2.5.4
v2.5.3
v2.5.2
v2.5.1
v2.5.0
v2.4.9
v2.5-beta2
v2.4.8
v2.5-beta1
v2.4.7
v2.4.6
v2.4.5
v2.4.4
v2.4.3
v2.4.2
v2.4.1
v2.4.0
v2.3.7
v2.4-beta1
v2.3.6
v2.3.5
v2.3.4
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.10
v2.3-beta2
v2.2.9
v2.3-beta1
v2.2.8
v2.2.7
v2.2.6
v2.2.5
v2.2.4
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.6
v2.2-beta2
v2.1.5
v2.2-beta1
v2.1.4
v2.1.3
v2.1.2
v2.1.1
v2.1.0
v2.0.10
v2.1-beta1
v2.0.9
v2.0.8
v2.0.7
v2.0.6
v2.0.5
v2.0.4
v2.0.3
v2.0.2
v2.0.1
v2.0.0
v2.0-beta3
v1.9.6
v1.9.5
v2.0-beta2
v1.9.4-r1
v1.9.3
v2.0-beta1
v1.9.2
v1.9.1
v1.9.0-r1
v1.8.4
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.7.3
v1.7.2-r1
v1.7.1
v1.7.0
v1.6.3
v1.6.2-r1
v1.6.1-r1
1.6.1
v1.6.0
v1.5.2
v1.5.1
v1.5.0
v1.4.2
v1.4.1
v1.4.0
v1.3.2
v1.3.1
v1.3.0
v1.2.2
v1.2.1
v1.2.0
v1.1.0
v1.0.7-r1
v1.0.7
v1.0.6
v1.0.5
v1.0.4
v1.0.3-r1
v1.0.3
1.0.0
Labels
Clear labels
beta
breaking change
complexity: high
complexity: low
complexity: medium
needs milestone
netbox
pending closure
plugin candidate
pull-request
severity: high
severity: low
severity: medium
status: accepted
status: backlog
status: blocked
status: duplicate
status: needs owner
status: needs triage
status: revisions needed
status: under review
topic: GraphQL
topic: Internationalization
topic: OpenAPI
topic: UI/UX
topic: cabling
topic: event rules
topic: htmx navigation
topic: industrialization
topic: migrations
topic: plugins
topic: scripts
topic: templating
topic: testing
type: bug
type: deprecation
type: documentation
type: feature
type: housekeeping
type: translation
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/netbox#7320
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @bryanculver on GitHub (Dec 2, 2022).
Originally assigned to: @arthanson on GitHub.
NetBox version
v3.3.9
Python version
3.8
Steps to Reproduce
user1, with id of1) has superuser permissionsuser300) with theadd_tokenpermission without constraint, no other permissions (not staff or superuser)user300issues themselves a token (either via the UI, or endpoint discussed below)user300sends a POST to://netbox/api/users/tokens/with the payload below:{"user": 1}user300is presented with a token issued foruser1, with entire key material datauser300will only be able to see the key material once, as the key is not associated to their account the query for/api/users/tokensis restricted to their useruser1doesn't exist, or does not have superuser permissions,user300can continue incrementing the user ID until one is found.Expected Behavior
At the very least
user300with theadd_tokenmay be able to create a token for other users who may have a higher privilege than themselves but should not be able to receive the response payload as they do not haveview_tokenpermissions.Ideally, the
add_tokenpermission would not be able to allow a user to create tokens for users with higher permissions than themselves.Observed Behavior
user300is able to receive the token foruser1and then impersonate that user who may be a superuser, including changing the password.This can be confirmed in the demo environment.
@bryanculver commented on GitHub (Dec 2, 2022):
This is following up from a disclosure to the security email group which redirected us here.
A user having the
add_tokenpermission is less likely if the first install/use of tokens was post Netbox 3.0. Netbox 3.0 no longer requires this permission to be applied to users as a bugfix was implemented to address the perceived expected behavior that users should not need a permission to issue their own tokens (see:https://github.com/netbox-community/netbox/issues/6073). Theadd_tokenpermission may still exist for users from pre-3.0 installations.A permission can be scoped to limit a user’s ability to only create tokens owned by themselves (constraint like
{"user__username": "theuser"}). Until Netbox 3.3 there was no way for a permission to reference the requesting user when evaluating the permission, which would require a permission created uniquely for each user. No best-practice documentation has been identified showcasing the danger of applying this permission without constraints (current user interface does not highlight this as a potential security concern in the API).TokenViewSetrestricts users from seeing other users tokens unless they are superuser: https://github.com/netbox-community/netbox/blob/v3.3.9/netbox/users/api/views.py#L48-L65 so the create method could be overloaded to apply the same restriction before returning the response to the requested user.@kkthxbye-code commented on GitHub (Dec 18, 2022):
But that's the entire purpose of the feature. Some other system having the possibility of provisioning tokens for other users and then either providing the token or using the token to perform actions as the user. I agree that it's an inherently dangerous functionality. As such I'm having a hard time seeing this as a bug, seems more like a feature request to suggest removing the feature.
Are you interested in providing a PR for the updated documentation?
For reference this is what's currently there:
@moonrail commented on GitHub (Jan 13, 2023):
I am a little shocked to be honest, by how easy it is for admins to misuse this edge-case-feature.
I as an admin was not aware of this models CRUD handling being any different from other models and have to say, that I think this "dangerous functionality" - as you've called it yourself - is implemented fairly poorly in comparision to best practices NetBox itself, REST and other applications apply.
I mean - a permission for a non superuser that grants the user the permission to imitate a superuser. At least this has to be a red flag for this feature or lead to a requirement, that superusers can configure it in any way other than create a single object permission definition for token endpoint per user with restriction to allowed users.
Either a seperate endpoint or a seperate permission set would've been valid and avoided any misunderstanding.
Additionally the UI actually currently does require token permissions for users to be able to not only create, but also manage their tokens, see Screenshots below.
Without CRUD on token model:

With CRUD on token model:

And here the superuser imitation from a user with token Create-Permission:

@jeremystretch commented on GitHub (Jan 13, 2023):
To clarify, users can create tokens for themselves via the UI without the assignment of any specific permissions. This is intentional per #6073/#8436 and noted in the REST API documentation. You're correct in that explicit permission assignment is needed for a user to edit/delete his or her own tokens via the UI, and I've opened #11491 to capture this as a bug.
As @kkthxbye-code points out above, the ability to enable a user to create tokens on behalf of other users is intentional and desired in certain use cases. I'm happy to consider potential safeguards against the accidental misuse of this feature, but so far no specific implementation has been proposed.
@moonrail commented on GitHub (Jan 13, 2023):
Proposal:
@jeremystretch commented on GitHub (Jan 13, 2023):
@moonrail we'll have to dig into the implementation details to determine feasibility, but IMO that sounds reasonable. Would you mind opening a feature request to capture this please?
@kkthxbye-code commented on GitHub (Jan 13, 2023):
An alternative might be requiring a different action to create tokens for other users, like
impersonateor something, like we require therunaction for running scripts/reports.Haven't looked at the current implementation though, so not sure what is more feasible.
@jeremystretch commented on GitHub (Jan 13, 2023):
@kkthxbye-code ooh I like that idea, it would be a very natural use of custom permission actions.
@moonrail commented on GitHub (Jan 13, 2023):
Separate permission set sounds perfectly fine to me - this also cannot be used by accident, as the Admin UI does not show these as checkboxes.
@jeremystretch commented on GitHub (Apr 7, 2023):
@kkthxbye-code's proposal above has been captured under #12207. Closing this out as no further action is required.