UNPKG

node-red-contrib-wger

Version:

Node-RED nodes for integrating with wger workout and fitness tracker API

148 lines (117 loc) 6.52 kB
# Security Fixes Implementation Report ## Overview This document describes the critical security fixes implemented to address vulnerabilities identified in the PR review. ## 1. Path Traversal Security Fix ### Issue Path traversal vulnerability where validation occurred AFTER processing in `nodes/wger-api.js`. This could allow malicious path parameters to be processed before being rejected. ### Solution - **Moved path traversal validation to InputValidator**: Path traversal patterns (`../` and `..\\`) are now checked at the type validation level in `InputValidator.validateType()` for both STRING and ID types. - **Early detection**: Path traversal is now caught immediately during type validation, before any further processing. - **Consistent enforcement**: All string and ID inputs are automatically checked, providing defense in depth. ### Implementation Details #### InputValidator Changes (`utils/input-validator.js`) ```javascript // STRING type validation now includes path traversal check case this.TYPES.STRING: // ... type checking ... // Check for path traversal patterns immediately for string values if (value.includes('../') || value.includes('..\\')) { throw new Error(`Field '${fieldName}' contains invalid path traversal patterns`); } return value; // ID type validation also includes the check case this.TYPES.ID: // ... type checking ... // Check for path traversal in ID values const idStrCheck = String(value); if (idStrCheck.includes('../') || idStrCheck.includes('..\\')) { throw new Error(`Field '${fieldName}' contains invalid path traversal patterns`); } // ... rest of validation ... ``` #### API Node Changes (`nodes/wger-api.js`) - Removed redundant path traversal check after validation - Added comment explaining that path traversal is now handled by InputValidator #### Validation Schema Updates (`utils/validation-schemas.js`) - Added path traversal validation to params objects in all API methods - Validates all string parameters for path traversal patterns ## 2. Cache Poisoning Prevention ### Issue Cache key generation used unsanitized user input, potentially allowing cache poisoning attacks where malicious input could overwrite or corrupt cache entries. ### Solution - **Comprehensive input sanitization**: Created `sanitizeCacheKeyComponent()` method to sanitize all cache key components. - **Character filtering**: Removes dangerous characters and patterns that could be used for injection attacks. - **Length limiting**: Prevents overflow attacks by limiting component length to 100 characters. - **Validation**: Ensures sanitized components are not empty, throwing errors for invalid inputs. ### Implementation Details #### WeightStatsCache Changes (`utils/weight-stats-cache.js`) ```javascript sanitizeCacheKeyComponent(value) { // Check for empty/null/undefined before processing if (!value && value !== 0) { throw new Error('Invalid cache key component'); } const str = String(value) .replace(/\.\./g, '') // Remove path traversal .replace(/[^a-zA-Z0-9\-_]/g, '_') // Remove injection characters .substring(0, 100); // Limit length // Ensure result is not empty after sanitization if (!str) { throw new Error('Invalid cache key component'); } return str; } generateCacheKey(userId, startDate, endDate, options = {}) { // Sanitize all inputs to prevent cache poisoning attacks const sanitizedUserId = this.sanitizeCacheKeyComponent(userId); const sanitizedStartDate = this.sanitizeCacheKeyComponent(startDate); const sanitizedEndDate = this.sanitizeCacheKeyComponent(endDate); const sanitizedGroupBy = options.groupBy ? this.sanitizeCacheKeyComponent(options.groupBy) : ''; const baseKey = `${sanitizedUserId}_${sanitizedStartDate}_${sanitizedEndDate}`; const optionsKey = sanitizedGroupBy ? `_${sanitizedGroupBy}` : ''; return `weight_stats_${baseKey}${optionsKey}`; } ``` ## 3. Additional Security Improvements ### Input Validation Enhancements - Path traversal checks are now performed before sanitization, ensuring malicious patterns are caught early - Added comprehensive validation for object parameters in API schemas - Enhanced parameter length validation (max 1000 characters) to prevent overflow attacks ### Test Coverage Created comprehensive security test suites: 1. **Path Traversal Tests** (`test/utils/input-validator_spec.js`) - Tests for STRING and ID type validation - Tests for sanitized strings - Tests for API endpoint validation - Tests for object parameter validation 2. **Cache Security Tests** (`test/utils/weight-stats-cache_spec.js`) - Tests for path traversal sanitization in cache keys - Tests for SQL injection pattern sanitization - Tests for XSS attempt sanitization - Tests for cache key length limiting - Tests for consistent key generation 3. **API Security Tests** (`test/wger-api_spec.js`) - Tests for path traversal in endpoints - Tests for path traversal in parameters - Tests for parameter encoding - Tests for parameter length limits ## Security Best Practices Applied 1. **Defense in Depth**: Multiple layers of validation ensure security even if one layer fails 2. **Fail Secure**: Invalid input causes errors rather than being silently processed 3. **Input Validation**: All user input is validated and sanitized before use 4. **Least Privilege**: Only necessary characters are allowed in cache keys 5. **Consistent Security**: Security checks are centralized in reusable components ## Testing Results All security tests pass successfully: - ✅ 124 tests passing - ✅ Path traversal prevention working at all levels - ✅ Cache poisoning prevention through sanitization - ✅ No regression in existing functionality ## Recommendations for Future Security 1. **Regular Security Audits**: Schedule periodic security reviews of the codebase 2. **Dependency Scanning**: Regularly update dependencies and scan for vulnerabilities 3. **Rate Limiting**: Consider implementing rate limiting for API operations 4. **Security Headers**: Ensure proper security headers are set in responses 5. **Logging**: Add security event logging for monitoring potential attacks ## Conclusion The security fixes successfully address the identified vulnerabilities while maintaining backward compatibility and existing functionality. The implementation follows security best practices with comprehensive test coverage to prevent regression.