Broken Authentication in Actix with Bearer Tokens
Broken Authentication in Actix with Bearer Tokens — how this specific combination creates or exposes the vulnerability
In Actix web applications, broken authentication often arises when Bearer token handling is implemented without sufficient validation, secure storage practices, or protection against common web vulnerabilities. Bearer tokens rely on the assumption that whoever presents the token is the rightful owner; if an Actix service does not rigorously validate token format, scope, and revocation status, attackers can exploit weak routing, middleware ordering, or missing guards to gain unauthorized access.
One common pattern is using Actix extractors like actix_web::web::Query or custom guards to pass tokens via headers, but failing to enforce strict HTTPS, token binding, or replay protection. If middleware that verifies Bearer tokens is placed after routes that do not require authentication, unauthenticated or partially authenticated requests can reach handlers that assume a valid identity. Additionally, if token parsing logic does not reject malformed or unsigned tokens (e.g., missing alg checks in JWTs), an attacker may supply a token with a none algorithm or a public key as the signing key, leading to authentication bypass.
Another risk arises from how Actix manages application state and data sharing. If developer state or configuration (such as token secret keys) is inadvertently exposed through routes or debug endpoints, an attacker can harvest material to forge Bearer tokens. Path-based vulnerabilities like BOLA/IDOR can also intersect with broken authentication when token validation does not include resource ownership checks; a valid token for one user may still be accepted while accessing another user’s data because the handler does not enforce per-resource authorization tied to the authenticated subject.
Input validation failures further compound the issue. Bearer tokens, especially JWTs, must be validated for issuer, audience, expiration, and scope. In Actix, omitting these checks or trusting client-supplied claims can lead to privilege escalation, where a token with minimal scopes is accepted as having broader permissions. OWASP API Top 10:2023 A07:2023 (Identification and Authentication Failures) captures these classes of risk, and real-world advisories such as CVE-2022-23541 (improper JWT validation in middleware) illustrate how missing signature verification leads to authentication bypass.
Finally, insecure transmission and storage amplify the impact. If Actix services accept Bearer tokens over HTTP, tokens can be intercepted. Logging tokens or including them in error messages leads to data exposure. Without rate limiting on authentication endpoints, attackers can perform credential or token brute-force attacks. The combination of weak token validation, improper middleware ordering, missing authorization checks, and lack of transport security creates a brittle authentication boundary that does not hold against determined attackers.
Bearer Tokens-Specific Remediation in Actix — concrete code fixes
To address broken authentication with Bearer tokens in Actix, implement strict token validation, secure middleware ordering, and explicit authorization checks. The following examples demonstrate a robust approach using Actix web extractors and middleware.
First, enforce HTTPS and validate Bearer tokens before they reach business logic. Use a middleware or extractor that verifies the token signature, issuer, audience, and expiration. Below is an example of a JWT validation extractor in Actix that rejects unsigned tokens and mismatched audiences:
use actix_web::{dev::ServiceRequest, Error, HttpMessage};
use actix_web_httpauth::extractors::bearer::BearerAuth;
use jsonwebtoken::{decode, Algorithm, DecodingKey, Validation, TokenData};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
struct Claims {
sub: String,
scope: String,
exp: usize,
iss: String,
aud: String,
}
async fn validate_bearer(req: ServiceRequest) -> Result {
let auth = req.headers().get("authorization")
.and_then(|v| v.to_str().ok())
.and_then(|s| s.strip_prefix("Bearer "))
.ok_or_else(|| actix_web::error::ErrorUnauthorized("Missing or invalid Authorization header"))?;
let token_data: TokenData<Claims> = decode(
auth,
&DecodingKey::from_rsa_pem(include_bytes!("public_key.pem")).map_err(|_| actix_web::error::ErrorUnauthorized("Invalid key"))?,
&Validation::new(Algorithm::RS256),
).map_err(|_| actix_web::error::ErrorUnauthorized("Invalid token"))?;
if token_data.claims.aud != "my-api-audience" {
return Err(actix_web::error::ErrorUnauthorized("Invalid audience"));
}
req.extensions_mut().insert(token_data);
Ok(req)
}
Ensure middleware ordering places authentication before authorization and business routes. In main.rs, apply the guard to specific scopes that require authentication, and avoid applying it globally too early, which could interfere with public endpoints used for discovery or health checks:
use actix_web::{App, HttpServer, web};
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(web::resource("/health").route(web::get().to(|| async { "ok" })))
.service(
web::scope("/api")
.wrap_fn(|req, srv| {
validate_bearer(req).and_then(|req| srv.call(req))
})
.service(web::resource("/user/{id}").route(web::get().to(user_handler)))
)
})
.bind("127.0.0.1:8080")?
.run()
.await
}
For per-resource authorization, enforce ownership checks within handlers using the subject from validated claims, preventing BOLA/IDOR regardless of token validity:
async fn user_handler(
req: actix_web::HttpRequest,
path: web::Path<(u32)>
) -> impl Responder {
let claims = req.extensions().get::<TokenData<Claims>>()
.expect("validation should have run");
let user_id = path.into_inner().0;
if claims.sub.parse::<u32>().unwrap_or(0) != user_id {
return HttpResponse::Forbidden().finish();
}
HttpResponse::Ok().json("Access granted")
}
Rotate secrets and keys regularly, avoid hardcoding tokens in source or configuration, and ensure tokens are transmitted only over TLS. Combine these practices with rate limiting on authentication endpoints and comprehensive logging that excludes token values to reduce data exposure risks.
Related CWEs: authentication
| CWE ID | Name | Severity |
|---|---|---|
| CWE-287 | Improper Authentication | CRITICAL |
| CWE-306 | Missing Authentication for Critical Function | CRITICAL |
| CWE-307 | Brute Force | HIGH |
| CWE-308 | Single-Factor Authentication | MEDIUM |
| CWE-309 | Use of Password System for Primary Authentication | MEDIUM |
| CWE-347 | Improper Verification of Cryptographic Signature | HIGH |
| CWE-384 | Session Fixation | HIGH |
| CWE-521 | Weak Password Requirements | MEDIUM |
| CWE-613 | Insufficient Session Expiration | MEDIUM |
| CWE-640 | Weak Password Recovery | HIGH |