| name | log-injection-anti-pattern |
| description | Security anti-pattern for log injection vulnerabilities (CWE-117). Use when generating or reviewing code that writes to log files, handles logging of user input, or processes log data. Detects unsanitized data in log messages enabling log forging and CRLF injection. |
Log Injection Anti-Pattern
Severity: Medium
Summary
Log injection occurs when attackers write arbitrary data into log files by injecting newlines (\n) and carriage returns (\r) through unsanitized user input. Attackers create fake log entries to hide malicious activity, mislead administrators, and exploit log analysis tools.
The Anti-Pattern
Never log unsanitized user input. Attackers inject newline characters to forge log entries.
BAD Code Example
import logging
logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(message)s')
def user_login(username, ip_address):
logging.info(f"Failed login attempt for user: {username} from IP: {ip_address}")
GOOD Code Example
import logging
import json
def sanitize_for_log(input_string):
return input_string.replace('\n', '_').replace('\r', '_')
def user_login_sanitized(username, ip_address):
safe_username = sanitize_for_log(username)
logging.info(f"Failed login attempt for user: {safe_username} from IP: {ip_address}")
logging.basicConfig(filename='app_structured.log', level=logging.INFO)
def user_login_structured(username, ip_address):
log_data = {
"event": "login_failure",
"username": username,
"ip_address": ip_address
}
logging.info(json.dumps(log_data))
Detection
- Find unsanitized logging: Grep for user input in log statements:
rg 'logging\.(info|warn|error).*f["\']|logging.*\+.*request\.' --type py
rg 'console\.(log|error).*\$\{|logger.*\+.*req\.' --type js
rg 'logger\.(info|warn).*\+|log\.println.*\+' --type java
- Identify string concatenation in logs: Find unescaped variables:
rg 'log.*%s|log.*\.format|log.*f"' --type py -A 1
rg 'log\(.*\+|logger.*template' --type js
- Test with CRLF injection: Input test strings to verify sanitization:
username%0aINFO - Fake log entry (URL-encoded newline)
admin\r\nSUCCESS: (direct CRLF)
- Check for structured logging: Verify JSON escaping:
rg 'json\.dumps|JSON\.stringify' | rg 'log'
Prevention
Related Security Patterns & Anti-Patterns
References