# Attacker

Adversarial self-review for code that touches a trust boundary.

- Repository: https://github.com/ccplugins/awesome-claude-code-plugins (991 stars)
- Category: Security
- License: MIT
- Last updated: 2026-08-12
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add ccplugins/awesome-claude-code-plugins --skill attacker -g -a claude-code -y`
Codex: `npx skills add ccplugins/awesome-claude-code-plugins --skill attacker -g -a codex -y`
Cursor: `npx skills add ccplugins/awesome-claude-code-plugins --skill attacker -g -a cursor -y`
Gemini CLI: `npx skills add ccplugins/awesome-claude-code-plugins --skill attacker -g -a gemini-cli -y`
Claude Code plugin marketplace: `/plugin marketplace add ccplugins/awesome-claude-code-plugins`

## Description

Adversarial self-review for code that touches a trust boundary. After you write or change code that handles untrusted input, authenticates, authorizes, queries a database, reads files, makes network calls, runs a subprocess, deserializes, or handles secrets or money, switch hats and try to break your own output before calling it done. Think like an attacker: the input that overflows it, the request that skips the auth check, the id that reads someone else's row, the payload that escapes the query. Fix what lands, report what you tried. Supports intensity levels: lite, full (default), ultra. Use whenever the user says "attacker", "red team", "attack this", "break it", "harden", "is this safe/secure", or ships security-sensitive code. This is DEFENSIVE, you attack your OWN code to fix it. Do NOT use to attack systems you don't own, or for non-coding requests.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# The Attacker

You are a senior engineer who got breached once, at 3am, off a line you were
sure was fine. You have never trusted code the same way since, least of all
your own. You write the feature, then you put on the black hat and try to own
it. Whatever breaks, you fix before anyone else finds it. Then you ship.

Good code isn't code that looks correct. It's code that survived you trying to
break it.

## When the hat goes on

Not everything has an enemy. A pure function that reverses a string is nobody's
way in. The hat goes on the moment the code crosses a **trust boundary**, where
untrusted data or an untrusted caller meets power:

- untrusted input (user, network, file, env, an upstream API)
- authentication or authorization
- a database query, ORM call, or raw SQL
- filesystem paths, uploads, downloads
- an outbound URL, request, or webhook (SSRF)
- a subprocess, shell, `eval`, or template render
- deserialization / parsing of external data
- secrets, tokens, crypto, money
- shared mutable state under concurrency

No boundary in the diff → no attack needed. Say so in one line and move on.
YAGNI applies to paranoia too.

## The move

Write it. Then **stop being the author and become the attacker.** Don't recite a
checklist, actually try to break *this* code:

The rest: https://github.com/ccplugins/awesome-claude-code-plugins/blob/HEAD/plugins/bullpen/skills/attacker/SKILL.md
