Files
shell/immich/SECURITY-CHECKLIST.md

299 lines
8.9 KiB
Markdown

# Shell Script Security Checklist
This checklist provides comprehensive security validation for shell scripts, based on the security review of the Immich restoration system and broader shell script ecosystem.
## Critical Security Validations
### 1. Input Validation and Sanitization
#### ✅ Path Validation
- [ ] All paths validated against traversal attacks (`../`, `./`)
- [ ] Paths resolved with `realpath` to detect symlink attacks
- [ ] Strict character whitelist validation (`^[a-zA-Z0-9/_-]+$`)
- [ ] Absolute path requirements enforced where appropriate
- [ ] Path existence and permissions verified before operations
```bash
# SECURE: Comprehensive path validation
local resolved_path=$(realpath "$USER_PATH" 2>/dev/null || echo "$USER_PATH")
if [[ "$USER_PATH" =~ \.\. ]] || [[ "$resolved_path" =~ \.\. ]]; then
echo "Error: Path traversal detected"
exit 1
fi
if [[ ! "$USER_PATH" =~ ^[a-zA-Z0-9/_-]+$ ]]; then
echo "Error: Invalid characters in path"
exit 1
fi
```
#### ✅ Database Identifier Validation
- [ ] Database names validated with strict regex (`^[a-zA-Z0-9_]+$`)
- [ ] Usernames validated with alphanumeric patterns
- [ ] SQL parameters properly quoted in all operations
- [ ] No dynamic SQL construction without validation
```bash
# SECURE: SQL injection prevention
if [[ ! "$DB_NAME" =~ ^[a-zA-Z0-9_]+$ ]]; then
echo "Error: Invalid database name"
exit 1
fi
```
#### ✅ File Input Validation
- [ ] File extensions validated against whitelist
- [ ] File size limits enforced where appropriate
- [ ] MIME type validation for uploaded files
- [ ] File content scanning for malicious patterns
### 2. Command Injection Prevention
#### ✅ Variable Expansion Security
- [ ] All variables quoted in command contexts (`"$VAR"`)
- [ ] No `eval` usage without extreme validation
- [ ] No `exec` usage with user-controlled input
- [ ] Command substitution properly secured (`$(command)` vs backticks)
```bash
# SECURE: Proper variable quoting
if [[ "$USER_INPUT" =~ ^[a-zA-Z0-9_-]+$ ]]; then
result=$(some_command "$USER_INPUT")
fi
# INSECURE: Unquoted variables
result=$(some_command $USER_INPUT) # DON'T DO THIS
```
#### ✅ Command Construction
- [ ] No string concatenation for command building
- [ ] Array usage for complex command construction
- [ ] Proper escaping of special characters
- [ ] Validation before any `system()` or shell execution calls
### 3. File Operation Security
#### ✅ Archive Extraction Safety
- [ ] Use `--no-absolute-names` with tar extraction
- [ ] Extract to secure temporary directories first
- [ ] Validate archive contents before extraction
- [ ] Set restrictive permissions on temporary directories
```bash
# SECURE: Safe archive extraction
temp_dir=$(mktemp -d)
chmod 700 "$temp_dir"
tar --no-absolute-names -xzf "$ARCHIVE" -C "$temp_dir"
```
#### ✅ File Permission Management
- [ ] Set minimal required permissions
- [ ] Use numeric permissions for clarity
- [ ] Validate file ownership before operations
- [ ] Cleanup temporary files with secure deletion
#### ✅ Symlink Attack Prevention
- [ ] Use `realpath` to resolve symlinks before operations
- [ ] Validate final resolved paths
- [ ] Avoid following symlinks in sensitive operations
- [ ] Check for TOCTOU (Time-of-Check-Time-of-Use) races
### 4. Container and Service Security
#### ✅ Container Lifecycle Management
- [ ] Proper container startup verification
- [ ] Container health checks before operations
- [ ] Graceful container shutdown after operations
- [ ] Container cleanup on error conditions
```bash
# SECURE: Container lifecycle management
if ! docker ps -q --filter "name=mycontainer" | grep -q .; then
echo "Error: Container not running"
exit 1
fi
# Perform operations...
# Always cleanup
docker stop mycontainer 2>/dev/null || true
```
#### ✅ Service Dependencies
- [ ] Service availability checked before operations
- [ ] Graceful fallback when services unavailable
- [ ] Proper error handling for service failures
- [ ] Service state restoration on errors
#### ✅ Resource Management
- [ ] Proper cleanup of Docker containers
- [ ] Network resource cleanup
- [ ] File descriptor management
- [ ] Memory usage monitoring for large operations
### 5. Error Handling and Cleanup
#### ✅ Comprehensive Error Handling
- [ ] `set -e` used appropriately (not in test scripts)
- [ ] Error trap handlers implemented for cleanup
- [ ] All temporary resources cleaned up on exit
- [ ] Proper exit codes for different error conditions
```bash
# SECURE: Comprehensive cleanup
cleanup() {
if [[ -n "$TEMP_DIR" && -d "$TEMP_DIR" ]]; then
rm -rf "$TEMP_DIR"
fi
if [[ "$SERVICE_STOPPED" == "true" ]]; then
systemctl start myservice
fi
}
trap cleanup EXIT ERR
```
#### ✅ Information Disclosure Prevention
- [ ] No sensitive data in log files
- [ ] Error messages don't reveal system internals
- [ ] Proper handling of credentials in environment
- [ ] Secure temporary file naming
### 6. Logging and Monitoring
#### ✅ Security Event Logging
- [ ] All security-relevant events logged
- [ ] Timestamps included in all log entries
- [ ] Log rotation and retention policies
- [ ] No sensitive data in logs (passwords, tokens)
#### ✅ Monitoring Integration
- [ ] Critical operations have monitoring hooks
- [ ] Failure conditions trigger appropriate alerts
- [ ] Performance metrics collected for analysis
- [ ] Security events forwarded to SIEM if applicable
## Advanced Security Considerations
### 1. Privilege Management
- [ ] Scripts run with minimal required privileges
- [ ] `sudo` usage limited to specific commands, not entire scripts
- [ ] User context switching properly handled
- [ ] File ownership maintained correctly
### 2. Network Security
- [ ] HTTPS used for all external communications
- [ ] Certificate validation enabled
- [ ] Network timeouts configured appropriately
- [ ] No hardcoded URLs or endpoints
### 3. Data Protection
- [ ] Sensitive data encrypted at rest
- [ ] Secure deletion of temporary sensitive files
- [ ] Proper handling of backup data
- [ ] Data integrity verification
### 4. Race Condition Prevention
- [ ] File locking implemented for critical sections
- [ ] Atomic operations used where possible
- [ ] Proper ordering of operations
- [ ] TOCTOU vulnerabilities addressed
## Testing and Validation
### Security Testing Requirements
- [ ] Path traversal attack testing
- [ ] Command injection testing
- [ ] SQL injection testing (if applicable)
- [ ] Container security testing
- [ ] Error condition testing
- [ ] Privilege escalation testing
### Automated Security Scanning
- [ ] Static analysis tools integrated
- [ ] Dependency vulnerability scanning
- [ ] Container image security scanning
- [ ] Secrets detection in code
## Documentation Requirements
### Security Documentation
- [ ] Threat model documented
- [ ] Security assumptions documented
- [ ] Known limitations documented
- [ ] Security contact information provided
### Operational Security
- [ ] Deployment security requirements
- [ ] Monitoring and alerting setup
- [ ] Incident response procedures
- [ ] Regular security review schedule
## Common Anti-Patterns to Avoid
### ❌ Dangerous Practices
```bash
# DON'T: Unquoted variables
if [ $VAR = "value" ]; then
# DON'T: Command injection vulnerability
result=$(cat $USER_FILE)
# DON'T: Path traversal vulnerability
cp "$USER_PATH" /safe/location/
# DON'T: SQL injection vulnerability
mysql -e "SELECT * FROM users WHERE name='$USERNAME'"
# DON'T: Insecure temporary files
temp_file=/tmp/myfile.$$
```
### ✅ Secure Alternatives
```bash
# DO: Quoted variables
if [[ "$VAR" = "value" ]]; then
# DO: Input validation
if [[ "$USER_FILE" =~ ^[a-zA-Z0-9/_-]+$ ]]; then
result=$(cat "$USER_FILE")
fi
# DO: Path validation
if [[ "$USER_PATH" =~ ^[a-zA-Z0-9/_-]+$ ]] && [[ ! "$USER_PATH" =~ \.\. ]]; then
cp "$USER_PATH" /safe/location/
fi
# DO: Parameterized queries
if [[ "$USERNAME" =~ ^[a-zA-Z0-9_]+$ ]]; then
mysql -e "SELECT * FROM users WHERE name='$USERNAME'"
fi
# DO: Secure temporary files
temp_file=$(mktemp)
chmod 600 "$temp_file"
```
## Review Process
### Pre-Deployment Review
1. **Automated Scanning**: Run static analysis tools
2. **Manual Review**: Follow this checklist completely
3. **Security Testing**: Execute security test cases
4. **Documentation Review**: Verify security documentation
5. **Peer Review**: Have another developer review security aspects
### Post-Deployment Monitoring
1. **Log Analysis**: Monitor for security events
2. **Performance Monitoring**: Watch for unusual patterns
3. **Regular Reviews**: Schedule periodic security reviews
4. **Incident Response**: Maintain response procedures
### Continuous Security
1. **Security Updates**: Keep dependencies updated
2. **Threat Intelligence**: Monitor for new attack patterns
3. **Training**: Keep team updated on security practices
4. **Documentation**: Maintain current security documentation
---
*This checklist should be used for all shell script security reviews and updated based on new threats and best practices.*