OWASP ZAP Baseline Security Scan
Run a ZAP baseline security scan against the local application.
Workflow
Check prerequisites:
- Verify Docker is installed and running:
docker info - Check if
scripts/zap-baseline.shexists in the project
- Verify Docker is installed and running:
Execute scan:
- If the script exists, run:
bash scripts/zap-baseline.sh - If the script does not exist, inform the user that this project does not have a ZAP baseline scan configured
- If the script exists, run:
Analyze results:
- After the scan completes, read
zap-report.html(orzap-report.mdfor text) - Summarize findings:
- Total number of alerts by risk level (High, Medium, Low, Informational)
- Every alert reaches classification -- High, Medium, Low, and Informational alike. Risk
level orders the summary; it never filters it. Nothing is dropped before classification,
so no alert can leave the report unclassified. Medium+ alerts are listed first, in full (rule
ID, name, recommended fix); Low/Informational alerts are still listed, bucketed, and given a
reason, even when compressed to one line each. - Categorize findings as "infrastructure-level" (fix at CDN/proxy) vs "application-level" (fix in code)
- After the scan completes, read
Apply the impact-or-exploitability bar -- the same bar the
lisa-security-reviewskill defines; follow that skill, do not restate it. A ZAP alert is not a reproducer by itself: the alert names a pattern, not an exercised impact path.- Security (proven) -- the alert carries a reproducer and a bounded impact statement. The
reproducer counts only if its evidence kind reaches the claim's boundary under the
claim-evidence-mappingcontract (BCE-1, #1835): a ZAP request/response transcript is anhttp-transcriptand reaches thehttp-apiboundary only. An alert whose claim is about rendered UI (browser) or persisted state (data) needs evidence at that boundary -- a transcript never proves it. - Security (unproven) -- everything else, each with a one-line
reason(typically "alert only, no reproducer / no bounded impact", or "transcript does not reach the claim's boundary"). Unproven alerts are not dropped and not demoted out of the security summary -- they render in the unproven bucket so a reader still sees them. - Rename the unproven heading only if
security.review.unprovenBucketis set to something other thansecurity-unproven; no other classification changes.
- Security (proven) -- the alert carries a reproducer and a bounded impact statement. The
reproducer counts only if its evidence kind reaches the claim's boundary under the
Handle failures:
- If the scan failed, explain what failed and suggest concrete remediation steps
Execution
Run the scan now.