Skip to main content
EVOKORE// WORKFLOWS / security-scan.yml
Agent-33workflow · 215 lines

.github/workflows/security-scan.yml

CI / automation

View on GitHub →
# REFERENCE-ONLY: GitHub Actions secrets referenced below are illustrative.
# Do not inject real credentials. See your CI/CD provider for proper secret management.
# Node.js 24 migration: COMPLETE (all actions Node 24 ready)
# - actions/checkout: v6
# - actions/cache: v5
# - aquasecurity/trivy-action: pinned v0.35.0 (SHA-locked)
# - github/codeql-action: v4
# - anthropics/claude-code-action: @beta (tracks latest)
name: Security Scan

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  trivy-fs:
    name: Dependency CVE Scan
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Restore Trivy DB cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/trivy
          key: trivy-db-${{ github.run_id }}
          restore-keys: trivy-db-

      - name: Run Trivy filesystem scan
        uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
        with:
          scan-type: fs
          scan-ref: ./engine
          scanners: vuln
          severity: CRITICAL,HIGH
          exit-code: "1"
          format: table

  trivy-image:
    name: Container Image Scan
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Restore Trivy DB cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/trivy
          key: trivy-db-${{ github.run_id }}
          restore-keys: trivy-db-

      - name: Create results directory
        run: mkdir -p results

      - name: Build Docker image
        run: docker build --pull -t agent33:${{ github.sha }} ./engine

      - name: Run Trivy image scan
        uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
        with:
          scan-type: image
          image-ref: agent33:${{ github.sha }}
          severity: CRITICAL,HIGH
          ignore-unfixed: true
          exit-code: "1"
          format: table

      - name: Export image scan for targeted CVE verification
        uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
        with:
          scan-type: image
          image-ref: agent33:${{ github.sha }}
          scanners: vuln
          vuln-type: os
          ignore-unfixed: false
          exit-code: "0"
          format: json
          output: results/trivy-image.json

      - name: Verify runtime image no longer reports CVE-2026-0861
        run: python scripts/verify_trivy_image.py results/trivy-image.json CVE-2026-0861

  trivy-config:
    name: IaC Misconfiguration Scan
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Restore Trivy DB cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/trivy
          key: trivy-db-${{ github.run_id }}
          restore-keys: trivy-db-

      - name: Run Trivy config scan
        uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
        with:
          scan-type: config
          scan-ref: ./engine
          severity: CRITICAL,HIGH,MEDIUM
          exit-code: "0"
          format: table

  trivy-secrets:
    name: Secret Leak Detection
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Restore Trivy DB cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/trivy
          key: trivy-db-${{ github.run_id }}
          restore-keys: trivy-db-

      - name: Run Trivy secret scan
        uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
        with:
          scan-type: fs
          scan-ref: .
          scanners: secret
          severity: CRITICAL,HIGH,MEDIUM
          exit-code: "1"
          format: table

  trivy-sarif:
    name: Trivy SARIF Upload
    runs-on: ubuntu-latest
    permissions:
      security-events: write
    steps:
      - uses: actions/checkout@v6

      - name: Restore Trivy DB cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/trivy
          key: trivy-db-${{ github.run_id }}
          restore-keys: trivy-db-

      - name: Create results directory
        run: mkdir -p results

      - name: Run Trivy scan (SARIF output)
        uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
        with:
          scan-type: fs
          scan-ref: ./engine
          scanners: vuln,secret
          severity: CRITICAL,HIGH,MEDIUM
          exit-code: "0"
          format: sarif
          output: results/trivy-results.sarif

      - name: Upload Trivy SARIF to GitHub Security
        uses: github/codeql-action/upload-sarif@v4
        if: always()
        with:
          sarif_file: results/trivy-results.sarif
          category: trivy

  claude-code-security:
    name: Claude Code Security Review
    runs-on: ubuntu-latest
    continue-on-error: true
    permissions:
      security-events: write
      contents: read
    if: github.event_name == 'pull_request'
    steps:
      - uses: actions/checkout@v6

      - name: Determine Claude security review mode (API key only)
        id: claude-review
        run: |
          if [ "${{ vars.ENABLE_CLAUDE_SECURITY_REVIEW }}" != "true" ]; then
            echo "enabled=false" >> "$GITHUB_OUTPUT"
            echo "reason=ENABLE_CLAUDE_SECURITY_REVIEW is not true" >> "$GITHUB_OUTPUT"
            exit 0
          fi

          if [ -z "${{ secrets.ANTHROPIC_API_KEY }}" ]; then
            echo "enabled=false" >> "$GITHUB_OUTPUT"
            echo "reason=ANTHROPIC_API_KEY is not configured" >> "$GITHUB_OUTPUT"
            exit 0
          fi

          echo "enabled=true" >> "$GITHUB_OUTPUT"
          echo "reason=enabled" >> "$GITHUB_OUTPUT"

      - name: Skip notice
        if: steps.claude-review.outputs.enabled != 'true'
        run: |
          echo "Skipping Claude Code Security Review: ${{ steps.claude-review.outputs.reason }}"

      - name: Run Claude Code Security Review
        if: steps.claude-review.outputs.enabled == 'true'
        uses: anthropics/claude-code-action@beta
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          model: claude-sonnet-4-20250514
          direct_prompt: |
            Review this PR for security vulnerabilities. Focus on:
            - Prompt injection risks in LLM-facing code
            - OWASP Top 10 vulnerabilities
            - Secrets exposure
            - Dependency vulnerabilities
            - Authentication/authorization bypasses
            Output findings in SARIF 2.1.0 format.
          timeout_minutes: 10