| name | timing-attacks-anti-pattern |
| description | Security anti-pattern for timing side-channel vulnerabilities (CWE-208). Use when generating or reviewing code that compares secrets, tokens, passwords, or cryptographic values. Detects early-exit comparisons that leak information through timing differences. |
Timing Attacks Anti-Pattern
Severity: Medium
Summary
Attackers measure operation timing to extract secrets. Early-exit comparisons leak information: comparing ABCDEF to ABCDEG takes longer than ABCDEF to XBCDEF (more matching characters before mismatch). These timing differences enable character-by-character secret recovery.
The Anti-Pattern
The anti-pattern is comparison functions returning early upon finding differences in sensitive values (passwords, tokens, hashes).
BAD Code Example
def insecure_compare(s1, s2):
if len(s1) != len(s2):
return False
for i in range(len(s1)):
if s1[i] != s2[i]:
return False
return True
SECRET_TOKEN = "abcdef123456"
@app.route("/check_token")
def check_token():
provided_token = request.args.get("token")
if insecure_compare(provided_token, SECRET_TOKEN):
return "Token valid!"
return "Token invalid!"
GOOD Code Example
import hmac
import secrets
def secure_compare(s1_bytes, s2_bytes):
return hmac.compare_digest(s1_bytes, s2_bytes)
SECRET_TOKEN = secrets.token_bytes(16)
@app.route("/check_token_secure")
def check_token_secure():
provided_token_hex = request.args.get("token")
try:
provided_token_bytes = bytes.fromhex(provided_token_hex)
except ValueError:
return "Token invalid!", 400
if len(provided_token_bytes) != len(SECRET_TOKEN):
return "Token invalid!", 400
if secure_compare(provided_token_bytes, SECRET_TOKEN):
return "Token valid!"
return "Token invalid!"
Detection
- Review code for secret comparisons: Look for any place in the code where sensitive values (passwords, API keys, session tokens, cryptographic hashes, HMAC signatures) are compared.
- Identify standard equality operators: Search for
== or === being used for comparing secrets. These operators are typically not constant-time.
- Look for custom comparison loops: If a custom loop iterates through characters and returns
False on the first mismatch, it's vulnerable.
Prevention
Related Security Patterns & Anti-Patterns
References