Automating Remediation Based on Scan Results

Automating Remediation Based on Scan Results

Create automated remediation scripts based on scanning outputs:

#!/usr/bin/env python3
# auto-remediate.py

import json
import subprocess
import re

def parse_trivy_results(filename):
    with open(filename) as f:
        data = json.load(f)
    
    vulnerabilities = []
    for result in data.get('Results', []):
        for vuln in result.get('Vulnerabilities', []):
            if vuln['Severity'] in ['CRITICAL', 'HIGH']:
                vulnerabilities.append({
                    'package': vuln['PkgName'],
                    'installed': vuln['InstalledVersion'],
                    'fixed': vuln.get('FixedVersion', 'No fix available'),
                    'severity': vuln['Severity']
                })
    
    return vulnerabilities

def generate_dockerfile_fixes(vulnerabilities):
    fixes = []
    
    for vuln in vulnerabilities:
        if vuln['fixed'] != 'No fix available':
            if 'apt' in vuln['package']:
                fixes.append(f"RUN apt-get update && apt-get install -y {vuln['package']}={vuln['fixed']}")
            elif 'pip' in vuln['package']:
                fixes.append(f"RUN pip install {vuln['package']}=={vuln['fixed']}")
    
    return fixes

def update_base_image(dockerfile_path, new_base):
    with open(dockerfile_path, 'r') as f:
        content = f.read()
    
    updated = re.sub(r'^FROM\s+(\S+)', f'FROM {new_base}', content, flags=re.MULTILINE)
    
    with open(f'{dockerfile_path}.secure', 'w') as f:
        f.write(updated)

# Main remediation workflow
if __name__ == '__main__':
    # Parse scan results
    vulns = parse_trivy_results('scan-results.json')
    
    # Generate fixes
    fixes = generate_dockerfile_fixes(vulns)
    
    print("Recommended Dockerfile updates:")
    for fix in fixes:
        print(f"  {fix}")
    
    # Update base image based on Snyk recommendations
    update_base_image('Dockerfile', 'node:18-alpine3.18')