CVE-2025-26620 Overview
CVE-2025-26620 is a race condition vulnerability affecting Duende.AccessTokenManagement, a set of .NET libraries that manage OAuth and OpenID Connect access tokens. The vulnerability exists in the client credentials flow implementation, where concurrent requests to obtain access tokens using different protocol parameters can result in tokens being returned with incorrect scope, resource indicator, or other protocol parameters.
Critical Impact
Concurrent access token requests with varying protocol parameters may receive tokens intended for different authorization contexts, potentially leading to unauthorized access or privilege confusion between application components.
Affected Products
- Duende.AccessTokenManagement (versions prior to the security patch)
- Applications using HttpContext.GetClientAccessTokenAsync() with custom TokenRequestParameters
- Applications using IClientCredentialsTokenManagementService.GetAccessTokenAsync() with custom TokenRequestParameters
Discovery Timeline
- 2025-02-18 - CVE CVE-2025-26620 published to NVD
- 2025-02-18 - Last updated in NVD database
Technical Details for CVE-2025-26620
Vulnerability Analysis
This vulnerability is classified as CWE-367 (Time-of-Check Time-of-Use Race Condition). The issue manifests when multiple concurrent requests attempt to obtain access tokens using the client credentials flow with differing protocol parameters. Due to improper synchronization in the token management service, all concurrent requests may receive the same cached token regardless of their individual parameter requirements.
The vulnerability primarily affects advanced usage scenarios where applications dynamically customize token request parameters through the TokenRequestParameters object. In basic usage patterns where client credentials flow is configured once with static parameters, the vulnerability is unlikely to be triggered.
Root Cause
The root cause lies in the lack of proper synchronization when handling concurrent token requests with varying parameters. The ClientCredentialsTokenManagementService and DistributedClientCredentialsTokenCache components did not properly isolate concurrent requests, allowing a race condition where one request's token could be returned to another request with different intended parameters.
Attack Vector
This network-accessible vulnerability requires specific conditions to exploit. An attacker or unintentional trigger scenario involves concurrent API calls that request access tokens with different scopes or resource indicators. The race condition causes the token cache to return tokens that may have been obtained with different authorization parameters than requested.
// Security patch in ClientCredentialsTokenManagementService.cs
// Source: https://github.com/DuendeSoftware/foss/commit/a33332ddec0ebf3c048ba85427e3c77d47c68dac
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
using Microsoft.Extensions.Logging;
+using System.Threading;
namespace Duende.AccessTokenManagement;
/// <summary>
/// Implements token management logic
/// </summary>
-public class ClientCredentialsTokenManagementService : IClientCredentialsTokenManagementService
+public class ClientCredentialsTokenManagementService(
+ IClientCredentialsTokenEndpointService clientCredentialsTokenEndpointService,
+ IClientCredentialsTokenCache tokenCache,
+ ILogger<ClientCredentialsTokenManagementService> logger
+) : IClientCredentialsTokenManagementService
{
- private readonly ITokenRequestSynchronization _sync;
- private readonly IClientCredentialsTokenEndpointService _clientCredentialsTokenEndpointService;
- private readonly IClientCredentialsTokenCache _tokenCache;
- private readonly ILogger<ClientCredentialsTokenManagementService> _logger;
The patch introduces proper threading synchronization by adding System.Threading and restructuring the service to use constructor-based dependency injection with improved synchronization handling.
Detection Methods for CVE-2025-26620
Indicators of Compromise
- Unexpected authorization failures or access denials in logs that suggest tokens with incorrect scopes
- Inconsistent token scopes or resource indicators across concurrent API requests
- Application behavior indicating access to resources outside expected authorization boundaries
- Log entries showing token reuse across requests with different TokenRequestParameters
Detection Strategies
- Review application logs for OAuth token requests that show scope mismatches between requested and granted permissions
- Implement monitoring for concurrent token requests that use varying TokenRequestParameters configurations
- Audit code paths using HttpContext.GetClientAccessTokenAsync() or IClientCredentialsTokenManagementService.GetAccessTokenAsync() with custom parameters
- Monitor for authorization anomalies where tokens grant access outside expected scope boundaries
Monitoring Recommendations
- Enable detailed logging for token management operations to track token request parameters and responses
- Implement correlation tracking between token requests and their intended authorization contexts
- Set up alerts for unexpected authorization patterns that may indicate race condition exploitation
- Review application architecture for patterns that make concurrent token requests with varying parameters
How to Mitigate CVE-2025-26620
Immediate Actions Required
- Update Duende.AccessTokenManagement NuGet package to the latest patched version immediately
- Review code for custom implementations of IClientCredentialsTokenCache that derive from DistributedClientCredentialsTokenCache
- Update derived cache implementations to inject and pass ITokenRequestSynchronization service to the base constructor
- Audit current token management usage patterns to identify if concurrent requests with varying parameters are occurring
Patch Information
The vulnerability has been patched in the Duende.AccessTokenManagement library. The fix introduces proper synchronization mechanisms through the ITokenRequestSynchronization service. The security patch is available in commit a33332ddec0ebf3c048ba85427e3c77d47c68dac. For full details, refer to the GitHub Security Advisory and the security patch commit.
Workarounds
- Serialize token requests to prevent concurrent access when using varying TokenRequestParameters
- Implement application-level locking around token acquisition code that uses custom parameters
- Avoid using the overloads that accept TokenRequestParameters until the patch can be applied
- Consider using separate client credential configurations instead of dynamic parameter customization
// Example: Updated constructor pattern for custom cache implementations
public class CustomClientCredentialsTokenCache : DistributedClientCredentialsTokenCache
{
public CustomClientCredentialsTokenCache(
IDistributedCache cache,
ITokenRequestSynchronization sync, // New required dependency
ILogger<DistributedClientCredentialsTokenCache> logger)
: base(cache, sync, logger) // Pass sync to base constructor
{
// Custom implementation
}
}
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.


