RIP
Rest In Peace, Vulnerabilities — a Rust terminal tool that finds your own secrets hard-coded in your own source, and checks your own site for the files and headers that give it away.
RIP is a command-line auditing tool for the code and sites you are responsible for. Its main check is specific: it reads the real values out of a project's own .env file, skips the ones too trivial to matter, and searches the source tree for any of those values written out literally — the API key pasted into a config file, the database URL left in a script. With no .env to read, it falls back to the recognisable prefixes of common provider keys and tokens. The search runs on the same engine as ripgrep, honours ignore patterns, and writes a log in which matched values are masked. An optional web check, off by default and pointed only at a URL you give it, asks your own site for the files that should never be served — .env, .git metadata, SQL dumps, config files, admin and debug paths — and reports missing or weak security headers, rating each finding from low to critical with a recommendation. It has an interactive set-up, an --auto mode for CI, and a TOML config a team can share. Alpha: built in July 2025, with dependencies kept current since.
- Rust
- Tokio
- clap
- reqwest
- rustls
- grep-searcher
- regex
- dialoguer
- indicatif
- serde
- TOML
- assert_cmd
- mockito
- Node.js
- npm
- GitHub Actions
RIP — Rest In Peace, Vulnerabilities — is a terminal tool for auditing code and sites you are responsible for. It does two things, and is honest that they are small: it finds your own secrets written into your own source, and it checks your own website for the files and headers that most often give a deployment away.
Your secrets, in your code
Generic secret scanners guess at what a key looks like. RIP starts
from what your keys actually are. It parses the project's
.env, discards values too trivial to mean anything —
empty strings, true and false,
null, localhost and the like — and then searches every source file for any remaining
value written out literally. A match is a real secret in a real file
at a real line: the key that was pasted into a config "for a minute",
the connection string left in a script. The .env itself
is skipped so it does not report itself. With no .env
to read, it falls back to the recognisable prefixes of common
payment, source-host, chat, cloud and Google keys and tokens.
The search uses grep-searcher, the engine behind
ripgrep, over a configurable list of extensions across the usual
web and systems languages plus YAML, JSON, XML and Markdown, and
skips dependency and build directories by default. Every scan
writes a log file, and in that log matched values are masked —
long hex strings, payment-style keys, and anything assigned to a
key, secret, password or token — so the report is not itself a new
place the secret lives.
Your site, from the outside
The web check is off by default and runs only against a URL you
pass. It requests a short list of paths that should never be served
publicly — .env, .git/config and
.git/HEAD, SQL dumps, config.php and
wp-config.php, .htaccess, admin, debug,
test and database-console paths — and rates each one that answers,
from critical for an exposed environment file or repository down to
low. It reads robots.txt for paths it discloses, and it
checks the response for missing Strict-Transport-Security,
Content-Security-Policy, X-Frame-Options,
X-Content-Type-Options, Referrer-Policy
and X-XSS-Protection headers, and for a weak
X-Frame-Options value. Each finding comes with a
severity and a recommendation.
Interactive or unattended
Run with no arguments and RIP walks through a set-up with
multi-select menus for extensions, ignore patterns and the web
check, then saves the answers to a TOML file a team can commit and
share. --auto runs with defaults and no prompts, for a
CI step; --quiet and --verbose control
output, and progress bars and severity colours switch off cleanly
when the terminal is not interactive. It only reads: it never
modifies a file and sends nothing anywhere except the requests the
web check makes to the URL you gave it.
Status
Alpha, written in July 2025 with unit and integration tests and a
clean clippy run, and kept current since with
dependency updates. A release workflow builds binaries for Linux,
macOS and Windows on x64 and ARM, and an npm wrapper runs the binary
through npx. Still to come: JSON output (the flag is
parsed but not yet implemented), entropy-based detection, custom
patterns, and scanning git history for secrets that were committed
and later removed.
Build something like this
Want a tool like this for your shop?
We've shipped this kind of thing before. Twenty-minute intro call, no slides.