Sep 23, 2026·7 min read·2 visits
A validation discrepancy between Nautobot controllers allows authenticated low-privileged users to directly POST forged approval responses, bypass group and permission checks, and trigger the execution of privileged automated tasks.
An authorization bypass vulnerability exists in Nautobot's REST API endpoints handling approval workflows. Due to an architectural inconsistency, a standalone, generic REST API endpoint for creating approval responses was exposed without propagating the required business-logic validations. This allows low-privileged authenticated users to submit forged, self-approved votes, bypassing approval thresholds and triggering unauthorized server-side automated jobs.
Nautobot serves as an authoritative Network Source of Truth and Network Automation Platform, orchestrating complex state definitions and managing sensitive network resources. To control risk, Nautobot employs an approval workflow framework that acts as a gatekeeper for critical administrative actions and automated script executions, such as scheduled jobs. These workflows are constructed from sequential approval stages, each defined by validation rules including designated group permissions, object change privileges, and response thresholds.
The application separates the management of these workflows into distinct controllers and objects: the high-level workflow stage container and individual approval stage response records. This architectural decoupling exposed a broad attack surface, as it relied on nested business logic in specific controller pathways rather than central validation enforcement at the model level. An oversight in endpoint routing allowed the model viewset handling the individual response records to be reached directly, bypass the stage validations, and process raw database writes.
As a result, a low-privileged authenticated user holding only standard response creation permissions could interact directly with the standalone response endpoint. By sending a crafted payload, the attacker could bypass the operational constraints defined on the parent stage, such as authorized user group constraints, single-response constraints, and specific object-level editing requirements. This systemic flaw effectively undermined the entire integrity of Nautobot's automation control loop.
The vulnerability stems from an inconsistency in authorization verification between Nautobot's main stage controller and the individual stage-response endpoints. Nautobot implemented critical business validations—verifying that an approver belongs to the correct approver group, verifying that the approver possesses change permissions on the targeted object, and ensuring a one-vote-per-user limit—solely inside the custom action methods approve and deny of the ApprovalWorkflowStageViewSet controller. The generic REST API router, however, simultaneously registered a standard Django REST Framework ModelViewSet named ApprovalWorkflowStageResponseViewSet at /api/extras/approval-workflow-stage-responses/.
When clients invoked this generic ViewSet via a standard HTTP POST request, the application did not propagate or enforce the complex authorization checks written inside the custom action methods of the parent ViewSet. Instead, it executed standard model-level creation validations, which only verified basic field syntax and basic foreign key relationships. The critical business-logic constraints designed to govern approval validation and maintain procedural safety were bypassed during these direct create requests.
Compounding this issue, the ApprovalWorkflowStageResponseSerializer defined the user and state fields as writable parameters without restricting them to read-only access. Because of this mass-assignment flaw, an attacker could supply any arbitrary user identifier in the user payload parameter, effectively impersonating an administrator or an authorized approver. When the API accepted and stored these forged response objects, the state machine updated the collective approval status of the stage, initiating transitions and executing scheduled jobs automatically once the threshold was met.
To analyze the defect and verify the resolution, consider the structural changes introduced in commit 8682707d0391cbfd7694e3276127b78dc9cf29d8. The primary fix strategy was to eliminate the standalone, routable endpoints entirely and modify the deserialization rules to make the response properties read-only.
In the vulnerable application, the URL router registered the viewset directly:
# Nautobot URL Router (nautobot/extras/api/urls.py)
# BEFORE PATCH: Standalone route was exposed to clients
router.register("approval-workflow-stage-responses", views.ApprovalWorkflowStageResponseViewSet)This allowed direct HTTP requests to target response creations without checking stage rules. The patch completely excised this line from the router configuration, removing the endpoint route. Furthermore, the patch redefined the ApprovalWorkflowStageResponseSerializer to make both the user and state fields read-only:
# Nautobot Serializers (nautobot/extras/api/serializers.py)
# AFTER PATCH: Enforcing read-only state and nesting inside parent views
class ApprovalWorkflowStageResponseSerializer(ValidatedModelSerializer):
user = serializers.SerializerMethodField()
def get_user(self, obj):
# Safe nested serialization implementation
pass
class Meta:
model = ApprovalWorkflowStageResponse
fields = [
"id",
"user",
"comments",
"state",
"last_updated",
]
read_only_fields = ["user", "state"]This configuration prevents direct creation or modification of these sensitive fields through any endpoint. The parent serializer was updated to render these responses strictly as read-only nested items, fetching only relevant entries via explicit user permission restrictions using .restrict(request.user, 'view'). This architectural overhaul ensures that no variant attacks targeting the response object can succeed, making the fix complete.
Exploitation of CVE-2026-83805 requires an active, authenticated user session with basic write permissions on the response models (extras.add_approvalworkflowstageresponse). The attacker must also locate a pending approval workflow stage, which is commonly associated with restricted network orchestration tasks. Once these conditions are met, the attack proceeds by bypassing the designed user checks.
The attacker targets the standalone endpoint /api/extras/approval-workflow-stage-responses/ with an HTTP POST request. The payload specifies the target stage's UUID, an administrative user's UUID in the user field, and sets the state field to approved. The lack of server-side validation against the request's authenticated token allows the creation of this response record under the administrative user's identity.
By executing multiple requests using different spoofed administrative UUIDs, an attacker can sequentially satisfy the minimum approver threshold (min_approvers). When the final required approval is inserted, the model save event handler automatically transitions the parent ApprovalWorkflow object. This state change directly triggers the execution of the associated ScheduledJob on the system under the identity of the user who originally scheduled it, resulting in execution.
The security impact of this vulnerability is significant, particularly due to the role Nautobot plays in managing live production enterprise networks. By bypassing approval gates, a low-privileged authenticated user can force the immediate execution of restricted automation scripts. Because scheduled jobs often run with administrative network credentials, this access allows the attacker to manipulate network topologies, extract sensitive device configuration variables, or alter credentials without oversight.
From an operating system perspective, if a scheduled job is configured to perform system-level tasks or execute custom code on the underlying container, the attacker can leverage this bypass to achieve arbitrary code execution. This code execution occurs in the context of the Nautobot worker container, which may lead to lateral movement within the hosting infrastructure. The CVSS vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N reflects this scope change, indicating that a failure in the application layer directly impacts the security boundaries of downstream connected network devices.
At the time of this analysis, the vulnerability is not listed in CISA's Known Exploited Vulnerabilities catalog, and no public functional exploit or active in-the-wild campaigns have been observed. However, the technical ease of execution, requiring only a low-privileged account to issue structured REST requests, elevates the operational risk. Organizations relying heavily on Nautobot for workflow-gated network deployments face a elevated threat landscape until they deploy remediations.
The recommended and primary path of remediation is upgrading all Nautobot instances to version 3.1.8 or later. This release completely removes the vulnerable standalone endpoint and implements strict nested serialization rules to prevent unauthorized direct writes to the database.
If an immediate upgrade is not feasible, administrators should restrict the extras.add_approvalworkflowstageresponse permissions. Removing this permission from all non-administrative and low-privileged user roles prevents access to the vulnerable endpoint path. Valid users who need to approve or deny workflow stages can continue to use the secure /approve/ or /deny/ actions of the ApprovalWorkflowStageViewSet controller, which enforce appropriate group validations.
Additionally, security teams can deploy a Web Application Firewall (WAF) or API gateway rule to drop incoming HTTP requests matching the vulnerable path. Specifically, any POST, PUT, PATCH, or DELETE requests directed to /api/extras/approval-workflow-stage-responses/ should be blocked and logged for incident response. Network detection systems can monitor application logs for anomalous approval responses where the database creator does not match the designated author.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Nautobot Nautobot | >= 3.0.0, < 3.1.8 | 3.1.8 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-285 |
| Attack Vector | Network (AV:N) |
| CVSS v3.1 Score | 6.4 (Medium) |
| EPSS Score | 0.00 |
| Exploit Status | none |
| KEV Status | Not Listed |
The product does not perform or incorrectly performs an authorization check when an actor attempts to access a resource or perform an action.
CVE-2026-83801 is a stored Cross-Site Scripting (XSS) vulnerability in Nautobot. The vulnerability arises because the application interpolates user-controlled database properties—specifically Relationship descriptions and Module Family names—directly into the help_text parameter of Django form fields. These fields are rendered using Django's |safe filter, bypassing HTML escaping and enabling persistent injection. When an administrative user accesses the affected forms, the payload executes contextually in their browser. This allows attackers to hijack active sessions and perform unauthorized operations. Nautobot versions prior to v2.4.37 and v3.1.8 are affected by this vulnerability. The issue has been patched by implementing contextual HTML escaping and strict markdown sanitization.
CVE-2026-85709 is a sensitive information exposure vulnerability in HKUDS LightRAG prior to version 1.5.5. The vulnerability allows remote, unauthenticated clients to trigger server-side errors and receive raw Python exception details, including local filesystem paths, database connection strings, credentials, and internal system configurations.
HKUDS LightRAG prior to version 1.5.5 is vulnerable to multiple timing side-channels (CWE-208) in its API authentication layer. The password verification logic in `lightrag/api/passwords.py` compares plaintext administrative credentials using Python's short-circuiting equality operator (`==`). Additionally, `lightrag/api/auth.py` terminates authentication early on non-existent usernames, creating an observable latency difference compared to computationally expensive bcrypt comparisons on valid accounts. Together, these allow remote unauthenticated attackers with low-latency network access to enumerate valid usernames and extract plaintext passwords character by character.
LightRAG prior to version 1.5.5 does not implement rate limiting, lockout mechanisms, or throttling on its `/login` authentication endpoint. This allows unauthenticated remote attackers to perform rapid brute-force attacks to crack passwords and hijack active sessions. Furthermore, because the endpoint processed synchronous bcrypt verifications inside an asynchronous event loop, concurrent brute-force requests can easily exhaust server CPU resources, triggering an unauthenticated Denial of Service (DoS).
A security vulnerability in HKUDS/LightRAG prior to v1.5.5 allows authenticated attackers to bypass the native markdown image downloader guard. The system fails to normalize IPv6 transition wrappers (such as NAT64, IPv4-compatible, and 6to4 blocks) encapsulating internal IPv4 addresses. Python's ipaddress library evaluates these wrappers as globally routable, but hosting environments running NAT64/DNS64 routing decapsulate and route the requests to internal resources.
HKUDS LightRAG, an open-source retrieval-augmented generation (RAG) framework, is vulnerable to Stored Cross-Site Scripting (XSS) in its WebUI chat rendering component prior to version 1.5.5. Unsanitized document content ingested into the vector database can propagate through the LLM response pipeline and execute malicious HTML or active JavaScript payloads inside the administrator's WebUI session. Because the application stores sensitive access keys in browser storage, successful exploitation allows complete API token extraction and administrative session hijacking.