Privilege Escalation in Piccolo Admin via Session Token Exposure
An improper access control implementation in the piccolo_admin /api/tables/sessions/ endpoint allows authenticated non-superuser admins to leak plaintext session tokens and perform privilege escalation to superuser status via CVE-2026-55485.
CVE search metadata
CVE search record: CVE-2026-55485. Severity: high. CVSS: 8.8. KEV: no. Product: piccolo_admin (<= 1.13.0). Brief: Privilege Escalation in Piccolo Admin via Session Token Exposure. Brief link: https://feed.craftedsignal.io/briefs/2026-08-piccolo-admin-privesc/
The piccolo_admin package (up to and including version 1.13.0) contains a significant authorization vulnerability due to a flawed implementation of the superuser_validators helper function. This function utilizes a deny-list approach for protecting sensitive resources, restricting only PUT, PATCH, DELETE, and POST methods, while failing to block GET requests. Simultaneously, the SessionsBase.token field in the piccolo_api session authentication module is not marked as secret=True, resulting in the exposure of live session tokens in plaintext within GET /api/tables/sessions/ responses. An attacker with standard (non-superuser) admin credentials can retrieve the session token for a superuser, replay that token to impersonate them, and subsequently modify their own user record to grant themselves permanent superuser privileges. This vulnerability, tracked as CVE-2026-55485, affects deployments that explicitly expose the Sessions table in the admin configuration, a pattern often used for session monitoring and management.
Attack Chain
- The attacker authenticates as a standard, non-superuser administrator (e.g.,
admin=True,superuser=False). - The attacker identifies that the
Sessionstable is exposed in the admin dashboard. - The attacker issues a
GETrequest to/api/tables/sessions/to retrieve the entire contents of the sessions table. - The server returns a 200 OK response containing plaintext session tokens for all active users, including superusers.
- The attacker extracts a superuser's session token from the JSON response.
- The attacker uses the stolen superuser token in a new session cookie (
Cookie: id=...) to authenticate requests to the admin API. - The attacker sends a
PATCHrequest to/api/tables/piccolo_user/<attacker_id>/with the payload{"superuser": true}. - The server processes the request as the superuser, successfully promoting the attacker's account to superuser status.
Impact
Successful exploitation results in full administrative takeover. An attacker can access all tables, modify user credentials, revoke existing sessions, and potentially plant payloads in exported data. The elevation is permanent, as the attacker effectively modifies the database record associated with their account.
Recommendation
- Upgrade piccolo_admin and associated piccolo_api components immediately; identify the specific patched version from the vendor and apply it.
- Apply the recommended fix to
superuser_validatorsby implementing an allow-list or a more restrictiveif not request.user.user.superuser: raise HTTPExceptionpattern to block all unauthorized access. - Apply the defense-in-depth fix by setting
secret=TrueonSessionsBase.tokeninpiccolo_api/session_auth/tables.pyto prevent plaintext leakage. - Monitor web logs for
GETrequests to/api/tables/sessions/originated by users withoutsuperuserstatus.
Immediate actions
Upgrade piccolo_admin to 1.14.0 or later
Threat Hunt
Search logs for GET /api/tables/sessions/ activity.
Data: Web server access logs
Mitigations
Patch piccolo_admin to 1.14.0 or later
CVE-2026-55485
Detection coverage 1
Detect CVE-2026-55485 Exploitation - Unauthorized GET to Sessions Endpoint
highDetects unauthorized access attempts to the sessions table via GET requests, which could indicate attempts to scrape session tokens.
Detection queries are available on the platform. Get full rules →