# Error Handling and Logging Security Implementation ## Overview This document describes the comprehensive error handling and logging security implementation that addresses **CWE-209: Information Exposure Through Error Messages**. The system ensures that sensitive information such as file paths, stack traces, database details, and system internals are never exposed to end users. ## Security Objectives 1. **Prevent Information Disclosure**: Sanitize all error messages before sending to clients 2. **Secure Logging**: Log full error details internally while exposing safe messages externally 3. **User-Friendly Messages**: Provide meaningful feedback without technical details 4. **Audit Trail**: Maintain comprehensive logs for security monitoring and debugging ## Implementation Components ### Backend Security #### 0. **Process-Level Error Handlers** (`backend/server.js`) **CWE-391 Compliance:** - ✅ Catches all uncaught exceptions - ✅ Handles unhandled promise rejections - ✅ Graceful shutdown on SIGTERM/SIGINT - ✅ Server error handling - ✅ Logs all errors before exit **Handlers Implemented:** ```javascript process.on('uncaughtException', handler) // Catches sync exceptions process.on('unhandledRejection', handler) // Catches async rejections process.on('SIGTERM', handler) // Graceful shutdown process.on('SIGINT', handler) // Ctrl+C handling server.on('error', handler) // Server startup errors ``` ### Backend Security #### 1. Error Handler Utility (`backend/utils/errorHandler.js`) **Features:** - Sanitizes error messages before client responses - Removes file paths, stack traces, and system information - Maps technical errors to user-friendly messages - Detects and filters sensitive patterns - Provides structured error responses **Error Types Handled:** - Authentication & Authorization errors - Database constraint violations - File system errors (ENOENT, EACCES, ENOSPC) - Network errors (ECONNREFUSED, ETIMEDOUT, ENOTFOUND) - Validation errors - Rate limiting **Key Functions:** ```javascript sanitizeError(error, defaultMessage) // Sanitizes error for client logError(error, context) // Logs full error internally errorMiddleware(err, req, res, next) // Express middleware asyncHandler(fn) // Wraps async routes ErrorResponses.* // Standard error creators ``` #### 2. Enhanced Logger (`backend/utils/logger.js`) **Security Features:** - Automatically redacts passwords, tokens, secrets, and API keys - Separates error logs from combined logs - Supports production and development formats - File rotation (5MB files, keep 5 backups) - Structured JSON logging for analysis **Sensitive Data Redaction:** ```javascript // Automatically redacts: - "password": "[REDACTED]" - "token": "[REDACTED]" - "secret": "[REDACTED]" - "apiKey": "[REDACTED]" - "authorization": "Bearer [REDACTED]" - "privateKey": "[REDACTED]" ``` **Additional Helpers:** ```javascript logger.security(action, details) // Security event logging logger.performance(operation, duration) // Performance monitoring ``` #### 3. Global Error Middleware (`backend/server.js`) Integrated into Express application as the last middleware: - Catches all unhandled errors - Logs full details internally with context - Returns sanitized responses to clients - Includes timestamp and error code ### Frontend Security #### 0. **Window-Level Error Handlers** (`frontend/src/main.jsx`) **CWE-391 Compliance:** - ✅ Catches all window errors - ✅ Handles unhandled promise rejections - ✅ Service worker error handling - ✅ Prevents default browser error display **Handlers Implemented:** ```javascript window.addEventListener('error', handler) // Global errors window.addEventListener('unhandledrejection', handler) // Promise rejections ``` **Service Worker Protection:** (`frontend/public/service-worker.js`) ```javascript self.addEventListener('error', handler) // SW errors self.addEventListener('unhandledrejection', handler) // SW rejections ``` #### 1. Error Handler Utility (`frontend/src/utils/errorHandler.js`) **Features:** - Extracts user-friendly messages from API responses - Classifies errors by type (auth, permission, validation, network, server) - Determines error severity - Provides retry logic for transient failures - Never exposes technical details to UI **Key Functions:** ```javascript getErrorMessage(error, defaultMessage) // Extract safe message isAuthError(error) // Check if auth error isPermissionError(error) // Check if permission error isValidationError(error) // Check if validation error isNetworkError(error) // Check if network error getErrorType(error) // Classify error type formatError(error, options) // Format for display createErrorNotification(error, options) // Create notification retryRequest(fn, options) // Retry with backoff ``` #### 2. Error Boundary Component (`frontend/src/components/ErrorBoundary.jsx`) **Purpose:** - Catches JavaScript errors in React component tree - Prevents application crashes - Displays user-friendly fallback UI - Provides recovery options (reset, reload) - **Does NOT expose stack traces to users** **Features:** - Automatic error counting - Reset functionality - Full page reload option - Localized messages #### 3. Error Notification Provider (`frontend/src/components/ErrorNotificationProvider.jsx`) **Global Notification System:** - Context-based notification management - Automatic error type detection - Localized error titles and messages - Severity-based styling (error, warning, info, success) - Auto-dismiss with configurable duration **Usage:** ```javascript const { showError, showSuccess, showWarning, showInfo } = useErrorNotification(); // Show error from API response showError(error, { defaultMessage: 'Custom message' }); // Show success message showSuccess('Operation completed successfully'); ``` #### 4. Enhanced API Client (`frontend/src/utils/api.js`) **Security Improvements:** - Automatic error handling with sanitization - Timeout configuration (30 seconds) - Automatic retry for transient failures - Auth error detection and redirect - Silent token parsing errors - Development-only error logging ### Internationalization #### Error Message Translations **English (`frontend/src/locales/en.json`):** ```json "errors": { "general": { "unexpected", "tryAgain", "contactSupport" }, "network": { "title", "message", "timeout", "offline" }, "auth": { "title", "required", "invalid", "failed", "sessionExpired" }, "permission": { "title", "message", "adminRequired", "contactAdmin" }, "validation": { "title", "invalidInput", "requiredField", "invalidFormat" }, "server": { "title", "message", "unavailable", "maintenance", "overloaded" }, "notFound": { "title", "message", "page", "resource" }, "conflict": { "title", "message", "duplicate", "outdated" }, "rateLimit": { "title", "message", "slowDown" } } ``` **Romanian (`frontend/src/locales/ro.json`):** Full translations provided for all error categories. ## Security Benefits ### 1. CWE-209 Mitigation **Before:** ```javascript // Exposed internal details res.status(500).json({ error: error.message }); // User sees: "ENOENT: no such file or directory, open '/app/data/db/users.db'" ``` **After:** ```javascript // Sanitized message const sanitized = sanitizeError(error); res.status(500).json({ error: sanitized.message }); // User sees: "An internal error occurred" ``` ### 2. Stack Trace Protection **Before:** ``` Error: Database error at /app/backend/routes/users.js:45:12 at processTicksAndRejections (internal/process/task_queues.js:93:5) ``` **After:** ```json { "error": "Database operation failed", "code": "DATABASE_ERROR", "timestamp": "2025-12-15T10:30:00.000Z" } ``` ### 3. Sensitive Data Redaction **Logs automatically redact:** - Passwords - Authentication tokens - API keys - Secrets - Private keys - Authorization headers ### 4. Contextual Logging **Internal logs include:** - Full error stack trace - Request method and path - User ID (if authenticated) - IP address - Timestamp - Additional context **Client responses include:** - Safe error message - Error code - Timestamp - HTTP status code ## Usage Examples ### Backend Route with Error Handling ```javascript const { asyncHandler, ErrorResponses } = require('../utils/errorHandler'); router.get('/users/:id', asyncHandler(async (req, res) => { const user = await findUser(req.params.id); if (!user) { throw ErrorResponses.notFound('User not found'); } res.json(user); })); ``` ### Frontend Component with Error Handling ```javascript import { useErrorNotification } from '../components/ErrorNotificationProvider'; import { getErrorMessage } from '../utils/errorHandler'; function MyComponent() { const { showError, showSuccess } = useErrorNotification(); const handleSubmit = async () => { try { await api.post('/users', data); showSuccess('User created successfully'); } catch (error) { showError(error); } }; } ``` ### Custom Error Messages ```javascript // Backend throw ErrorResponses.badRequest('Email address is already in use'); // Frontend automatically displays localized message // No technical details exposed ``` ## Testing ### Test Cases 1. **Database Errors** - UNIQUE constraint → "Duplicate entry exists" - NOT NULL constraint → "Required field is missing" - Foreign key constraint → "Resource conflict" 2. **File System Errors** - ENOENT → "File not found" - EACCES → "Access forbidden" - ENOSPC → "Service temporarily unavailable" 3. **Network Errors** - ECONNREFUSED → "External service unavailable" - ETIMEDOUT → "Request timeout" - ENOTFOUND → "Network request failed" 4. **Authentication Errors** - Invalid token → "Invalid or expired authentication token" - Missing auth → "Authentication required" - Expired session → "Your session has expired" ### Manual Testing ```bash # Test error sanitization curl http://localhost:12345/api/nonexistent # Should return: {"error": "Resource not found", ...} # Should NOT expose file paths or stack traces # Test authentication error curl http://localhost:12345/api/users # Should return: {"error": "Authentication required", ...} # Test rate limiting # Make 100+ rapid requests # Should return: {"error": "Too many requests. Please try again later", ...} ``` ## Monitoring and Maintenance ### Log Files **Location:** `/app/logs/` - `error.log` - Error-level events only - `combined.log` - All application logs **Rotation:** 5MB per file, keep 5 files ### Security Events Monitor for: - Unusual error patterns - Repeated authentication failures - Rate limit violations - Permission denied attempts - Database constraint violations ### Performance Monitoring ```javascript const start = Date.now(); await performOperation(); logger.performance('operation_name', Date.now() - start); ``` ## Docker Integration All changes are automatically included in Docker builds: ```dockerfile # Logs directory created with correct permissions # Error handling utilities bundled # Frontend error components included # Translations packaged ``` ## PWA & Desktop App Compatibility - Error boundary works in all environments - Service worker error handling included - Electron app error logging configured - APK builds include error handling ## Best Practices ### DO: ✅ Use `ErrorResponses` for standard errors ✅ Use `asyncHandler` for async routes ✅ Log errors with context using `logError()` ✅ Use `useErrorNotification()` in React components ✅ Provide user-friendly error messages ✅ Include error codes for debugging ### DON'T: ❌ Never send `error.stack` to clients ❌ Never expose file paths in error messages ❌ Never include database query details in responses ❌ Never log passwords or tokens ❌ Never use `console.error()` for sensitive data ❌ Never expose internal implementation details ## Compliance This implementation addresses: - **CWE-209**: Information Exposure Through Error Messages ✅ - **CWE-391**: Unchecked Error Condition ✅ - **OWASP A01:2021**: Broken Access Control - **OWASP A07:2021**: Identification and Authentication Failures - **OWASP A09:2021**: Security Logging and Monitoring Failures ## Summary The error handling and logging security implementation provides: 1. ✅ **Complete CWE-209 mitigation** - No information leakage 2. ✅ **Complete CWE-391 compliance** - No unhandled exceptions 3. ✅ **Secure logging** - Full internal logs, safe external messages 4. ✅ **User-friendly errors** - Clear, actionable messages 5. ✅ **Multi-language support** - English and Romanian translations 6. ✅ **Global error handling** - Process, window, and component level 7. ✅ **Structured logging** - JSON format for analysis 8. ✅ **Automatic sanitization** - Passwords, tokens, secrets redacted 9. ✅ **Docker integration** - All changes bundled 10. ✅ **PWA/Desktop compatible** - Works in all environments 11. ✅ **Service worker protection** - Error handling in SW context 12. ✅ **Production-ready** - Tested and documented All existing features remain functional. No breaking changes introduced.