vuln-scan
Systematic vulnerability scan across injection, auth, data exposure, and dependencies — traced by reading code, not grepping for keywords.
Skill by epicsagas
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/epicsagas-vuln-scan
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: data, security
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/vuln-scan
What's inside
- Skill name
vuln-scan- Description
- Systematic vulnerability scan across injection, auth, data exposure, and dependencies — traced by reading code, not grepping for keywords. Use when scanning for vulnerabilities, reviewing security, or validating threat models.
- License
- Apache-2.0
- Instructions
- 142 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Vuln Scan — Systematic Vulnerability Scanner
## Iron Law
Code you haven't traced from input to sink has vulnerabilities you haven't found. A grep hit is a lead, not a finding.
## Process
### Step 0: Load Engagement Context
Check for `.harness/engagement.md`. If present, load scope constraints — only scan in-scope paths and respect exclusions.
Check for `THREAT_MODEL.md` from a previous `/threat-model` run. If present, use its threat scenarios as scan targets. If absent, run full-surface scan.
### Step 1: Map Entry Points to Trust Boundaries
Enumerate every place untrusted data enters the system, by reading the code:
- **External → app**: HTTP handlers/routers, GraphQL resolvers, webhooks, file uploads, form fields, query params, headers
- **Process boundary**: CLI args, environment variables, IPC, deserialization of stored data (cache, DB rows written earlier, config files)
- **Client-supplied state**: cookies, JWT claims, API keys, referer/origin
For each entry point, note: what validation exists (yes/no/partial), and where the data flows next. This list is the scan's backbone — a scan that cannot name its entry points has not started.
### Step 2: Trace Data Flow to Sinks
From each entry point, follow the data by reading code until it reaches a dangerous operation, or dies (validated, parameterized, dropped). Dangerous sink classes:
| Sink class | Examples (non-exhaustive) |
|-----------|--------------------------|
| Command/code execution | shell invocation, `eval`-family, template engines with code modes, deserialization to live objects |
| Query construction | string-built SQL, raw-query escapes in any ORM (Knex `raw`, Prisma `$queryRaw`, SQLAlchemy `text()`, Sequelize `literal`, Django `extra`/`raw`, Rails `where("...")` with interpolation) |
| Filesystem | path joins with user input, upload destinations, archive extraction (zip-slip), file reads driven by request params |
| Web output | template rendering with non-auto-escaping engines, `innerHTML`-family, redirect targets, header values (CRLF) |
| Auth decisions | IDOR — object lookups keyed only on user-supplied ids without ownership checks; role checks done client-side or per-endpoint instead of per-object |
Read the surrounding code for every candidate sink. A sink that only receives validated/parameterized data is not a finding; a sink reachable from an entry point with no validation is.
### Step 3: Reason About Encoding and Context at Each Sink
For each reachable sink, ask what context the data lands in and whether the encoding matches:
- Interpolated into a SQL string? → parameterize, don't escape
- Interpolated into a shell string? → arg-array execution, don't quote
- Rendered into HTML/JS/CSS/URL? → each needs context-specific output encoding; auto-escaping templates cover HTML only when actually enabled for that template
- Joined into a path? → canonicalize, then verify containment inside the intended root
- Deserialized? → prefer format + type that cannot instantiate attacker-chosen types
### Step 4: Auth & Data-Exposure Pass
- **Default-deny**: routes/actions missing an auth middleware or check entirely — enumerate handlers and look for the gaps, not the checks
- **Object-level authorization**: for each handler that reads/writes a user-owned object, is ownership verified on THIS request?
- **Secrets**: hardcoded credentials vs. config/env references; secrets in logs, error messages, client bundles, API responses
- **Error leakage**: verbose errors/stack traces/config in production paths; error messages that distinguish "no such user" from "wrong password"
### Step 5: Dependency Pass
```bash
cargo audit 2>/dev/null || echo "cargo-audit not installed" # Rust
npm audit 2>/dev/null || echo "npm audit not available" # Node.js
```
For each advisory: is a fix available, and is the vulnerable code path actually reachable from this codebase's usage? Unreachable advisories are LOW/INFO, not silent drops. Also flag actively-used dependencies that are unmaintained (no release in ~2+ years, archived repo) even without a CVE.
### Grep as Accelerator, Not Oracle
Grep is fine for *candidate* sink locations (`raw(`, `exec`, `innerHTML`, `eval`, secret-ish identifiers) — use it to shortlist where to read. It misses framework-specific sinks, aliases, and data built across files. Never report a finding from a grep hit alone; never conclude "clean" because grep found nothing.
### Step 6: Produce Output
Write `VULN-FINDINGS.json`:
```json
{
"scan_date": "ISO-8601",
"scope": "full | incremental",
"threat_model_ref": "THREAT_MODEL.md | null",
"entry_points_traced": ["list every entry point examined — required for clean scans"],
"findings": [
{
"id": "V1",
"dimension": "injection | auth | exposure | dependency",
"severity": "CRITICAL | HIGH | MEDIUM | LOW | INFO",
"file": "path/to/file",
"line": 42,
"source": "untrusted-input origin (entry point)",
"sink_chain": ["entry function", "...", "sink function"],
"description": "what was found",
"validated": true,
"false_positive": false,
"reachable": true,
"mitigated": false,
"threat_scenario": "T1 | null",
"remediation": "one-line fix hint"
}
],
"summary": {
"total": 10,
"critical": 1,
"high": 3,
"medium": 4,
"low": 2,
"false_positives": 0
}
}
```
### Step 7: Feed into Triage
After producing findings, suggest:
**"Run `/triage` to validate findings with adversarial review."**
## Anti-Rationalization
| Excuse | Rebuttal | What to do instead |
|--------|----------|-------------------|
| "It's an internal tool / not user-facing" | Internal boundaries are attack surfaces — lateral movement starts inside. | Trace internal entry points with the same rigor. |
| "The framework sanitizes automatically" | Auto-escaping and parameterization have opt-outs, raw escapes, and edges; business logic is framework-agnostic. | Find the raw/dangerous escapes and read them. |
| "We'll add validation later" | Later never arrives for paths that already work. | Finding = now; remediation line goes in the output. |From epicsagas/epic-harness, Apache-2.0.
More from epicsagas/epic-harness
- 0.629score
threat-model
epicsagas
Threat modeling and attack surface analysis.
SkillAFreshness: A★ 19Claude Code +9 - 0.629score
agent-introspection
epicsagas
Loop-breaking self-diagnosis.
SkillAFreshness: A★ 19Claude Code +9 - 0.629score
team
epicsagas
Org-level agent team designer via `epic team` CLI (cross-project, append-merge).
SkillAFreshness: A★ 19Claude Code +9 - 0.629score
triage
epicsagas
Adversarial validation of vulnerability findings.
SkillAFreshness: A★ 19Claude Code +9 - 0.629score
benchmark
epicsagas
Executes Bare-vs-Epic A/B benchmarking, Ring 0 Guard 50 challenge, and full golden set evaluation for epic-harness.
SkillAFreshness: A★ 19Claude Code +9 - 0.629score
document
epicsagas
Documentation generator for public APIs, functions, and modules.
SkillAFreshness: A★ 19Claude Code +9 - 0.626score
context
epicsagas
Working-state snapshot guidance.
SkillAFreshness: A★ 19Claude Code +9 - 0.626score
orbit
epicsagas
State-persisted autonomous pipeline: spec → go → audit → eval → ship → evolve in one command.
SkillAFreshness: A★ 19Claude Code +9 - 0.626score
orchestrate
epicsagas
Trigger: active multi-agent run.
SkillAFreshness: A★ 19Claude Code +9 - 0.626score
evolve
epicsagas
Ring 3 evolution engine.
SkillAFreshness: A★ 19Claude Code +9 - 0.626score
go
epicsagas
Go phase.
SkillAFreshness: A★ 19Claude Code +9 - 0.626score
eval
epicsagas
Quality and performance evaluation with baseline comparison.
SkillAFreshness: A★ 19Claude Code +9
Signals
- Stars
- 19
- Forks
- 5
- Open issues
- 3
- Last commit (this folder)
- Aug 31, 2026 (1 month ago)
- Last release
- Oct 23, 2026 (4 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- Apache-2.0
- Repository
- github.com/epicsagas/epic-harness
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from epicsagas
- 0.641score
book-visuals
epicsagas
Book visual system: art bible and look lock, figure plan per chapter, code-rendered diagrams/charts/technical drawings, diffusion-generated illustrations and…
SkillAFreshness: A★ 38Claude Code +9 - 0.638score
book-game
epicsagas
Game narrative craft reference: branching architecture, quest design, dialogue systems, lore bible, player agency, and game-writing AI tells.
SkillAFreshness: A★ 38Claude Code +9 - 0.638score
book-academic
epicsagas
Academic writing craft reference: IMRAD and discipline structures, literature review, argument chains, citation integrity, academic register in en/ko/ja, and…
SkillAFreshness: A★ 38Claude Code +9 - 0.638score
book-draft
epicsagas
Phase 3: Drafting.
SkillAFreshness: A★ 38Claude Code +9 - 0.638score
book-fiction
epicsagas
Fiction craft reference for all subgenres: structure options, scene design, character depth, dialogue, POV and distance, the fiction-specific AI tells, and…
SkillAFreshness: A★ 38Claude Code +9 - 0.638score
book-edit
epicsagas
Phase 4: Editing.
SkillAFreshness: A★ 38Claude Code +9
Cite this page
vuln-scan skill. Agent Mart. https://agentmart.dev/skills/epicsagas-vuln-scan (last updated 2026-10-24)