Skip to content

πŸ” Audit & Vulnerability Check #12

πŸ” Audit & Vulnerability Check

πŸ” Audit & Vulnerability Check #12

Workflow file for this run

name: πŸ” Audit & Vulnerability Check
on:
pull_request:
branches: [main, develop]
push:
branches: [main, develop]
schedule:
- cron: "0 0 * * 0" # Weekly on Sunday
jobs:
audit:
runs-on: ubuntu-latest
name: Check Dependencies & Audits
permissions:
contents: read
pull-requests: write
steps:
- name: πŸ“₯ Checkout code
uses: actions/checkout@v4
- name: 🟒 Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
- name: πŸ¦€ Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: πŸ“¦ Check backend audits
id: backend-audit
working-directory: ./backend
run: |
npm install --prefer-offline --no-audit 2>&1 | head -20
AUDIT_JSON=$(npm audit --json 2>/dev/null || echo '{"metadata":{"vulnerabilities":{"critical":0,"high":0,"moderate":0}}}')
CRITICAL=$(echo "$AUDIT_JSON" | jq '.metadata.vulnerabilities.critical // 0')
HIGH=$(echo "$AUDIT_JSON" | jq '.metadata.vulnerabilities.high // 0')
MODERATE=$(echo "$AUDIT_JSON" | jq '.metadata.vulnerabilities.moderate // 0')
echo "backend_critical=$CRITICAL" >> $GITHUB_OUTPUT
echo "backend_high=$HIGH" >> $GITHUB_OUTPUT
echo "backend_moderate=$MODERATE" >> $GITHUB_OUTPUT
echo "### πŸ” Backend Audit Results" >> $GITHUB_STEP_SUMMARY
echo "| Severity | Count |" >> $GITHUB_STEP_SUMMARY
echo "|----------|-------|" >> $GITHUB_STEP_SUMMARY
echo "| Critical | $CRITICAL |" >> $GITHUB_STEP_SUMMARY
echo "| High | $HIGH |" >> $GITHUB_STEP_SUMMARY
echo "| Moderate | $MODERATE |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if (( CRITICAL > 0 )); then
echo "❌ **CRITICAL vulnerabilities detected**" >> $GITHUB_STEP_SUMMARY
echo "::error::Critical vulnerabilities in backend: $CRITICAL"
exit 1
fi
if (( HIGH > 0 )); then
echo "❌ **HIGH vulnerabilities detected**" >> $GITHUB_STEP_SUMMARY
echo "::error::High vulnerabilities in backend: $HIGH"
exit 1
fi
- name: πŸ“¦ Check frontend audits
id: frontend-audit
working-directory: ./frontend
run: |
npm install --prefer-offline --no-audit 2>&1 | head -20
AUDIT_JSON=$(npm audit --json 2>/dev/null || echo '{"metadata":{"vulnerabilities":{"critical":0,"high":0,"moderate":0}}}')
CRITICAL=$(echo "$AUDIT_JSON" | jq '.metadata.vulnerabilities.critical // 0')
HIGH=$(echo "$AUDIT_JSON" | jq '.metadata.vulnerabilities.high // 0')
MODERATE=$(echo "$AUDIT_JSON" | jq '.metadata.vulnerabilities.moderate // 0')
echo "frontend_critical=$CRITICAL" >> $GITHUB_OUTPUT
echo "frontend_high=$HIGH" >> $GITHUB_OUTPUT
echo "frontend_moderate=$MODERATE" >> $GITHUB_OUTPUT
echo "### πŸ” Frontend Audit Results" >> $GITHUB_STEP_SUMMARY
echo "| Severity | Count |" >> $GITHUB_STEP_SUMMARY
echo "|----------|-------|" >> $GITHUB_STEP_SUMMARY
echo "| Critical | $CRITICAL |" >> $GITHUB_STEP_SUMMARY
echo "| High | $HIGH |" >> $GITHUB_STEP_SUMMARY
echo "| Moderate | $MODERATE |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if (( CRITICAL > 0 )); then
echo "❌ **CRITICAL vulnerabilities detected**" >> $GITHUB_STEP_SUMMARY
echo "::error::Critical vulnerabilities in frontend: $CRITICAL"
exit 1
fi
if (( HIGH > 0 )); then
echo "❌ **HIGH vulnerabilities detected**" >> $GITHUB_STEP_SUMMARY
echo "::error::High vulnerabilities in frontend: $HIGH"
exit 1
fi
- name: οΏ½ Check Cargo audit (contract)
id: contract-audit
run: |
if [ -d "./contract" ] && [ -f "./contract/Cargo.toml" ]; then
echo "Installing cargo-audit..."
cargo install cargo-audit --quiet 2>&1 | grep -v "already installed" || true
cd ./contract
AUDIT_OUTPUT=$(cargo audit --json 2>/dev/null || echo '{"vulnerabilities":[]}')
CRITICAL=$(echo "$AUDIT_OUTPUT" | jq '[.vulnerabilities[] | select(.severity=="critical")] | length' 2>/dev/null || echo "0")
HIGH=$(echo "$AUDIT_OUTPUT" | jq '[.vulnerabilities[] | select(.severity=="high")] | length' 2>/dev/null || echo "0")
TOTAL=$(echo "$AUDIT_OUTPUT" | jq '.vulnerabilities | length' 2>/dev/null || echo "0")
echo "contract_critical=$CRITICAL" >> $GITHUB_OUTPUT
echo "contract_high=$HIGH" >> $GITHUB_OUTPUT
echo "contract_total=$TOTAL" >> $GITHUB_OUTPUT
echo "### πŸ” Contract (Cargo) Audit Results" >> $GITHUB_STEP_SUMMARY
echo "| Severity | Count |" >> $GITHUB_STEP_SUMMARY
echo "|----------|-------|" >> $GITHUB_STEP_SUMMARY
echo "| Critical | $CRITICAL |" >> $GITHUB_STEP_SUMMARY
echo "| High | $HIGH |" >> $GITHUB_STEP_SUMMARY
echo "| Total | $TOTAL |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if (( CRITICAL > 0 )); then
echo "❌ **CRITICAL vulnerabilities detected**" >> $GITHUB_STEP_SUMMARY
echo "::error::Critical Cargo vulnerabilities: $CRITICAL"
exit 1
fi
if (( HIGH > 0 )); then
echo "❌ **HIGH vulnerabilities detected**" >> $GITHUB_STEP_SUMMARY
echo "::warning::High Cargo vulnerabilities: $HIGH"
fi
else
echo "contract_critical=0" >> $GITHUB_OUTPUT
echo "contract_high=0" >> $GITHUB_OUTPUT
echo "contract_total=0" >> $GITHUB_OUTPUT
fi
- name: πŸ’¬ Comment on PR with audit summary
if: github.event_name == 'pull_request' && always()
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const backendCritical = '${{ steps.backend-audit.outputs.backend_critical }}' || '0';
const backendHigh = '${{ steps.backend-audit.outputs.backend_high }}' || '0';
const frontendCritical = '${{ steps.frontend-audit.outputs.frontend_critical }}' || '0';
const frontendHigh = '${{ steps.frontend-audit.outputs.frontend_high }}' || '0';
const contractCritical = '${{ steps.contract-audit.outputs.contract_critical }}' || '0';
const contractHigh = '${{ steps.contract-audit.outputs.contract_high }}' || '0';
const comment = '## πŸ” Security Audit Summary\n\n**Backend (npm):**\n- πŸ”΄ Critical: ' + backendCritical + '\n- 🟠 High: ' + backendHigh + '\n\n**Frontend (npm):**\n- πŸ”΄ Critical: ' + frontendCritical + '\n- 🟠 High: ' + frontendHigh + '\n\n**Contract (Cargo):**\n- πŸ”΄ Critical: ' + contractCritical + '\n- 🟠 High: ' + contractHigh + '\n\nRun locally with: `./scripts/check-audits.sh`';
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
});