HIGH side channel attackfastapi

Side Channel Attack in Fastapi

Fastapi-Specific Remediation

FastAPI provides several native mechanisms to mitigate side channel vulnerabilities. For timing attacks, use constant-time comparison functions and uniform response patterns:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import hmac
import time
from typing import Optional

app = FastAPI()

class LoginRequest(BaseModel):
    username: str
    password: str

# Constant-time comparison function
def timing_safe_compare(val1: str, val2: str) -> bool:
    return hmac.compare_digest(val1, val2)

@app.post("/login")
def login(request: LoginRequest):
    start_time = time.time()
    
    # Uniform response time regardless of username existence
    valid_user = request.username == "valid_user"
    
    # Constant-time password comparison
    password_valid = timing_safe_compare(request.password, "correct_password")
    
    # Uniform error response
    if not (valid_user and password_valid):
        # Add delay to mask timing differences
        elapsed = time.time() - start_time
        if elapsed < 0.1:  # Minimum response time
            time.sleep(0.1 - elapsed)
        raise HTTPException(status_code=401, detail="Invalid credentials")
    
    return {"token": "valid_token"}

This implementation ensures uniform response times regardless of authentication success, preventing timing-based information leakage.

For database queries, use uniform query patterns and add artificial delays:

from fastapi import FastAPI
from databases import Database
import asyncio
import time

app = FastAPI()
DATABASE_URL = "sqlite:///./test.db"
db = Database(DATABASE_URL)

@app.on_event("startup")
async def startup():
    await db.connect()

@app.on_event("shutdown")
async def shutdown():
    await db.disconnect()

@app.get("/user/{user_id}")
async def read_user(user_id: int):
    start_time = time.time()
    
    # Always execute the same query pattern
    query = "SELECT * FROM users WHERE id = $1"
    user = await db.fetch_one(query, [user_id])
    
    # Add uniform delay to mask database timing differences
    elapsed = time.time() - start_time
    if elapsed < 0.2:  # Minimum response time for user endpoints
        await asyncio.sleep(0.2 - elapsed)
    
    if user:
        return {"user": user}
    else:
        return {"error": "User not found"}

This approach ensures that database query timing doesn't leak information about user existence.

For JWT token validation, use uniform error handling and constant-time operations:

from fastapi import FastAPI, HTTPException
from jose import jwt
import time
from typing import Optional

app = FastAPI()
SECRET_KEY = "supersecretkey"

def constant_time_jwt_decode(token: str, secret: str) -> Optional[dict]:
    try:
        return jwt.decode(token, secret, algorithms=["HS256"])
    except:
        # Simulate decoding time for invalid tokens
        time.sleep(0.05)
        return None

@app.get("/protected")
async def protected_endpoint(token: str = Depends(oauth2_scheme)):
    start_time = time.time()
    
    payload = constant_time_jwt_decode(token, SECRET_KEY)
    if not payload:
        # Uniform error response
        elapsed = time.time() - start_time
        if elapsed < 0.1:
            time.sleep(0.1 - elapsed)
        raise HTTPException(status_code=401, detail="Invalid token")
    
    if payload["exp"] < time.time():
        # Uniform error response for expired tokens
        elapsed = time.time() - start_time
        if elapsed < 0.1:
            time.sleep(0.1 - elapsed)
        raise HTTPException(status_code=401, detail="Invalid token")
    
    return {"data": "protected resource"}

This implementation ensures uniform response times for all authentication failure scenarios.

Frequently Asked Questions

How can I test my FastAPI application for side channel vulnerabilities?
Use middleBrick's black-box scanning to automatically detect timing and resource-based side channels. The scanner sends controlled requests and measures response characteristics, identifying statistically significant variations that could indicate information leakage. middleBrick's Input Validation and Rate Limiting checks specifically target side channel vulnerabilities in FastAPI applications.
What's the difference between a side channel attack and a timing attack?
A timing attack is a specific type of side channel attack that exploits variations in response times to extract information. Side channel attacks encompass a broader category including timing attacks, but also resource consumption patterns, power analysis, electromagnetic leaks, and other indirect information leakage methods. In FastAPI applications, timing attacks are most common, but resource-based side channels through database queries and memory usage are also significant threats.