213 lines
6.9 KiB
Bash
213 lines
6.9 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Security Audit Script
|
||
|
|
# Runs comprehensive security checks on the codebase
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
echo "🔒 Starting Security Audit..."
|
||
|
|
|
||
|
|
# Colors for output
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
NC='\033[0m' # No Color
|
||
|
|
|
||
|
|
# Check if required tools are installed
|
||
|
|
check_tool() {
|
||
|
|
if ! command -v $1 &> /dev/null; then
|
||
|
|
echo -e "${YELLOW}Warning: $1 is not installed. Skipping $1 checks.${NC}"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
|
||
|
|
# Run ESLint security checks
|
||
|
|
echo "📋 Running ESLint security checks..."
|
||
|
|
if check_tool eslint; then
|
||
|
|
pnpm lint --filter "./packages/**" --filter "./services/**" 2>&1 | tee security-audit-eslint.log || true
|
||
|
|
echo -e "${GREEN}✓ ESLint security checks completed${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}⚠ ESLint not available${NC}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check for hardcoded secrets
|
||
|
|
echo "🔍 Checking for hardcoded secrets..."
|
||
|
|
if check_tool grep; then
|
||
|
|
# Common secret patterns
|
||
|
|
SECRET_PATTERNS=(
|
||
|
|
"password.*=.*['\"][^'\"]+['\"]"
|
||
|
|
"secret.*=.*['\"][^'\"]+['\"]"
|
||
|
|
"api[_-]?key.*=.*['\"][^'\"]+['\"]"
|
||
|
|
"token.*=.*['\"][^'\"]+['\"]"
|
||
|
|
"aws[_-]?secret[_-]?access[_-]?key"
|
||
|
|
"private[_-]?key.*=.*['\"][^'\"]+['\"]"
|
||
|
|
)
|
||
|
|
|
||
|
|
SECRETS_FOUND=0
|
||
|
|
for pattern in "${SECRET_PATTERNS[@]}"; do
|
||
|
|
if grep -r -i -E "$pattern" --include="*.ts" --include="*.js" --include="*.tsx" --include="*.jsx" \
|
||
|
|
--exclude-dir=node_modules --exclude-dir=dist --exclude-dir=build --exclude-dir=.next \
|
||
|
|
--exclude="*.test.ts" --exclude="*.spec.ts" . 2>/dev/null | grep -v "test-secret\|example\|placeholder\|TODO" > /dev/null; then
|
||
|
|
echo -e "${RED}⚠ Potential hardcoded secret found with pattern: $pattern${NC}"
|
||
|
|
SECRETS_FOUND=1
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ $SECRETS_FOUND -eq 0 ]; then
|
||
|
|
echo -e "${GREEN}✓ No hardcoded secrets found${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}⚠ Review potential secrets manually${NC}"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check for vulnerable dependencies
|
||
|
|
echo "📦 Checking for vulnerable dependencies..."
|
||
|
|
if check_tool pnpm; then
|
||
|
|
pnpm audit --audit-level moderate 2>&1 | tee security-audit-dependencies.log || true
|
||
|
|
echo -e "${GREEN}✓ Dependency audit completed${NC}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check for outdated dependencies
|
||
|
|
echo "🔄 Checking for outdated dependencies..."
|
||
|
|
if check_tool pnpm; then
|
||
|
|
pnpm outdated 2>&1 | tee security-audit-outdated.log || true
|
||
|
|
echo -e "${GREEN}✓ Outdated dependencies check completed${NC}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Run Trivy scan if available
|
||
|
|
echo "🔍 Running Trivy vulnerability scan..."
|
||
|
|
if check_tool trivy; then
|
||
|
|
trivy fs --severity HIGH,CRITICAL . 2>&1 | tee security-audit-trivy.log || true
|
||
|
|
echo -e "${GREEN}✓ Trivy scan completed${NC}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check for insecure TLS/SSL configurations
|
||
|
|
echo "🔐 Checking for insecure TLS/SSL configurations..."
|
||
|
|
if check_tool grep; then
|
||
|
|
INSECURE_TLS=0
|
||
|
|
if grep -r -i "tlsv1\|sslv3\|TLSv1.0\|TLSv1.1" --include="*.ts" --include="*.js" \
|
||
|
|
--exclude-dir=node_modules --exclude-dir=dist --exclude-dir=build . 2>/dev/null; then
|
||
|
|
echo -e "${RED}⚠ Insecure TLS/SSL versions found${NC}"
|
||
|
|
INSECURE_TLS=1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ $INSECURE_TLS -eq 0 ]; then
|
||
|
|
echo -e "${GREEN}✓ No insecure TLS/SSL configurations found${NC}"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check for SQL injection vulnerabilities
|
||
|
|
echo "💉 Checking for SQL injection vulnerabilities..."
|
||
|
|
if check_tool grep; then
|
||
|
|
SQL_INJECTION=0
|
||
|
|
# Check for string concatenation in SQL queries
|
||
|
|
if grep -r -E "query.*\+.*['\"]|query.*\$\{|query.*\`.*\$\{" \
|
||
|
|
--include="*.ts" --include="*.js" \
|
||
|
|
--exclude-dir=node_modules --exclude-dir=dist --exclude-dir=build \
|
||
|
|
--exclude="*.test.ts" --exclude="*.spec.ts" . 2>/dev/null; then
|
||
|
|
echo -e "${YELLOW}⚠ Potential SQL injection vulnerabilities found. Review queries manually.${NC}"
|
||
|
|
SQL_INJECTION=1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ $SQL_INJECTION -eq 0 ]; then
|
||
|
|
echo -e "${GREEN}✓ No obvious SQL injection patterns found${NC}"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check for XSS vulnerabilities
|
||
|
|
echo "🌐 Checking for XSS vulnerabilities..."
|
||
|
|
if check_tool grep; then
|
||
|
|
XSS=0
|
||
|
|
# Check for innerHTML usage without sanitization
|
||
|
|
if grep -r "innerHTML\|dangerouslySetInnerHTML" \
|
||
|
|
--include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" \
|
||
|
|
--exclude-dir=node_modules --exclude-dir=dist --exclude-dir=build \
|
||
|
|
--exclude="*.test.ts" --exclude="*.spec.ts" . 2>/dev/null; then
|
||
|
|
echo -e "${YELLOW}⚠ Potential XSS vulnerabilities found. Review innerHTML usage.${NC}"
|
||
|
|
XSS=1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ $XSS -eq 0 ]; then
|
||
|
|
echo -e "${GREEN}✓ No obvious XSS patterns found${NC}"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check for insecure random number generation
|
||
|
|
echo "🎲 Checking for insecure random number generation..."
|
||
|
|
if check_tool grep; then
|
||
|
|
INSECURE_RANDOM=0
|
||
|
|
if grep -r "Math\.random\|random\(\)" \
|
||
|
|
--include="*.ts" --include="*.js" \
|
||
|
|
--exclude-dir=node_modules --exclude-dir=dist --exclude-dir=build \
|
||
|
|
--exclude="*.test.ts" --exclude="*.spec.ts" . 2>/dev/null | grep -v "crypto\.randomBytes\|crypto\.getRandomValues"; then
|
||
|
|
echo -e "${YELLOW}⚠ Potential insecure random number generation found. Use crypto.randomBytes or crypto.getRandomValues.${NC}"
|
||
|
|
INSECURE_RANDOM=1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ $INSECURE_RANDOM -eq 0 ]; then
|
||
|
|
echo -e "${GREEN}✓ No insecure random number generation found${NC}"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Generate security audit report
|
||
|
|
echo "📊 Generating security audit report..."
|
||
|
|
REPORT_FILE="security-audit-report-$(date +%Y%m%d-%H%M%S).md"
|
||
|
|
cat > "$REPORT_FILE" << EOF
|
||
|
|
# Security Audit Report
|
||
|
|
|
||
|
|
**Date**: $(date)
|
||
|
|
**Auditor**: Automated Security Audit Script
|
||
|
|
**Scope**: The Order Monorepo
|
||
|
|
|
||
|
|
## Summary
|
||
|
|
|
||
|
|
This report contains the results of automated security checks.
|
||
|
|
|
||
|
|
## Checks Performed
|
||
|
|
|
||
|
|
1. ESLint Security Checks
|
||
|
|
2. Hardcoded Secrets Detection
|
||
|
|
3. Vulnerable Dependencies
|
||
|
|
4. Outdated Dependencies
|
||
|
|
5. Trivy Vulnerability Scan
|
||
|
|
6. TLS/SSL Configuration
|
||
|
|
7. SQL Injection Vulnerabilities
|
||
|
|
8. XSS Vulnerabilities
|
||
|
|
9. Insecure Random Number Generation
|
||
|
|
|
||
|
|
## Findings
|
||
|
|
|
||
|
|
See individual log files for detailed findings:
|
||
|
|
- \`security-audit-eslint.log\`
|
||
|
|
- \`security-audit-dependencies.log\`
|
||
|
|
- \`security-audit-outdated.log\`
|
||
|
|
- \`security-audit-trivy.log\`
|
||
|
|
|
||
|
|
## Recommendations
|
||
|
|
|
||
|
|
1. Review all findings and address high-priority issues
|
||
|
|
2. Update vulnerable dependencies
|
||
|
|
3. Implement security best practices
|
||
|
|
4. Conduct manual security review
|
||
|
|
5. Schedule penetration testing
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
1. Review security audit checklist: \`docs/governance/SECURITY_AUDIT_CHECKLIST.md\`
|
||
|
|
2. Review threat model: \`docs/governance/THREAT_MODEL.md\`
|
||
|
|
3. Address findings according to priority
|
||
|
|
4. Schedule follow-up audit
|
||
|
|
|
||
|
|
EOF
|
||
|
|
|
||
|
|
echo -e "${GREEN}✓ Security audit report generated: $REPORT_FILE${NC}"
|
||
|
|
echo ""
|
||
|
|
echo "🔒 Security Audit Complete!"
|
||
|
|
echo "📋 Review the audit report and log files for detailed findings."
|
||
|
|
echo "📝 Next steps:"
|
||
|
|
echo " 1. Review security-audit-report-*.md"
|
||
|
|
echo " 2. Address high-priority findings"
|
||
|
|
echo " 3. Schedule manual security review"
|
||
|
|
echo " 4. Conduct penetration testing"
|
||
|
|
|