The vulnerability, CVE-2026-83805, in Nautobot allowed an authorization bypass in the approval workflow REST API. The core issue was that a user with the extras.add_approvalworkflowstageresponse permission could directly POST to a generic ApprovalWorkflowStageResponse create endpoint. This endpoint lacked the necessary authorization checks (e.g., approver-group membership, change permission on the object under review) that were enforced in the intended approve/deny actions on ApprovalWorkflowStage. Furthermore, the ApprovalWorkflowStageResponseSerializer exposed the user and state fields as writable, enabling an attacker to attribute responses to arbitrary users and directly set the approval state, effectively self-approving workflows and escalating to unauthorized job execution.
The patch addresses this by:
- Removing the direct API endpoint: The
ApprovalWorkflowStageResponseViewSet and its associated URL registration were entirely removed. This eliminates the vulnerable entry point that allowed direct creation and manipulation of ApprovalWorkflowStageResponse objects without proper checks. The create method of this viewset was the primary entry point for exploitation.
- Restricting serializer fields: The
ApprovalWorkflowStageResponseSerializer was modified to make the user and state fields read-only. This prevents any direct manipulation of these critical fields during object creation or update, even if an alternative (unintended) way to interact with the serializer were found. The create and update methods of this serializer were directly processing the malicious input without proper validation of these fields.
Therefore, the vulnerable functions are the create method of the ApprovalWorkflowStageResponseViewSet (which was removed to eliminate the direct API access) and the create and update methods of the ApprovalWorkflowStageResponseSerializer (due to the writable user and state fields that allowed malicious input to be processed). Exploitation would involve calling the create method of the ApprovalWorkflowStageResponseViewSet with malicious data, which would then utilize the vulnerable create or update logic within the ApprovalWorkflowStageResponseSerializer to bypass authorization and activate scheduled jobs.