openai/plugins-vulnerability-writeup
Write up vulnerabilities from disclosure documents, rough notes, supplied findings, PoCs, source code, or Codex Security scan output into polished, self-contained, source-backed reports. Use for one vulnerability or a disclosure campaign; a Codex Security scan is optional.
npx skills add https://github.com/openai/plugins --skill vulnerability-writeup
Produce a distributable report set from rough vulnerability notes, PoCs, and source code. Treat this as a technical disclosure campaign: every distinct vulnerability gets its own directory, its own report, its own PoC artifacts,
and its own sub-agent draft. The desired output is not a cleaned-up note. It is a calm, expert narrative that proves the bug from source, explores how far the primitive can realistically be pushed, and ships with a PoC that another researcher can build and run.
Do not require a Codex Security scan, scan ID, manifest, findings JSON, coverage receipt, or seal. Ordinary disclosure documents and supplied vulnerability material are first-class inputs. When scan artifacts are present, use their validated fields as additional evidence; otherwise inventory the supplied documents directly and proceed with the same research and quality bar.
Never test against public or live production instances unless the user has explicitly instructed you to do so for that target.
internal provenance, local absolute paths, or prior working folders.
code references, or the natural rhythm of the report.
Exploring and discussing alternative exploitation routes is often useful to include in a report even if it's not the best route or the one used for the PoC, so always include those discussions where they add interesting insights or explore ideas that otherwise wouldn't be covered. Where alternatives are covered, make the pros and cons clear, as one would expect in a technical discourse.
and any reliability, cleanup, or target-environment notes the reader needs.
If you feel it's not possible to develop a PoC, ask the user for guidance.
If the platform refuses to start more sub-agents, state that constraint to the user and queue the tasks. You should always delegate one report to one sub-agent. If a sub-agent starts but creates no files after one reasonable wait and one explicit finish instruction, close it and retry once with a tighter prompt for the same single vulnerability. If the retry also stalls,
mark the writeup phase blocked unless the user explicitly authorizes a main-agent fallback. Do not silently use a main-agent fallback for production scan completion.
Gather and preserve these inputs before drafting:
When the corpus comes from an external store (e.g. cloud storage or network paths), export the key text locally first. The final reports must not refer to external storage unless the user explicitly asks for provenance notes.
The produced write-ups must be distributable on their own and not assume access to other files or systems.
reports or the user-provided name. Use short, representative slug names.subsystem, primitive, affected paths, and likely duplicates.
Merge notes and PoCs that describe the same bug.
references/report-format.md in full and use it as the report format.Instruct every worker to do the same before drafting.
revision, fix diff, or build instructions before drafting, or proceed at explicitly lower confidence when the user accepts that limitation.
freebsd-shm-uaf.md)and a poc/ directory when PoCs exist. Don't just use a nondescript file name like report.md.
completeness, line wrapping, self-contained wording, source snippets,
exploitability depth, PoC usability, and narrative voice. Reject a report that is written as an impersonal sequence of facts, reserves "we" for one token sentence, or never states in first person what was and was not validated.
10. Reject snippets that cut off before the vulnerable condition, missing guard, dangerous sink, relevant lifetime transition, or proposed fixed invariant. Inspect source directly before asking the worker to rewrite. If the story is thin, incomplete,
speculative, narratively compressed, impersonal, or missing a runnable PoC path, launch a new sub-agent for that same vulnerability with the raw inputs and the specific gaps to close.
11. Make only small main-agent edits after acceptance: heading fixes, line wrapping, command-path portability, and typo cleanup. Do not paper over a weak draft with surface edits.
12. Run final validation over the whole report set before returning.
Use a prompt shaped like this for each vulnerability:
Write one high-quality vulnerability disclosure report for <slug>.
You are responsible for exactly one vulnerability. Do not write about,
summarize, compare, or polish any other finding. Quality drops when one
worker handles multiple bugs, so keep all attention on this single report.
Inputs:
- Raw notes: <paths>
- Existing rough report, if any: <path>
- PoC artifacts: <paths>
- Focused source paths and excerpts: <paths and relevant functions>
- Target source tree: <path>
- Vulnerable revision/release: <revision>
- Fix commits/diffs, if any: <paths/revisions>
- Lab access: <ssh/vm details>
- Testing authorization boundary: <what is allowed and forbidden>
- Required format: `references/report-format.md`.
- Output directory: <reports-dir>/<slug>
Rules:
- Before drafting, open and read `references/report-format.md` in full. Its
headings are the beginning of the assignment, not a completeness checklist.
- Analyze source and fixes directly; never guess. Trace the bug from the
attacker-controlled entry point through the relevant state transitions to
the bad state.
- Treat supplied snippets as starting points. If a snippet ends before the
decisive branch, guard, sink, lifetime transition, or patch invariant,
reopen the source tree and quote a complete short snippet instead.
- Use the source tree throughout the report. Include short, relevant snippets
with file paths, functions, and enough surrounding explanation for a human
reader to follow the path without opening the repository.
- Treat the rough notes as leads, not gospel. Validate each claim against the
vulnerable source, the fix diff, or an experiment. Correct the notes when
the source proves them incomplete or slightly wrong.
- Explore exploitability, not just reachability. Discuss viable primitives,
constraints, allocator or protocol behavior, race windows, object lifetime,
attacker-controlled bytes, reliability, and useful dead ends. Build small
throwaway probes when they clarify an exploit path.
- Verify or improve the PoC when safe and authorized. Prefer disposable VMs
or local test targets for crashes, corruption, LPE, data loss, or denial of
service. Never run against public or live production instances unless the
authorization boundary explicitly allows that target.
- Ship a polished final PoC in `poc/`. Include source, build files, a README
when helpful, exact run commands using relative paths, required environment
details, expected output, and notes on reliability or cleanup.
- Produce a self-contained report markdown file with no provenance references
and no local absolute paths.
- Use a natural first-person researcher voice in the report itself. Guide the
reader with "we" across the substantive walkthrough: introduce why each
source excerpt matters, carry values and object state between functions,
reason through exploit options, and explain PoC behavior. Do not leave the
reader with a dense sequence of snippets and declarative conclusions.
- Include at least one truthful first-person-singular account of the validation
basis and limits. For example: "I reviewed the vulnerable revision and fix
directly, but I did not execute the panic trigger because no disposable VM
was available." Mention builds, experiments, failures, or observations only
when they actually happened.
- Give important transitions enough prose to teach why the evidence matters.
Explore promising exploitation routes, relevant alternatives, constraints,
and informative dead ends instead of collapsing exploitability into a verdict
paragraph. Add depth where the bug warrants it; do not pad the report.
- Prefer readable prose wrapping, but do not contort technical language,
links, tables, or code references to satisfy a fixed column width.
- Explain trigger, vulnerable path, bad state, impact, exploitability, PoC,
and fix as one coherent narrative. The reader should feel calmly guided
from background to source proof to practical demonstration.
- Use relative commands such as `cd poc` then `make`, not local absolute
paths.
When re-running a weak report, add only the review deltas:
The prior draft was too light on <specific gaps>. Rewrite from the raw
artifacts and source so the report reads as a complete technical story. Use
"we" to guide the actual source and exploitation walkthrough, and state with
"I" what you personally validated and what you could not test. Do not merely
add first-person phrases to the existing prose.
For each report, prove the vulnerability from the target source:
git show <rev>:<file>;The worker should use the repository as a primary artifact:
git show <revision>:<path> when the source tree is a Git checkout and the scanned revision is available;The Exploitability Analysis section should be thoughtful and specific. It may include unsuccessful branches when they teach the reader something important.
Useful lines of inquiry include:
Use the lab to build PoCs and run safe probes. For panic, wedge, corruption,
data-loss, or LPE cases, prefer disposable VMs and state the risk in the report. If a PoC cannot safely be run, at least verify that it builds or that its build recipe is coherent, and explain the missing execution condition.
A strong final PoC should be easy for the reader to run:
poc/ folder;Makefile, script, container recipe, or exact build command;Every accepted report must follow the guidance in references/report-format.md.
The report should read like a complete story for a security engineer who has not seen the original notes. It should patiently walk the reader from the entry point to the vulnerable transition, the bad state, exploitation routes,
PoC behavior, and the fix. Avoid filler, generic variant-analysis endings,
and claims unsupported by source or experiment, but include thoughtful discussion and maintain a warm, professional attitude: the voice of one security researcher carefully explaining the work to another.
An excellent report usually has a few recognizable traits:
reliability dependencies, and dead ends that teach something.
deeper structural hardening where useful, and regression tests that exercise the real vulnerable path.
Before accepting a report, ask whether it reaches the excellent bar:
rather than cutting off just before the vulnerability?
including constraints and dead ends that sharpen the conclusion?
Review the completed report set directly after drafting and after any rewrite.
Check every report against references/report-format.md, then run relevant project checks:
rg for forbidden provenance terms and TODO markers;rg -n '\b(we|We|I|our|Our|us)\b' <report> as a quick signal for missing researcher voice, followed by a manual read for natural usage;make -n in every poc/ directory (may need to run on the appropriate target system; doesn't necessarily need to build on whichever system the report is being written on);Do not hand off until validation passes or the remaining failures are explicitly explained to the user.
A report with no natural first-person walkthrough, or no truthful singular account of the validation basis and limits, fails validation and must be rewritten. A mechanical pronoun match does not make an impersonal report pass.
Take openai/plugins-vulnerability-writeup from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.