node-red-contrib-wger
Version:
Node-RED nodes for integrating with wger workout and fitness tracker API
148 lines (117 loc) • 6.52 kB
Markdown
# 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.