Skip to content

Quickstart

Ten minutes, one project, a real verdict.

The ten minutes are the time to install the tool and see it reach a verdict on a report you already have. Reading the evidence afterwards takes as long as you like.

1. Install

pipx install verdis
verdis doctor

doctor checks the sandbox backend, the images and the permissions. To try what is on main before it is released, install from the repository instead: pipx install "verdis @ git+https://github.com/usualdork/verdis".

Pull the sandbox image once. It is built for linux/amd64; on Apple Silicon, make sandbox builds it for your machine instead:

docker pull ghcr.io/usualdork/verdis/base:latest   # or: podman pull

Verdis runs proofs of concept inside a sandbox, so it needs Podman or Docker. If neither is available it refuses to run rather than falling back to the host: a proof of concept is attacker-controlled code, and the development backend (--sandbox local) is not a security boundary. Ask for it by name, and only on a machine you are willing to risk.

If your container runtime is a VM or a remote daemon, set a work directory it can see:

export VERDIS_WORK_DIR=~/.cache/verdis

2. Triage one report

verdis triage report.md --repo ./libfoo --ref v2.3.1

You get a verdict card:

Verdis verdict: REPRODUCED (Tier 1)   report VDS-0042   target libfoo@v2.3.1
...

The exit code is 0 for a definitive verdict and 1 otherwise, so the command drops into a CI job cleanly.

3. Read the evidence

Every verdict ships with a bundle:

~/.local/share/verdis/reports/VDS-0042/bundle/
├── manifest.json      versions, hashes, the environment
├── original/          the report as it arrived
├── claim.json         what the tool understood
├── plan.json          what it intended to run
├── policy_matches.json
├── build.log
├── run.log
├── oracles.json
├── verdict.json
├── verdict.md
├── draft_reply.md
└── rerun.sh

rerun.sh reproduces the run on another machine.

3a. If your runtime is a VM or a remote daemon

Set a work directory it can see:

export VERDIS_WORK_DIR=~/.cache/verdis

The tool copies the target source and stages the proof of concept in a scratch directory before it runs anything, and the container runtime has to be able to see those paths. On Linux the system temporary directory always works. On macOS with a Docker VM, the shared path is the one under your home directory.

4. Tell the tool about your project

Two optional files make the tool much more useful.

.verdis/policy.yml — your own scope and evidence rules:

supported_versions: ['2.x']
in_scope: [parser, network-client]
excluded_classes:
  - id: local-dos-cli
    description: Denial of service from unbounded local CLI input
evidence_requirements:
  poc_required: true
  default_config_only: true

.verdis/recipe.yml — how to build your project:

language: c
build:
  system: cmake
  flags: [asan, ubsan]
  steps:
    - cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
    - cmake --build build -j

Both have starter templates:

verdis policy init
verdis recipe init
verdis policy check
verdis recipe validate

5. Start in shadow mode

Before you trust a verdict, run the tool for a month and look at what it says without acting on it:

# .verdis/config.yml
mode: shadow

Shadow mode writes verdicts and evidence bundles and posts nothing.

6. The GitHub Action

- uses: usualdork/verdis@v1
  with:
    mode: shadow
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

7. If you are a reporter

verdis preflight ./poc --repo https://github.com/example/libfoo --ref v2.3.1

This checks your PoC in a clean environment and gives you an RRS block you can paste into your report, so the maintainer can reproduce it without guessing.