Skills DirectorySearch all skills ↗

AI agent skill · by @Leanmcp

Security Repro

Build safe, local, defensive reproductions of ALREADY-PATCHED, publicly disclosed security vulnerabilities (CVEs, vendor advisories, AI-agent incidents) for whitepapers, control testing, and education. Use this skill whenever the user wants to reproduce, demonstrate, or write up a known vulnerability or security incident — phrases like "reproduce this CVE", "build a repro for", "demonstrate the EchoLeak/Cursor/postmark-mcp issue", "show how this exploit worked", "add a reproducibility guide", or "pull the NVD/CVE details for". It fetches advisory metadata from NVD and CVE.org, confirms the issue is fixed, and produces a vulnerable-vs-patched harness that is offline, loopback-only, and uses synthetic markers. It NEVER discovers, develops, or weaponizes new zero-days and refuses any unpatched or live-target request.

Archived 2026-10-23 · Source updated 2026-10-07 · License: MIT. Check the original repository for the latest version.

SKILL.md instructions

# security-repro

Reproduce **already-fixed, publicly disclosed** vulnerabilities so a reader can
see the failure mode and confirm the vendor's patch closes it. The audience is
a whitepaper or an internal control test. The output is a contrast: the
vulnerable behavior fires, the patched behavior refuses, and nothing real is
touched.

## The one hard line (read first)

This skill exists to reproduce **the past**, not to find **the new**. Everything
below flows from that.

- **Only patched or withdrawn issues.** If the vendor has not shipped a fix (or
  pulled the artifact), stop. Do not proceed on an open/unpatched issue, even a
  disclosed one.
- **Use the last known-vulnerable public version** that is already on the
  internet — the release *before* the fix. You are demonstrating something that
  already exists publicly, not creating it.
- **Never develop new exploitation.** No fuzzing for new bugs, no chaining, no
  variant discovery, no bypassing an *unfixed* control. If reproducing the
  disclosed mechanism faithfully would require inventing an undisclosed step
  (e.g. an escape whose mechanism was never published), leave that step out of
  scope and say so in writing.
- **Offline, loopback, synthetic.** No third-party host, no real credential, no
  real target, no real recipient, no persistence, no exfiltration. A successful
  reproduction means a **local marker or a policy decision is observed**, not
  that code ran on someone's machine or data left the lab.

If a request pushes past this line — reproduce an unpatched bug, target real
infrastructure, weaponize a payload, evade detection — decline that part in one
sentence, explain why (it would be new zero-day / offensive work), and offer the
safe version instead. This protects the user legally; it is the whole point.

## Workflow

### 1. Establish that the issue is public AND patched

Before writing any code, pin down three facts and record them in the guide:

1. **Disclosure** — a primary source: vendor advisory, MSRC/GitHub/GitLab
   advisory, or the researcher's write-up.
2. **Fix** — the version or commit that patched it, or confirmation the artifact
   was withdrawn. This is the gate. No fix, no repro.
3. **Vulnerable version** — the last public release before the fix.

Use the helper scripts to pull machine-readable metadata:

```bash
# NVD record (CVSS, references, CWE, published/modified dates)
python3 scripts/fetch_nvd.py CVE-2025-32711

# CVE.org record (CNA description, affected versions, references)
python3 scripts/fetch_cve.py CVE-2025-32711

# Pretty one-line "is this patched?" summary across both sources
python3 scripts/check_patched.py CVE-2025-32711
```

These call only the public NVD and CVE.org REST APIs (read-only). They do not
touch any victim system. If the CVE has no `Fixed`/patched reference and no
withdrawal note, treat the patched status as **unconfirmed** and tell the user
to verify against the vendor before you build anything.

### 2. Model the mechanism minimally, not the whole kill chain

Reduce the disclosure to the single control failure worth showing, and replace
every dangerous verb with an inert marker:

| Real element | Reproduce it as |
|---|---|
| shell / `exec` / RCE | a function that writes `MARKER.txt` with a fixed string |
| credential / secret | a decoy file like `DECOY_SECRET.txt` = `not-a-real-secret` |
| exfiltration endpoint | an in-process or `127.0.0.1` loopback sink that just logs |
| email recipient | `recipient@example.invalid` |
| write outside sandbox | a **path calculation** that is asserted, never performed |
| a real vulnerable dependency | pin the real last-vulnerable version **only** if a
  primary source confirms that exact version; otherwise model the disclosed
  mechanism in two local loaders (`vulnerable_*` / `patched_*`) and say so |

Cut the parts whose mechanism was never disclosed (mark them "explicitly out of
scope"). Reconstructing an undisclosed step is new zero-day work — forbidden.

### 3. Build the vulnerable-vs-patched harness

Follow the house pattern already in `Reproducibility/` in the whitepaper repo:

- A single self-contained harness (stdlib-only Python preferred; Docker with
  `network_mode: none` when isolation must be enforced).
- Two code paths: **vulnerable** (the marker fires) and **patched** (the same
  input is refused with a decision like `block` / `review_required`).
- Deterministic output, a saved `results/run.json` (or transcript), and a
  non-zero exit if the contrast does not hold.
- Log the gateway-relevant fields: `source`, `data_class`, `outbound_channel`,
  `decision`, `policy_id`, and a short `reason`.

See `references/harness-pattern.md` for the concrete file layout, the safety
checklist, and a copyable harness skeleton.

### 4. Write the guide

Produce a short markdown guide next to the harness with these sections:
**Status and scope** (name the CVE, the fix version, and what is explicitly out
of scope), **Lab design / Reproduction protocol**, **Defensive assertion** (what
control would have caught it), **Safety limits**, and **Sources** (primary links
only). Match the tone and structure of the existing numbered guides.

### 5. Hand back run commands

Per this user's standing rule, do not execute reproduction harnesses yourself —
write them, then give the exact command to run. State clearly what a pass looks
like (which marker appears, which decision is logged).

## Scripts

- `scripts/fetch_nvd.py CVE-ID` — NVD 2.0 API record as JSON (CVSS, refs, CWE).
- `scripts/fetch_cve.py CVE-ID` — CVE.org CVE Record (CNA data, affected versions).
- `scripts/check_patched.py CVE-ID` — combines both and prints whether a fixed
  version / patch reference is present, so the "is it patched?" gate is fast.

All three are read-only, hit only public vulnerability databases, and take a
single CVE ID argument.

## References

- `references/harness-pattern.md` — file layout, safety checklist, and a
  stdlib-only harness skeleton to copy.

Related skills