Skip to content
Heist/ feed
MediumFix available

Nautobot: Authorization bypass in approval workflow REST API allows self-approval and unauthorized activation of scheduled jobs

Type: advisorySource: OSV1 source record

### Impact This is an authorization bypass that escalates into unauthorized server-side job execution. 1. Primary impact - self-approval: The approver checks (approver-group membership, `change` permission on the object under review, one-response-per-user) are enforced only in the `approve`/`deny` actions on `ApprovalWorkflowStage`. The generic `ApprovalWorkflowStageResponse` create endpoint enforces none of them, so a user holding only `extras.add_approvalworkflowstageresponse` can `POST` approved responses directly and drive a stage past its `min_approvers` threshold with no legitimate approver involved. The serializer also exposes `user` and `state` as writable, letting the attacker attribute responses to arbitrary users. 2. Escalated impact job activation: Because the approval workflow gates a `ScheduledJob`, self-approval does not stop at the approval record. Stage approval cascades through `ApprovalWorkflow.save()` to `on_workflow_approved()`, which sets the target job to enabled/active. ### Patches Fixed in Nautobot v3.1.8 ### Workarounds Restrict the `extras.add_approvalworkflowstageresponse` permission so that no untrusted user holds it; approval responses should only ever be created via the stage `approve`/`deny` actions. There is no configuration flag that disables the generic create endpoint prior to the patch.

Announced Source revision 1
Original source ↗

PYSEC-2026-4111

Primary source · Revision 1

Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.

Security context

Source reference: osv:PYSEC-2026-4111

nautobot

Source reference: /affected/0/package/name

Affected versions
3.0.0

Source reference: /affected/0/versions

3.0.1

Source reference: /affected/0/versions

3.0.10

Source reference: /affected/0/versions

3.0.11

Source reference: /affected/0/versions

3.0.2

Source reference: /affected/0/versions

3.0.3

Source reference: /affected/0/versions

3.0.4

Source reference: /affected/0/versions

3.0.5

Source reference: /affected/0/versions

3.0.6

Source reference: /affected/0/versions

3.0.7

Source reference: /affected/0/versions

3.0.8

Source reference: /affected/0/versions

3.0.9

Source reference: /affected/0/versions

3.1.0

Source reference: /affected/0/versions

3.1.0a1

Source reference: /affected/0/versions

3.1.0a2

Source reference: /affected/0/versions

3.1.0a3

Source reference: /affected/0/versions

3.1.0a4

Source reference: /affected/0/versions

3.1.0a5

Source reference: /affected/0/versions

3.1.1

Source reference: /affected/0/versions

3.1.2

Source reference: /affected/0/versions

3.1.3

Source reference: /affected/0/versions

3.1.4

Source reference: /affected/0/versions

3.1.5

Source reference: /affected/0/versions

3.1.6

Source reference: /affected/0/versions

3.1.7

Source reference: /affected/0/versions

Fixed versions
3.1.8

Source reference: /affected/0/ranges

Prerequisites
Not stated in this record

Structured affected-version data

Original package identities and version rules from this source.

[
  {
    "ranges": [
      {
        "type": "ECOSYSTEM",
        "events": [
          {
            "introduced": "3.0.0"
          },
          {
            "fixed": "3.1.8"
          }
        ]
      }
    ],
    "package": {
      "name": "nautobot",
      "purl": "pkg:pypi/nautobot",
      "ecosystem": "PyPI"
    },
    "versions": [
      "3.0.0",
      "3.0.1",
      "3.0.10",
      "3.0.11",
      "3.0.2",
      "3.0.3",
      "3.0.4",
      "3.0.5",
      "3.0.6",
      "3.0.7",
      "3.0.8",
      "3.0.9",
      "3.1.0",
      "3.1.0a1",
      "3.1.0a2",
      "3.1.0a3",
      "3.1.0a4",
      "3.1.0a5",
      "3.1.1",
      "3.1.2",
      "3.1.3",
      "3.1.4",
      "3.1.5",
      "3.1.6",
      "3.1.7"
    ],
    "database_specific": {
      "source": "https://github.com/pypa/advisory-database/blob/main/vulns/nautobot/PYSEC-2026-4111.yaml"
    }
  }
]
Related CVEs
CVE-2026-83805

Source reference: /aliases

Publisher severity

No explicit severity was provided.

Linked CVE context

These ratings describe the referenced vulnerabilities and products. They are not a severity rating for every application using this dependency.

Event
#62490 · Revision 1
Added to Heist Feed
Publisher date
Read the original announcement