mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Jinja2 method for updateing or changing DB objects and files via rendered config template #11611
Closed
opened 2025-12-29 21:47:38 +01:00 by adam
·
5 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
No Label
type: bug
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/netbox#11611
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 @jchambers2012 on GitHub (Sep 15, 2025).
NetBox Edition
NetBox Community
NetBox Version
Tested with Community 4.1.10->4.2.6 and NetBox Cloud 4.2.9
Python Version
3.12
Steps to Reproduce
Assumptions:
Steps to reproduce:
File Updates:
DB Object updates:
First Run of user update:

Second Run
Expected Behavior
Custom model functions that are used in the sandbox and perform filesystem and database updates should be marked with
alters_data,unsafe_callable, or start with the_to make the private so the sandbox cannot be used intentionally or unintentionally to make changes to the app or its database from non-admin users that should not have access to do this via the sandbox.write_to_disk() https://github.com/netbox-community/netbox/blob/v4.2.9/netbox/core/models/data.py#L354
user.config.set() https://github.com/netbox-community/netbox/blob/v4.2.9/netbox/users/models/preferences.py#L71
Observed Behavior
There are a number of custom model functions in the code base that allow object updating via the SandBox. An audit of the NetBox custom model functions might be needed to verify if a custom model function should be allowed to be called with in the sandbox and potentially have the needed permission guard railed added to prevent users with limited access to a model from being able to update data or files they should not have access too.
Documentation should also be updated to warn admin of the potential security risks of giving everyone or risky users write access into any models that use the sandbox. Per Django security team (see Issue 35837 next)
A similar behavior was found in Django Core User Object code was patched under https://code.djangoproject.com/ticket/35837 (https://github.com/django/django/pull/18672/files)
How the sandbox depends on what function are safe to call: https://github.com/pallets/jinja/blob/6aeab5d1da0bc0793406d7b402693e779b6cca7a/src/jinja2/sandbox.py#L248
@jeremystretch commented on GitHub (Sep 16, 2025):
The
write_to_disk()method was removed from the DataFile model in NetBox v4.3.0. AFAICT, this is not reproducible on NetBox v4.3.0 or later. @jchambers2012 can you please confirm this?Please submit any proposed additions to the documentation under a separate issue.
@jchambers2012 commented on GitHub (Sep 16, 2025):
yes, it does look like
write_to_disk()is removed but am still able to perform disk reads viarefresh_from_disk(). Access is limited to the user/group that is running the app so that limits OS access scope.There are also some models that are not protected from DB writes such as
user.config.set()anduser.config.clear()andManagedFile.sync_data(). I just wanted to shine light on the fact that model custom functions might need an audit to verify they should or should not be callable in SandBox. And if these functions are deemed to be acceptable to be callable in sandbox, then that functionality should be documented, otherwise be blocked.Items I was able to call from SandBox in 4.3.7:
User preferences
https://github.com/netbox-community/netbox/blob/v4.3.7/netbox/users/models/preferences.py#L71
https://github.com/netbox-community/netbox/blob/v4.3.7/netbox/users/models/preferences.py#L117
refresh_from_disk
https://github.com/netbox-community/netbox/blob/v4.3.7/netbox/core/models/data.py#L338
Script.module.sync_data
https://github.com/netbox-community/netbox/blob/v4.3.7/netbox/core/models/files.py#L88
@jchambers2012 commented on GitHub (Sep 18, 2025):
Here will be an example of a DCIM read only account in 4.2.9 and 4.3.7 being able to execute custom scripts via the sandbox via a pre-setup template:
Community 4.3.7:
Cloud 4.2.9:
Config Templates
j2test.py
@jchambers2012 commented on GitHub (Sep 18, 2025):
I do want to acknowledge that users having access to all models that build devices probably needed to properly render a configuration. A user not needing access to Circuits for normal job role might not be needed but to properly render device’s interface, BGP configuration or info to set up X to an ISP access is most likely required. (if that module is used) I can think of a few options to consider that can help with the situation on top of documenting this behavior in #20368
Option 1 – Add an app configuration item to define allow list what models should be exposed into the sandbox.
This option would allow for people who need access to X to be able to add additional models from core or plugins to be able to use with config generation. This will allow for admin to consider the risks of exposing more than the default models into the sandbox. Might also be good to expose an API end point to plugins that might be able to register their models that they consider “safe” to expose into the sandbox like NetBox ACLs.
I would then say exclude any admin like functions from the sandbox, core., users., extras.* (excluding Tags and ImageAttachment?)
Option 2 – Add transaction.atomic() over the sandbox.
This option will ensure that no model, plugin, and (possibly) scripts that are called from the sandbox can’t update the database. This will not fix anything that might touch the file system, a different protection system would be needed or each file system model needs option 3.
https://github.com/netbox-community/netbox/blob/v4.3.7/netbox/utilities/jinja2.py#L75
Option 3 – Audit the custom model functions
Adding the correct protection tags (
alters_data,unsafe_callable,do_not_call_in_templates, etc) to any custom function or model should be done, even if the parent class has it applied and is being blocked by Sandbox today. This will explicitly call out what function should NOT be allowed in the sandbox in case NB core, python library or module makes changes to upstream functionality that remove protection tags would allow for making changes to the database.@jnovinger commented on GitHub (Sep 29, 2025):
I've created #20442 , to capture the remaining work related to this issue.