CVE-2026-107728: Strawberry GraphQL: Synchronous permission checks can treat an awaitable authorization result as truthy
PermissionExtension.resolve() evaluates the return value of has_permission() for truthiness on the synchronous path. supports_sync only classifies a permission as asynchronous when has_permission is declared with async def (via inspect.iscoroutinefunction), so a plain def that returns an awaitable is treated as synchronous. An awaitable is always truthy, so the check passes even when it resolves to False and the protected resolver runs.
The resolve path is chosen by the field resolver, not by the execution method, so any field with a synchronous resolver is affected under both execute_sync() and execute(). Permissions declared with async def has_permission(), or a plain def returning a boolean, are not affected.
References
- github.com/advisories/GHSA-pfvf-fwfp-25mp
- github.com/strawberry-graphql/strawberry/commit/2ebb79796c0e5ebb43cae1abd2b5a21363b1c00e
- github.com/strawberry-graphql/strawberry/pull/4605
- github.com/strawberry-graphql/strawberry/releases/tag/0.326.1
- github.com/strawberry-graphql/strawberry/security/advisories/GHSA-pfvf-fwfp-25mp
- nvd.nist.gov/vuln/detail/CVE-2026-107728
Code Behaviors & Features
Detect and mitigate CVE-2026-107728 with GitLab Dependency Scanning
Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Dependency Scanning using SBOM also detects vulnerabilities from proprietary advisories that this site does not include. Learn more about Dependency Scanning using SBOM →