# ruzzy

This skill installs and runs Ruzzy, a coverage-guided Ruby fuzzer built on libFuzzer. Reach for it when a gem needs crash hunting or a native extension needs a memory-safety check.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · 5100 installs · ★ 7805
- Author: trailofbits
- License: CC-BY-SA-4.0 · policy=link-only · description only; the file stays with the author
- Source: https://github.com/trailofbits/skills/tree/HEAD/plugins/testing-handbook-skills/skills/ruzzy/SKILL.md
- Updated: 2026-10-24
- HTML: https://affpapa.org/en/nevibecode/skills/ruzzy

## What it does

Ruzzy brings coverage-guided fuzzing to Ruby on top of libFuzzer. The skill walks through installation, harness setup and a fuzzing campaign against either plain Ruby code or the native C extensions shipped inside gems. Linux x86-64 and AArch64/ARM64 are supported; macOS and Windows users go through the Dockerfile or the development environment in the repository.

Plain Ruby needs two scripts. A tracer calls `Ruzzy.trace('test_harness.rb')`, and the harness itself defines a `test_one_input` lambda that returns 0 and hands control to `Ruzzy.fuzz`. C extensions skip the tracer and run from a single file — wrap the call in a rescue so Ruby exceptions don't kill the fuzzer, since the target is memory corruption, not ordinary errors. Keep the harness deterministic; randomness or time-based logic breaks it.

Set `ASAN_OPTIONS` with `allocator_may_return_null=1`, `detect_leaks=0` and `use_sigaltstack=0` before a campaign. `LD_PRELOAD` points at the ASan path and belongs on the command line rather than in an exported variable, otherwise it can leak into other programs. Building gems with sanitizers takes clang plus flags such as `-fsanitize=address,fuzzer-no-link`. An old clang is where this falls over — check the version first.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add trailofbits/skills --skill ruzzy -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/ruzzy/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/ruzzy/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add trailofbits/skills --skill ruzzy -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/ruzzy/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add trailofbits/skills --skill ruzzy -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/ruzzy/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install trailofbits/skills ruzzy
```

2. **Manually: put the files in place**
- File: `.github/skills/ruzzy/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add trailofbits/skills --skill ruzzy -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/trailofbits/skills --path plugins/testing-handbook-skills/skills/ruzzy
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/ruzzy/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add trailofbits/skills --skill ruzzy -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/trailofbits/skills/tree/HEAD/plugins/testing-handbook-skills/skills/ruzzy/SKILL.md

## When to use it
- hunt crashes in a pure Ruby library with coverage guidance
- check a gem's C extension for memory corruption
- compile a gem with AddressSanitizer and instrumentation flags
- replay a saved crash input after a campaign
- run libFuzzer with a corpus and custom limits

## Example prompts
- Set up Ruzzy and write a harness to fuzz my Ruby library
- Build my gem's C extension with sanitizers and start fuzzing
- Help me reproduce the crash in `crash-253420c1158bc6382093d409ce2e9cff5806e980`

## Similar
- [improve-codebase-architecture](https://affpapa.org/en/nevibecode/skills/improve-codebase-architecture.md) — skill · 1163035 installs
- [design-taste-frontend](https://affpapa.org/en/nevibecode/skills/design-taste-frontend.md) — skill · 678700 installs
- [tdd](https://affpapa.org/en/nevibecode/skills/tdd.md) — skill · 1141062 installs
- [skill-creator](https://affpapa.org/en/nevibecode/skills/skill-creator.md) — skill · 414180 installs
- [agent-browser](https://affpapa.org/en/nevibecode/skills/vercel-labs-agent-browser.md) — skill · 1200000 installs
- [prototype](https://affpapa.org/en/nevibecode/skills/prototype.md) — skill · 986201 installs

From the same set: [trailofbits/skills](https://affpapa.org/en/nevibecode/by/trailofbits/skills.md) — 77 cards

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
