Files
shell/SECURITY-CHECKLIST.md
Peter Wood 0123fc6007 feat: Add comprehensive Plex recovery validation script
- Introduced `validate-plex-recovery.sh` for validating Plex database recovery.
- Implemented checks for service status, database integrity, web interface accessibility, API functionality, and recent logs.
- Added detailed recovery summary and next steps for users.

fix: Improve Debian patching script for compatibility

- Enhanced `debian-patches.sh` to securely download and execute bootstrap scripts.
- Updated package mapping logic and ensured proper permissions for patched files.

fix: Update Docker test scripts for better permission handling

- Modified `run-docker-tests.sh` to set appropriate permissions on logs directory.
- Ensured log files have correct permissions after test runs.

fix: Enhance setup scripts for secure installations

- Updated `setup.sh` to securely download and execute installation scripts for zoxide and nvm.
- Improved error handling for failed downloads.

fix: Refine startup script for log directory permissions

- Adjusted `startup.sh` to set proper permissions for log directories and files.

chore: Revamp update-containers.sh for better error handling and logging

- Rewrote `update-containers.sh` to include detailed logging and error handling.
- Added validation for Docker image names and improved overall script robustness.
2025-06-05 07:22:28 -04:00

269 lines
8.5 KiB
Markdown

# Shell Script Security Checklist
This checklist should be used for all new shell scripts and when modifying existing ones.
## Pre-Development Security Checklist
### Script Header Requirements
- [ ] Includes comprehensive header with author, version, and security notes
- [ ] Documents all parameters and their validation requirements
- [ ] Specifies required permissions and security considerations
- [ ] Includes usage examples with security implications
### Initial Security Setup
- [ ] Uses `set -euo pipefail` for strict error handling
- [ ] Defines readonly constants for sensitive paths and configurations
- [ ] Implements cleanup function with proper trap handling
- [ ] Validates all required dependencies and tools
## Input Validation and Sanitization
### Command Line Arguments
- [ ] Validates all positional parameters
- [ ] Checks parameter count and types
- [ ] Sanitizes file paths to prevent directory traversal
- [ ] Validates numeric inputs for bounds and format
- [ ] Rejects dangerous characters in string inputs
### Environment Variables
- [ ] Validates all used environment variables
- [ ] Provides secure defaults for missing variables
- [ ] Sanitizes environment-derived paths and commands
- [ ] Documents required environment setup
### File and Directory Operations
- [ ] Verifies file existence before operations
- [ ] Checks file permissions and ownership
- [ ] Validates file paths for traversal attempts
- [ ] Uses absolute paths where possible
- [ ] Implements proper temporary file handling
## Variable Usage and Quoting
### Variable Declaration
- [ ] Uses `readonly` for constants
- [ ] Uses `local` for function variables
- [ ] Initializes all variables before use
- [ ] Uses descriptive variable names
### Variable Expansion
- [ ] **CRITICAL:** All variables quoted in command contexts: `"$VARIABLE"`
- [ ] Array expansions properly quoted: `"${ARRAY[@]}"`
- [ ] Parameter expansions use braces: `"${VAR:-default}"`
- [ ] Command substitutions properly quoted: `RESULT="$(command)"`
### Dangerous Patterns to Avoid
- [ ] **NEVER:** Unquoted variables in commands: `command $VAR`
- [ ] **NEVER:** Unquoted variables in file operations: `rm $FILE`
- [ ] **NEVER:** Unquoted variables in loops: `for item in $LIST`
- [ ] **NEVER:** Unquoted variables in conditions: `if [ $VAR = "value" ]`
## Command Execution Security
### External Commands
- [ ] Validates command existence before execution
- [ ] Uses full paths for critical system commands
- [ ] Escapes or validates all command arguments
- [ ] Handles command failures appropriately
### Dangerous Command Patterns
- [ ] **AVOID:** `eval` statements (if used, sanitize inputs extensively)
- [ ] **AVOID:** `source` or `.` with user-controlled paths
- [ ] **AVOID:** `curl | bash` or `wget | sh` patterns
- [ ] **AVOID:** Uncontrolled `find -exec` operations
### Privilege Escalation
- [ ] Minimizes `sudo` usage to specific commands
- [ ] Uses service-specific users instead of root where possible
- [ ] Validates commands before privilege escalation
- [ ] Logs privilege escalation activities
## Network and Remote Operations
### Download Security
- [ ] **REQUIRED:** Download to temporary location first
- [ ] **RECOMMENDED:** Verify checksums or signatures
- [ ] **REQUIRED:** Validate content before execution
- [ ] Use HTTPS instead of HTTP where possible
- [ ] Implement timeout and retry logic
### API and Service Interactions
- [ ] Validates API responses before processing
- [ ] Uses authentication tokens securely
- [ ] Implements proper error handling for network failures
- [ ] Logs security-relevant activities
## Database and File System Security
### Database Operations
- [ ] Uses parameterized queries or proper escaping
- [ ] Validates database paths and names
- [ ] Implements backup and recovery procedures
- [ ] Handles database locks and corruption gracefully
### File System Security
- [ ] Sets appropriate file permissions (644 for files, 755 for directories)
- [ ] Validates ownership before operations
- [ ] Implements secure temporary file creation
- [ ] Cleans up temporary files in all exit scenarios
## Service and Container Management
### Service Operations
- [ ] Validates service state before operations
- [ ] Implements proper start/stop sequences
- [ ] Handles service failures gracefully
- [ ] Logs service management activities
### Container Security
- [ ] Validates container names and IDs
- [ ] Uses specific image tags instead of 'latest'
- [ ] Implements proper volume and network security
- [ ] Validates container health before operations
## Error Handling and Logging
### Error Handling Requirements
- [ ] Implements comprehensive error handling for all operations
- [ ] Uses appropriate exit codes (0 for success, 1-255 for various errors)
- [ ] Provides meaningful error messages
- [ ] Implements cleanup on error conditions
### Logging Security
- [ ] Logs security-relevant events
- [ ] Avoids logging sensitive information (passwords, tokens)
- [ ] Implements log rotation and retention policies
- [ ] Uses appropriate log levels (INFO, WARN, ERROR)
## Testing and Validation
### Security Testing
- [ ] **REQUIRED:** Run `bash -n script.sh` for syntax validation
- [ ] **RECOMMENDED:** Use ShellCheck for security analysis
- [ ] Test with various input combinations including edge cases
- [ ] Test error conditions and recovery procedures
### Manual Security Review
- [ ] Review all variable usage for proper quoting
- [ ] Verify all file operations use absolute paths
- [ ] Check for potential race conditions
- [ ] Review privilege requirements and usage
## Documentation Requirements
### Security Documentation
- [ ] Document all security assumptions
- [ ] List required permissions and privileges
- [ ] Document potential security risks
- [ ] Provide secure usage examples
### Operational Security
- [ ] Document deployment security requirements
- [ ] Specify required environment security
- [ ] Document integration security considerations
- [ ] Provide incident response procedures
## Code Review Checklist
### Pre-Commit Review
- [ ] All variables properly quoted
- [ ] No unvalidated user inputs
- [ ] Appropriate error handling implemented
- [ ] Security documentation updated
### Peer Review Requirements
- [ ] Security-critical changes reviewed by security-aware developer
- [ ] Privilege usage justified and documented
- [ ] External integrations reviewed for security implications
- [ ] Testing coverage includes security scenarios
## Deployment Security
### Production Deployment
- [ ] Environment variables secured and validated
- [ ] File permissions set appropriately
- [ ] Service accounts configured with minimal privileges
- [ ] Logging and monitoring configured
### Security Monitoring
- [ ] Failed authentication attempts logged
- [ ] Privilege escalation attempts logged
- [ ] Unusual file access patterns monitored
- [ ] Network connectivity anomalies tracked
## Maintenance and Updates
### Regular Security Maintenance
- [ ] Review and update security dependencies
- [ ] Update security documentation
- [ ] Review and rotate secrets and tokens
- [ ] Update security testing procedures
### Security Incident Response
- [ ] Document security incident procedures
- [ ] Implement security rollback procedures
- [ ] Define security escalation paths
- [ ] Regular security drills and testing
---
## Common Security Anti-Patterns
### ❌ DO NOT DO THIS:
```bash
# Unquoted variable in command
docker pull $IMAGE
# Unquoted variable in condition
if [ $STATUS = "active" ]; then
# Unquoted variable in loop
for file in $FILES; do
# Direct remote execution
curl -s https://example.com/script.sh | bash
# Excessive permissions
chmod 777 /path/to/file
# Unvalidated user input
rm -rf $USER_PROVIDED_PATH
```
### ✅ DO THIS INSTEAD:
```bash
# Quoted variable in command
docker pull "$IMAGE"
# Quoted variable in condition
if [[ "$STATUS" = "active" ]]; then
# Quoted variable in loop (or use array)
while IFS= read -r file; do
# process file
done <<< "$FILES"
# Secure remote execution
TEMP_SCRIPT=$(mktemp)
if curl -s https://example.com/script.sh -o "$TEMP_SCRIPT"; then
# Optionally verify checksum
bash "$TEMP_SCRIPT"
rm -f "$TEMP_SCRIPT"
fi
# Appropriate permissions
chmod 644 /path/to/file # or 755 for executables
# Validated user input
if [[ "$USER_PROVIDED_PATH" =~ ^[a-zA-Z0-9/_.-]+$ ]] && [[ -e "$USER_PROVIDED_PATH" ]]; then
rm -rf "$USER_PROVIDED_PATH"
else
echo "Invalid path provided"
exit 1
fi
```
---
**Remember:** Security is not a feature to be added later—it must be built in from the beginning. Use this checklist for every script, every time.