CVE-2026-75481 Overview
CVE-2026-75481 is a privilege escalation vulnerability in SkyPilot, an open-source framework for running AI and batch workloads across clouds. The flaw resides in the service account permission update logic. SkyPilot fails to validate whether the authenticated caller is entitled to grant the administrator role when updating service account permissions.
An authenticated user with limited privileges can create a service account, promote it to the administrator role, and then authenticate using its bearer token. This action yields full administrative control over all users and workspaces managed by the SkyPilot API server. The weakness is classified under CWE-269: Improper Privilege Management.
Critical Impact
A low-privileged authenticated user can escalate to full administrator across all SkyPilot users and workspaces by issuing a service-account bearer token bound to the admin role.
Affected Products
- SkyPilot API server (open-source project maintained at skypilot-org/skypilot)
- SkyPilot deployments exposing the user management API defined in sky/users/server.py
- SkyPilot versions prior to the fix delivered in commit 8a3e002
Discovery Timeline
- 2026-08-17 - CVE-2026-75481 published to NVD
- 2026-08-18 - Last updated in NVD database
- Reference - VulnCheck Authentication Bypass Advisory
- Reference - GitHub SkyPilot Issue #9846
Technical Details for CVE-2026-75481
Vulnerability Analysis
SkyPilot exposes user and service-account management endpoints through its API server. The endpoint that updates a principal's role does not verify whether the caller holds the administrator role before assigning that same role to a service account. This is an authorization check that is missing from a privileged code path.
An attacker with any authenticated session can invoke the update-permissions API against a service account they created. The server accepts the requested role, persists it, and issues a bearer token that inherits the newly granted admin capabilities. From that point, the attacker acts with administrative rights across the entire SkyPilot deployment, including other users' workspaces, clusters, and cloud credentials referenced by SkyPilot.
Root Cause
The root cause is improper privilege management in the role-assignment logic. The add_user_if_not_exists path in sky/users/permission.py accepted a role without cross-checking the caller's own role against the target role's privilege level. In addition, sky/users/rbac.py had no deterministic way to resolve conflicts when a principal held multiple roles, meaning an unrecognized or duplicate role entry could be interpreted as allow-everything.
Attack Vector
The attack is remote and network-based. An attacker with a low-privileged authenticated session sends a crafted request to the service-account role update endpoint, sets the role to admin, and then reauthenticates using the service account's bearer token to obtain administrative access.
# Security patch in sky/users/permission.py
# Source: https://github.com/skypilot-org/skypilot/commit/8a3e00259cd374e662cd876c037164bcb070f78e
if policy_updated:
enforcer.save_policy()
- def add_user_if_not_exists(self, user_id: str) -> None:
- """Add user role relationship."""
+ def add_user_if_not_exists(self,
+ user_id: str,
+ role: Optional[str] = None) -> None:
+ """Add user role relationship. `role` overrides the default role."""
self._lazy_initialize()
with _policy_lock():
- self._add_user_if_not_exists_no_lock(user_id)
+ self._add_user_if_not_exists_no_lock(user_id, role)
def _add_user_if_not_exists_no_lock(self,
user_id: str,
The patch also introduces deterministic role precedence in sky/users/rbac.py so that a principal holding multiple roles is always resolved to the least-privileged known role. See commit 8a3e002 for the complete change.
Detection Methods for CVE-2026-75481
Indicators of Compromise
- Creation of new service accounts followed within a short window by a role update to admin from a non-admin caller.
- API requests to the SkyPilot user-management routes defined in sky/users/server.py that modify a service account's role field to an elevated value.
- Authentication events using service-account bearer tokens that immediately perform administrative actions such as workspace enumeration, credential access, or user role changes.
Detection Strategies
- Enable audit logging on the SkyPilot API server and alert on any role change to admin where the initiating principal is not already an administrator.
- Baseline normal service-account behavior and flag tokens that perform first-time administrative operations shortly after creation.
- Correlate service-account creation, role update, and first token use across log sources to reconstruct escalation sequences.
Monitoring Recommendations
- Forward SkyPilot API server logs to a centralized analytics platform and retain them long enough to investigate delayed exploitation.
- Monitor cloud provider audit logs (AWS CloudTrail, Azure Activity Log, GCP Cloud Audit Logs) for anomalous actions performed under credentials that SkyPilot manages.
- Track the population of service accounts and their assigned roles as configuration state, and alert on drift.
How to Mitigate CVE-2026-75481
Immediate Actions Required
- Upgrade SkyPilot to a version that includes commit 8a3e002, which validates the role a service account may be granted.
- Enumerate all existing service accounts and revoke any that hold the admin role without a documented business justification.
- Rotate bearer tokens for service accounts created or modified before the patch was applied.
Patch Information
The fix is delivered in SkyPilot pull request #10482, merged as commit 8a3e002. The patch adds explicit role validation when a service account is created or updated and introduces a deterministic least_privileged_role resolver in sky/users/rbac.py so that multi-role principals never default to the most privileged entry.
Workarounds
- Restrict network access to the SkyPilot API server so that only trusted administrators can reach user-management endpoints until the patch is deployed.
- Disable service account creation for non-administrative users at the reverse proxy or ingress layer where feasible.
- Review and remove unused administrator accounts to shrink the blast radius of a successful escalation.
# Verify the deployed SkyPilot commit includes the fix
cd skypilot
git log --oneline | grep 8a3e002
# List all service accounts and their roles (adjust to your deployment)
sky api info
sky users list --show-roles
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

