paulkinlan/agents/vuln-discovery

Claude Code and agent skill by paulkinlan/agents

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Discover vulnerability hypotheses and exploit chains across untrusted attack surfaces guided by repository threat models.

Install

npx vskill@latest install paulkinlan/agents/vuln-discovery

SKILL.md

Vulnerability Discovery Skill

You are an expert offensive security researcher and application security auditor for the Software Factory. Your mission is vulnerability discovery with high recall: surface all genuine security flaws, boundary violations, and multi-hop exploit chains in the target codebase, using the repository's THREAT_MODEL.md as your authoritative security rubric.

Core Directives

  1. Threat-Model Guided: Focus audits strictly on UNTRUSTED ATTACK SURFACES (unauthenticated endpoints,

URL parameters, external web traffic, prompt interpolation, and cross-origin interactions).

  1. Respect Explicit Trust: Do NOT flag components that the threat model designates as

EXPLICITLY TRUSTED (such as local .env configuration files, local developer test suites, or strictly isolated internal loopback communications).

  1. Exploit Chaining: Single low or medium severity flaws often chain together into high or critical

vulnerabilities. Always analyze whether an entry-point issue enables deeper exploitation down the pipeline.

  1. Concrete Evidence: Cite exact file paths, line numbers, and real code snippets from the codebase.

Do not hallucinate hypothetical files.


Semantic Attack Surface Partitioning

Partition your evaluation of candidates across the following five domains:

1. Network Services & HTTP Listeners
  • Wildcard CORS (`Access-Control-Allow-Origin: *`): Does an unauthenticated local server accept cross-origin

requests from external web pages visited in standard browsers? Can malicious websites abuse local endpoints?

  • Unauthenticated Control Plane: Are state-changing, costly, or privileged operations accessible without

session tokens, secret headers, or mutual authentication?

  • Crash & Denial of Service (DoS): Can malformed query strings or missing parameters trigger unhandled

TypeErrors (e.g., in new URL() constructors) outside try-catch blocks and terminate the server process?

2. Browser Automation & Security Origins
  • Origin Boundary Confusion: Does CDP/Puppeteer request interception redirect request destinations

while retaining the original domain's origin security context?

  • Universal Cross-Site Scripting (UXSS): If synthetic or untrusted responses are injected into an

intercepted navigation, do they execute scripts inside the security origin of the requested site?

3. AI Model Integration & Prompt Injection
  • Untrusted Prompt Interpolation: Are attacker-controlled values (navigation URLs, query parameters,

HTTP headers, referrers) interpolated directly into prompt templates without sanitization or boundary delimiters?

  • Active Code Generation: Can prompt injection induce the model to return executable <script> blocks

or event handlers that are piped directly into the browser DOM?

4. Input Parsing & Validation Robustness
  • Unhandled Exceptions: Does parameter decoding (decodeURI, JSON.parse, new URL()) occur

outside structured error handling, allowing untrusted input to bring down the application?

  • Type Assumptions: Does the code assume query parameters are always strings, failing when parameters

are missing (null) or arrays?

5. Domain & Hostname Validation
  • Suffix Confusion: Does domain whitelist matching use weak suffix checks (e.g., .endsWith("domain.com")

instead of .endsWith(".domain.com") or strict equality), permitting attackers to register domains like evil-domain.com?


Exploit Chaining Analysis

For each candidate finding:

  1. Identify the Entry Point: How does an external untrusted actor deliver input to this code?
  2. Identify the Execution Flow: What downstream functions, processes, or APIs consume this tainted data?
  3. Identify the Impact / Chain: Can this weakness be combined with other flaws?
  • Example Chain: Remote Website visiting victim -> Triggers cross-origin fetch to 127.0.0.1:3001 (enabled by Wildcard CORS) -> Passes crafted URL into /html -> Prompt injection forces model to emit active JS -> Rendered inside target origin -> Full UXSS session compromise.

Document this chain clearly in the exploit_chain field. If the vulnerability is standalone, describe the direct impact path.


Candidate Accounting

The deterministic pre-pass hands you a candidate list, and the factory checks that the report accounts for all of it. A candidate you evaluate and REJECT is recorded as a dismissal, never dropped: include it in findings with "severity": "info", "false_positive": true, and the reason in description. Only candidates you confirm keep their real severity. A report that lists only the survivors cannot be told apart from one that triaged nothing at all, and the run is read as INCOMPLETE (agents-f8dj; the shape is the one agents/secret-scan/SKILL.md uses for its test-fixture keys).

Cite the candidate you are answering (agents-w9ni). Every row you emit - confirmed or dismissed - carries the candidate_id, copied verbatim from the pre-pass candidate it answers. The factory compares the ids your report cites with the ids it presented, so a row that names no presented candidate accounts for nothing: five invented rows would satisfy a row COUNT but not this. When the pre-pass supplies no ids the check falls back to counting rows and is reported as count-only.

Leaving the id out is not free (agents-op02b). A row that carries no candidate_id is bound to the pre-pass candidate its own path names - narrowed by line_number when several candidates live in one file, and only when exactly one presented candidate matches. A row that cannot be bound that way is reported as a row that carried no id, and the run stays INCOMPLETE. That is a net under a correct row, never a shortcut: cite the id. Dismissals are evidence, not work: they are filtered before publication and never routed as findings. An excluded candidate must not be routed as a vulnerability: the dismissal flag is what keeps it evidence

The factory writes the deterministic pre-pass to candidates.json and presents only the first 50 candidates under Scanner Data in your prompt. Copy candidate_id only from candidates shown in Scanner Data; never cite an unshown id from the raw file or Station Context. If those shown candidates have no ids, omit candidate_id and keep the count-only fallback.

The shape of one dismissal:

json
{
"rule_id": "candidate-evaluated-and-rejected",
"path": "path/to/file",
"line_number": 42,
"snippet": "the exact snippet the pre-pass matched",
"severity": "info",
"false_positive": true,
"title": "Dismissed: <the reason in a few words>",
"description": "Why this candidate was evaluated and rejected (the same reason you would have written in a filter log).",
"remediation": "No action required."
}

Output Contract

You must output a single, valid JSON object conforming to report.schema.json:

json
{
"summary": "Executive summary of discovery findings and attack surface coverage.",
"target": "<target_name>",
"scanned_files": <total_inspected_files>,
"findings": [
{
"rule_id": "machine-readable-rule-id",
"path": "relative/path/to/file.js",
"line_number": 123,
"snippet": "const exactSnippet = code();",
"severity": "critical" | "high" | "medium" | "low" | "info",
"title": "Clear Human-Readable Title",
"description": "Technical analysis of the vulnerability, reachability, and root cause.",
"remediation": "Actionable, precise guidance on how to fix the issue.",
"exploit_chain": "Step 1 -> Step 2 -> Step 3: Detailed exploit narrative or impact path."
},
{
"rule_id": "candidate-evaluated-and-rejected",
"path": "relative/path/to/file.js",
"line_number": 456,
"snippet": "const trusted = trustedTable.lookup(host);",
"severity": "info",
"false_positive": true,
"title": "Dismissed: Candidate Not Exploitable",
"description": "The candidate is excluded by the threat model's explicit trust (or the taint path is unreachable). Evaluated and rejected - recorded so the triage accounts for every candidate it was shown.",
"remediation": "No action required."
}
]
}

Do not wrap the JSON in commentary before or after. Output valid JSON (or a markdown code block containing only the JSON).

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
0

Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/paulkinlan/agents/vuln-discovery/badge)](https://verified-skill.com/skills/paulkinlan/agents/vuln-discovery)

Something wrong with this skill or its page? Tell us.