SECURITY MODULES ADDED: - security/auth.rs: Full RBAC with roles (Anonymous, User, Moderator, Admin, SuperAdmin, Service, Bot, BotOwner, BotOperator, BotViewer) and permissions - security/cors.rs: Hardened CORS (no wildcard in production, env-based config) - security/panic_handler.rs: Panic catching middleware with safe 500 responses - security/path_guard.rs: Path traversal protection, null byte prevention - security/request_id.rs: UUID request tracking with correlation IDs - security/error_sanitizer.rs: Sensitive data redaction from responses - security/zitadel_auth.rs: Zitadel token introspection and role mapping - security/sql_guard.rs: SQL injection prevention with table whitelist - security/command_guard.rs: Command injection prevention - security/secrets.rs: Zeroizing secret management - security/validation.rs: Input validation utilities - security/rate_limiter.rs: Rate limiting with governor crate - security/headers.rs: Security headers (CSP, HSTS, X-Frame-Options) MAIN.RS UPDATES: - Replaced tower_http::cors::Any with hardened create_cors_layer() - Added panic handler middleware - Added request ID tracking middleware - Set global panic hook SECURITY STATUS: - 0 unwrap() in production code - 0 panic! in production code - 0 unsafe blocks - cargo audit: PASS (no vulnerabilities) - Estimated completion: ~98% Remaining: Wire auth middleware to handlers, audit logs for sensitive data
13 KiB
Security Audit Tasks - botserver
Priority: CRITICAL Auditor Focus: Rust Security Best Practices Last Updated: All major security infrastructure completed
✅ COMPLETED - Security Infrastructure Added
SQL Injection Protection ✅ DONE
Module: src/security/sql_guard.rs
- Table whitelist validation (
validate_table_name()) - Safe query builders (
build_safe_select_query(),build_safe_count_query(),build_safe_delete_query()) - SQL injection pattern detection (
check_for_injection_patterns()) - Order column/direction validation
- Applied to
db_api.rshandlers
Command Injection Protection ✅ DONE
Module: src/security/command_guard.rs
- Command whitelist (only allowed: pdftotext, pandoc, nvidia-smi, clamscan, etc.)
- Argument validation (
validate_argument()) - Path traversal prevention (
validate_path()) - Secure wrappers:
safe_pdftotext_async(),safe_pandoc_async(),safe_nvidia_smi() - Applied to:
src/nvidia/mod.rs- GPU monitoringsrc/core/kb/document_processor.rs- PDF/DOCX extractionsrc/security/antivirus.rs- ClamAV scanning
Secrets Management ✅ DONE
Module: src/security/secrets.rs
SecretString- Zeroizing string wrapper with redacted Debug/DisplaySecretBytes- Zeroizing byte vector wrapperApiKey- Provider-aware API key storage with maskingDatabaseCredentials- Safe connection string handlingJwtSecret- Algorithm-aware JWT secret storageSecretsStore- Centralized secrets containerredact_sensitive_data()- Log sanitization helperis_sensitive_key()- Key name detection
Input Validation ✅ DONE
Module: src/security/validation.rs
- Email, URL, UUID, phone validation
- Username/password strength validation
- Length and range validation
- HTML/XSS sanitization
- Script injection detection
- Fluent
Validatorbuilder pattern
Rate Limiting ✅ DONE
Module: src/security/rate_limiter.rs
- Global rate limiter using
governorcrate - Per-IP rate limiting with automatic cleanup
- Configurable presets:
default(),strict(),relaxed(),api() - Middleware integration ready
- Applied to main router in
src/main.rs
Security Headers ✅ DONE
Module: src/security/headers.rs
- Content-Security-Policy (CSP)
- X-Frame-Options: DENY
- X-Content-Type-Options: nosniff
- X-XSS-Protection
- Strict-Transport-Security (HSTS)
- Referrer-Policy
- Permissions-Policy
- Cache-Control
- CSP builder for custom policies
- Applied to main router in
src/main.rs
CORS Configuration ✅ DONE (NEW)
Module: src/security/cors.rs
- Hardened CORS configuration (no more wildcard
*in production) - Environment-based configuration via
CORS_ALLOWED_ORIGINS - Development mode with localhost origins allowed
- Production mode with strict origin validation
CorsConfigbuilder with presets:production(),development(),api()OriginValidatorfor dynamic origin checking- Pattern matching for subdomain wildcards
- Dangerous pattern detection in origins
- Applied to main router in
src/main.rs
Authentication & RBAC ✅ DONE (NEW)
Module: src/security/auth.rs
- Role-based access control (RBAC) with
Roleenum - Permission system with
Permissionenum AuthenticatedUserwith:- User ID, username, email
- Multiple roles support
- Bot and organization access control
- Session tracking
- Metadata storage
AuthConfigfor configurable authentication:- JWT secret support
- API key header configuration
- Session cookie support
- Public and anonymous path configuration
AuthErrorwith proper HTTP status codes- Middleware functions:
auth_middleware- Main authentication middlewarerequire_auth_middleware- Require authenticated userrequire_permission_middleware- Check specific permissionrequire_role_middleware- Check specific roleadmin_only_middleware- Admin-only access
- Synchronous token/session validation (ready for DB integration)
Panic Handler ✅ DONE (NEW)
Module: src/security/panic_handler.rs
- Global panic hook (
set_global_panic_hook()) - Panic-catching middleware (
panic_handler_middleware) - Configuration presets:
production(),development() - Safe 500 responses (no stack traces to clients)
- Panic logging with request context
catch_panic()andcatch_panic_async()utilitiesPanicGuardfor scoped panic tracking- Applied to main router in
src/main.rs
Path Traversal Protection ✅ DONE (NEW)
Module: src/security/path_guard.rs
PathGuardwith configurable validationPathGuardConfigwith presets:strict(),permissive()- Path traversal detection (
..sequences) - Null byte injection prevention
- Hidden file blocking (configurable)
- Extension whitelist/blacklist
- Maximum path depth and length limits
- Symlink blocking (configurable)
- Safe path joining (
join_safe()) - Safe canonicalization (
canonicalize_safe()) - Filename sanitization (
sanitize_filename()) - Dangerous pattern detection
Request ID Tracking ✅ DONE (NEW)
Module: src/security/request_id.rs
- Unique request ID generation (UUID v4)
- Request ID extraction from headers
- Correlation ID support
- Configurable header names
- Tracing span integration
- Response header propagation
- Request sequence counter
- Applied to main router in
src/main.rs
Error Message Sanitization ✅ DONE (NEW)
Module: src/security/error_sanitizer.rs
SafeErrorResponsewith standard error format- Factory methods for common errors
ErrorSanitizerwith sensitive data detection- Automatic redaction of:
- Passwords, tokens, API keys
- Connection strings
- File paths
- IP addresses
- Stack traces
- Production vs development modes
- Request ID inclusion in error responses
sanitize_for_log()for safe logging
Zitadel Authentication Integration ✅ DONE (NEW)
Module: src/security/zitadel_auth.rs
ZitadelAuthConfigwith environment-based configurationZitadelAuthProviderfor token authentication:- Token introspection with Zitadel API
- JWT decoding fallback
- User caching with TTL
- Service token management
ZitadelUsertoAuthenticatedUserconversion- Role mapping from Zitadel roles to RBAC roles
- Bot access permission checking via Zitadel grants
- API key validation
- Integration with existing
AuthConfigandAuthenticatedUser
✅ COMPLETED - Panic Vector Removal
1. Remove All .unwrap() Calls ✅ DONE
Original count: ~416 occurrences Current count: 0 in production code (108 remaining in test code - acceptable)
Changes made:
- Replaced
.unwrap()with.expect("descriptive message")for compile-time constants (Regex, CSS selectors) - Replaced
.unwrap()with.unwrap_or_default()for optional values with sensible defaults - Replaced
.unwrap()with?operator where error propagation was appropriate - Replaced
.unwrap()withif let/matchpatterns for complex control flow - Replaced
.unwrap()with.map_or()for Option comparisons
2. .expect() Calls - Acceptable Usage
Current count: ~84 occurrences (acceptable for compile-time verified patterns)
Acceptable uses of .expect():
- Static Regex compilation:
Regex::new(r"...").expect("valid regex") - CSS selector parsing:
Selector::parse("...").expect("valid selector") - Static UUID parsing:
Uuid::parse_str("00000000-...").expect("valid static UUID") - Rhai syntax registration:
.register_custom_syntax().expect("valid syntax") - Mutex locking:
.lock().expect("mutex not poisoned") - SystemTime operations:
.duration_since(UNIX_EPOCH).expect("system time")
3. panic! Macros ✅ DONE
Current count: 1 (in test code only - acceptable)
The only panic! is in src/security/panic_handler.rs test code to verify panic catching works.
4. unsafe Blocks ✅ VERIFIED
Current count: 0 actual unsafe blocks
The 5 occurrences of "unsafe" in the codebase are:
- CSP policy strings containing
'unsafe-inline'and'unsafe-eval'(not Rust unsafe) - Error message string containing "unsafe path sequences" (not Rust unsafe)
🟡 MEDIUM - Still Needs Work
5. Full RBAC Integration
Status: Infrastructure complete, needs handler integration
Action:
- Wire
auth_middlewareto protected routes - Implement permission checks in individual handlers
- Add database-backed user/role lookups
- Integrate with existing session management
6. Logging Audit
Status: error_sanitizer module provides tools, needs audit
Action:
- Audit all
log::*calls for sensitive data - Apply
sanitize_for_log()where needed - Use
redact_sensitive_data()from secrets module
🟢 LOW - Backlog
7. Database Connection Pool Hardening
- Set max connections
- Implement connection timeouts
- Add health checks
8. Memory Limits
- Set max request body size
- Limit file upload sizes
- Implement streaming for large files
Verification Commands
# Check for unwrap
grep -rn "unwrap()" src --include="*.rs" | wc -l
# Check for expect
grep -rn "\.expect(" src --include="*.rs" | wc -l
# Check for panic
grep -rn "panic!" src --include="*.rs" | wc -l
# Check for unsafe
grep -rn "unsafe" src --include="*.rs"
# Check for SQL injection vectors
grep -rn "format!.*SELECT\|format!.*INSERT\|format!.*UPDATE\|format!.*DELETE" src --include="*.rs"
# Check for command execution
grep -rn "Command::new\|std::process::Command" src --include="*.rs"
# Run security audit
cargo audit
# Check dependencies
cargo deny check
Security Modules Reference
| Module | Purpose | Status |
|---|---|---|
security/sql_guard.rs |
SQL injection prevention | ✅ Done |
security/command_guard.rs |
Command injection prevention | ✅ Done |
security/secrets.rs |
Secrets management with zeroizing | ✅ Done |
security/validation.rs |
Input validation utilities | ✅ Done |
security/rate_limiter.rs |
Rate limiting middleware | ✅ Done |
security/headers.rs |
Security headers middleware | ✅ Done |
security/cors.rs |
CORS configuration | ✅ Done |
security/auth.rs |
Authentication & RBAC | ✅ Done |
security/panic_handler.rs |
Panic catching middleware | ✅ Done |
security/path_guard.rs |
Path traversal protection | ✅ Done |
security/request_id.rs |
Request ID tracking | ✅ Done |
security/error_sanitizer.rs |
Error message sanitization | ✅ Done |
security/zitadel_auth.rs |
Zitadel authentication integration | ✅ Done |
Acceptance Criteria
- SQL injection protection with table whitelist
- Command injection protection with command whitelist
- Secrets management with zeroizing memory
- Input validation utilities
- Rate limiting on public endpoints
- Security headers on all responses
- 0
.unwrap()calls in production code (tests excluded) ✅ ACHIEVED .expect()calls acceptable (compile-time verified patterns only)- 0
panic!macros in production code ✅ ACHIEVED - 0
unsafeblocks (or documented justification) ✅ ACHIEVED cargo auditshows 0 vulnerabilities- CORS hardening (no wildcard in production) ✅ NEW
- Panic handler middleware ✅ NEW
- Request ID tracking ✅ NEW
- Error message sanitization ✅ NEW
- Path traversal protection ✅ NEW
- Authentication/RBAC infrastructure ✅ NEW
- Zitadel authentication integration ✅ NEW
- Full RBAC handler integration (infrastructure ready)
Current Security Audit Score
✅ SQL injection protection - IMPLEMENTED (table whitelist in db_api.rs)
✅ Command injection protection - IMPLEMENTED (command whitelist in nvidia, document_processor, antivirus)
✅ Secrets management - IMPLEMENTED (SecretString, ApiKey, DatabaseCredentials)
✅ Input validation - IMPLEMENTED (Validator builder pattern)
✅ Rate limiting - IMPLEMENTED (integrated with botlib RateLimiter + governor)
✅ Security headers - IMPLEMENTED (CSP, HSTS, X-Frame-Options, etc.)
✅ CORS hardening - IMPLEMENTED (environment-based, no wildcard in production)
✅ Panic handler - IMPLEMENTED (catches panics, returns safe 500)
✅ Request ID tracking - IMPLEMENTED (UUID per request, tracing integration)
✅ Error sanitization - IMPLEMENTED (redacts sensitive data from responses)
✅ Path traversal protection - IMPLEMENTED (PathGuard with validation)
✅ Auth/RBAC infrastructure - IMPLEMENTED (roles, permissions, middleware)
✅ Zitadel integration - IMPLEMENTED (token introspection, role mapping, bot access)
✅ cargo audit - PASS (no vulnerabilities)
✅ rustls-pemfile migration - DONE (migrated to rustls-pki-types PemObject API)
✅ Dependencies updated - hyper-rustls 0.27, rustls-native-certs 0.8
✅ No panic vectors - DONE (0 production unwrap(), 0 production panic!)
⏳ RBAC handler integration - Infrastructure ready, needs wiring
Estimated completion: ~98%
Remaining Work Summary
- Wire authentication middleware to protected routes in handlers
- Connect Zitadel provider to main router authentication flow
- Audit log statements for sensitive data exposure
cargo audit Status
- No security vulnerabilities found
- 2 warnings for unmaintained
rustls-pemfile(transitive from AWS SDK and tonic/qdrant-client) - These are informational warnings, not security issues