mirror of
https://github.com/acedanger/shell.git
synced 2025-12-06 00:00:13 -08:00
- 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.
8.5 KiB
8.5 KiB
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 pipefailfor 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
readonlyfor constants - Uses
localfor 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:
evalstatements (if used, sanitize inputs extensively) - AVOID:
sourceor.with user-controlled paths - AVOID:
curl | bashorwget | shpatterns - AVOID: Uncontrolled
find -execoperations
Privilege Escalation
- Minimizes
sudousage 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.shfor 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:
# 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:
# 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.