| name | visa-vulnerability-agentic-harness |
| description | AI-powered SAST pipeline for autonomous vulnerability discovery using LLMs with multi-stage analysis, threat modeling, and SARIF output |
| triggers | ["scan this repository for security vulnerabilities","run VVAH security scan on my code","set up vulnerability scanning with AI agents","analyze attack surface and threats","generate SARIF report for security findings","estimate cost for vulnerability scan","configure VVAH for my project","troubleshoot VVAH scan errors"] |
Visa Vulnerability Agentic Harness (VVAH) Skill
Skill by ara.so — AI Agent Skills collection.
VVAH is Visa's open-source harness for autonomous vulnerability discovery using frontier AI models. It implements a 9-stage pipeline: attack surface mapping → threat modeling → multi-lens research → adversarial verification → exploit chaining → SARIF reporting. Designed to reduce Mean Time to Adapt (MTTA) from AI-discovered weakness to validated fix.
Installation
Prerequisites:
- Python ≥ 3.10
- Claude Code session (
claude login) OR API key (Anthropic/OpenAI)
Install into virtual environment (recommended):
python3 -m venv .venv
source .venv/bin/activate
pip install .
Or install globally with pipx:
pipx install .
This installs the vvaharness CLI command.
Configuration
Initial setup:
cp .env.example .env
Backend selection (via profiles):
The default profile uses via: cli (Claude Code) for all stages. To customize:
cp vvaharness/config/profiles/full.yaml ./config.yaml
Profile structure:
roles:
surface_explorer:
via: cli
model: claude-sonnet-4-6
computer_use: false
threat_modeler:
via: sdk
model: claude-opus-4
temperature: 1.0
vulnerability_researcher:
via: openai
model: gpt-4
base_url: ${OPENAI_BASE_URL}
Environment variables:
CLAUDE_CODE_OAUTH_TOKEN=your_token_here
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
ANTHROPIC_SDK_API_KEY=sk-ant-xxxxx
ANTHROPIC_SDK_BASE_URL=https://your-gateway.com
ANTHROPIC_SDK_CA_CERT=/path/to/ca.pem
ANTHROPIC_SDK_CLIENT_CERT=/path/to/client.pem
OPENAI_API_KEY=sk-xxxxx
OPENAI_BASE_URL=https://api.openai.com/v1
NODE_EXTRA_CA_CERTS=/path/to/ca-bundle.pem
Key Commands
Setup and Validation
vvaharness doctor
vvaharness setup
vvaharness setup --install-agents
Cost Estimation
vvaharness estimate --repo /path/to/target
vvaharness estimate --repo https://github.com/org/repo --application-id 12345
Single Repository Scan
vvaharness scan --repo /path/to/target --application-id 12345
vvaharness scan \
--repo /path/to/target \
--application-id 12345 \
--config ./custom-config.yaml
vvaharness scan \
--repo /path/to/target \
--application-id 12345 \
--module backend
vvaharness scan --repo /path/to/target --dry-run
Batch Scanning
vvaharness scan \
--repo-file repos.csv \
--workspace ./scans \
--group-by-app \
--keep-clones
Output Locations
Scan outputs are written to <target>/security-scan/:
<target>/
└── security-scan/
├── <module>_<timestamp>_report.md # Human-readable findings
├── <module>_<timestamp>_report.sarif # SARIF 2.1.0 format
├── <module>_<timestamp>_errors.jsonl # Non-fatal errors
└── run_manifest.json # Metadata (version, models, git SHA)
Pipeline Stages
VVAH runs a 9-stage pipeline across three phases:
Discovery & Modeling (S1-S3):
- S1: Attack surface mapping (code, CMDB, CVE, controls)
- S2: Threat modeling (STRIDE, OWASP, trust boundaries)
- S3: Vulnerability research strategy (taint, API boundaries)
Deep Dive & Verification (S4-S6):
- S4: Multi-lens research (Language, Crypto, Logic, Access Control, IaC)
- S5: Policy gates
- S6: Adversarial verification (exploit chains, trust boundaries)
Synthesis & Reporting (S7-S9):
- S7: Deduplication
- S8: Exploit chain construction (CWE, attack paths)
- S9: SARIF emission
Configuration Examples
Budget Controls
step4:
max_budget_usd: 5.0
max_budget_usd_per_finding: 0.50
step6:
max_budget_usd: 3.0
verification_passes: 3
Language-Specific Research
lenses:
- name: language_specific
languages: [python, java, javascript]
focus_areas:
- injection vulnerabilities
- unsafe deserialization
- path traversal
- name: crypto_specific
focus_areas:
- weak algorithms
- hardcoded keys
- IV reuse
- name: access_control
focus_areas:
- broken authorization
- privilege escalation
- IDOR
Model Selection Strategy
roles:
threat_modeler:
via: sdk
model: claude-opus-4
adversarial_reviewer:
via: sdk
model: claude-opus-4
vulnerability_researcher:
via: cli
model: claude-sonnet-4-6
exploit_strategist:
via: sdk
model: claude-sonnet-4-6
Common Patterns
Enterprise Gateway Setup
ANTHROPIC_SDK_BASE_URL=https://ai-gateway.corp.com
ANTHROPIC_SDK_CA_CERT=/etc/ssl/certs/corp-ca.pem
ANTHROPIC_SDK_CLIENT_CERT=/etc/ssl/certs/client.pem
ANTHROPIC_SDK_CLIENT_KEY=/etc/ssl/private/client-key.pem
NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-bundle.pem
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
CI/CD Integration
name: VVAH Security Scan
on:
pull_request:
branches: [main]
schedule:
- cron: '0 2 * * 1'
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install VVAH
run: |
python -m pip install --upgrade pip
pip install .
- name: Run scan
env:
ANTHROPIC_SDK_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
vvaharness scan \
--repo . \
--application-id ${{ github.repository_id }} \
--config .vvah-config.yaml
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: security-scan/*_report.sarif
Programmatic Integration
import subprocess
import json
from pathlib import Path
def run_vvah_scan(repo_path: str, app_id: str) -> dict:
"""Run VVAH scan and return manifest."""
result = subprocess.run(
[
"vvaharness", "scan",
"--repo", repo_path,
"--application-id", app_id,
"--config", "config.yaml"
],
capture_output=True,
text=True,
check=True
)
manifest_path = Path(repo_path) / "security-scan" / "run_manifest.json"
with open(manifest_path) as f:
return json.load(f)
def estimate_scan_cost(repo_path: str) -> float:
"""Get cost estimate before running."""
result = subprocess.run(
["vvaharness", "estimate", "--repo", repo_path],
capture_output=True,
text=True,
check=True
)
for line in result.stdout.splitlines():
if "Estimated cost:" in line:
return float(line.split("$")[1])
return 0.0
Multi-Model Strategy
roles:
surface_explorer:
via: cli
model: claude-sonnet-4-6
threat_modeler:
via: sdk
model: claude-opus-4
temperature: 1.0
vulnerability_researcher:
via: openai
model: gpt-4-turbo
adversarial_reviewer:
via: sdk
model: claude-opus-4
Troubleshooting
Authentication Issues
vvaharness doctor
claude login
claude setup-token
echo $ANTHROPIC_SDK_API_KEY
echo $OPENAI_API_KEY
Budget Exceeded
cat config.yaml | grep max_budget_usd
step4:
max_budget_usd: 2.0
max_budget_usd_per_finding: 0.25
Gateway/Proxy Issues
curl -H "x-api-key: $ANTHROPIC_SDK_API_KEY" \
$ANTHROPIC_SDK_BASE_URL/v1/messages \
-d '{"model":"claude-sonnet-4","max_tokens":10,"messages":[{"role":"user","content":"hi"}]}'
openssl verify -CAfile $NODE_EXTRA_CA_CERTS $ANTHROPIC_SDK_CA_CERT
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
No Findings Generated
cat <repo>/security-scan/*_errors.jsonl
vvaharness scan --repo . --application-id 123 --verbose
grep -A5 "lenses:" config.yaml
SARIF Validation
npm install -g @microsoft/sarif-multitool
sarif-multitool validate security-scan/*_report.sarif
gh api repos/:owner/:repo/code-scanning/sarifs \
-F sarif=@security-scan/*_report.sarif
Performance Optimization
discovery:
include_patterns:
- "**/*.py"
- "**/*.js"
exclude_patterns:
- "**/node_modules/**"
- "**/venv/**"
- "**/*.test.js"
step6:
verification_passes: 1
Best Practices
- Always estimate first: Run
vvaharness estimate before full scans
- Use profiles: Copy and customize
profiles/full.yaml rather than editing defaults
- Stage budgets: Set
max_budget_usd per stage to prevent runaway costs
- Batch scans: Use
--repo-file + --group-by-app for multi-repo workflows
- Human review required: VVAH findings are triage candidates, not confirmed CVEs
- Keep manifests:
run_manifest.json tracks model versions for reproducibility
- Authorized use only: Scan only code you own or have permission to test
Output Format
Markdown Report Structure:
# Security Scan Report
## Executive Summary
- Total findings: X
- Critical: X | High: X | Medium: X | Low: X
## Findings
### F-001: SQL Injection in User Authentication
**Severity:** Critical
**CWE:** CWE-89
**Location:** src/auth/login.py:45-52
**Description:** User-controlled input flows to SQL query...
**Exploit Path:**
1. Attacker provides `' OR '1'='1` as username
2. Query becomes: `SELECT * FROM users WHERE username='' OR '1'='1'`
3. Authentication bypassed
**Remediation:**
- Use parameterized queries
- Apply input validation
## Dropped Findings
[Findings rejected during adversarial review]
SARIF 2.1.0 Structure:
{
"version": "2.1.0",
"runs": [{
"tool": {
"driver": {
"name": "VVAH",
"version": "1.0.0",
"rules": [...]
}
},
"results": [{
"ruleId": "CWE-89",
"level": "error",
"message": {"text": "SQL Injection in User Authentication"},
"locations": [{
"physicalLocation": {
"artifactLocation": {"uri": "src/auth/login.py"},
"region": {"startLine": 45, "endLine": 52}
}
}]
}]
}]
}