v0.1.1 · out now on crates.io

Catch vulnerabilities in your Solana programs before you deploy.

VaultLint is a security linter for Rust and Anchor smart contracts. Find missing signer checks, PDA mistakes and unsafe CPIs in minutes — without waiting weeks for a full audit.

$ cargo install vaultlint

Free and open source. Runs offline by default — no account, no telemetry.

~/vaultlint — vaultlint scan
$ vaultlint scan examples/vulnerable

→ analyzing 5 Rust files …

✗ HIGH  missing owner check
        examples/vulnerable/missing_owner.rs:5
        Account data is deserialised without verifying the account owner. An attacker
        can pass a look-alike account owned by another program.
        Use `Account<'info, T>`, which checks the owner and discriminator, or add
        `require_keys_eq!(*account.owner, crate::ID)` before reading.
        https://vaultlint.com/rules/VL002/

⚠ MED  overflow-checks is not enabled
        Cargo.toml:1
        This workspace does not set `overflow-checks = true` under `[profile.release]`.
        Solana programs are built in release mode, so arithmetic that overflows wraps
        silently instead of aborting the transaction.
        Add `[profile.release]` with `overflow-checks = true` to the workspace manifest.
        Overflow then aborts the transaction instead of writing a wrapped value.
        https://vaultlint.com/rules/VL003/

⚠ MED  non-canonical PDA bump
        examples/vulnerable/pda_bump.rs:7
        `vault` uses `bump = user_bump`, where `user_bump` is an `#[instruction]`
        argument. An attacker controls this value and can pass a non-canonical bump to
        address a different account.
        Store the canonical bump (from `init`) in the account data and validate with
        `bump = <account>.bump`.
        https://vaultlint.com/rules/VL004/



7 issues found · 1 high · 4 medium · 2 low
$ echo $?
1
Real output from VaultLint 0.1.1 scanning the vulnerable example programs in its own repository. Four of the seven findings are elided.

The problem

Solana security tooling is a decade behind Ethereum's.

Audits are slow and expensive

Getting a full Solana smart contract audit costs $30k+ and takes weeks. Fine for a mature protocol, brutal for a small team shipping now.

Most tools target Solidity

Slither, Mythril, MythX — Ethereum-first. For Solana/Rust/Anchor the self-serve options are thin.

One missing check = drained

A forgotten signer constraint or unchecked CPI can empty the vault on the first mainnet block.

How it works

Rust and Anchor checks that run where you already work.

01

Point it at your repo

cargo install vaultlint, then vaultlint scan ./programs. Works with Anchor and raw Solana programs.

02

It reads your Rust

VaultLint reads your program the way an auditor would — accounts, seeds, CPIs, math. Offline by default, in milliseconds; your code never leaves your machine.

03

Get a fixable report

Each finding names the file, line, why it's dangerous, and how to fix it. Runs in CI on every PR.

What we check

Five rules, and what each one reports.

Every rule in the vulnerability scanner is written for the way Solana programs actually break — not ported from an EVM checklist. Each one has a page stating exactly what it flags and what it deliberately ignores.

VaultLint complements — it doesn't replace — a full manual audit. It catches the common, expensive mistakes early, so the audit can focus on the hard stuff.

Why VaultLint

A security tool that actually speaks Rust.

Built for Solana & Rust

Not a Solidity tool with a Rust checkbox. Every rule is written for Rust smart contract security on Anchor and native Solana programs.

Runs while you code

One binary, no build of your program required. Emits SARIF, so findings land as annotations on the pull request instead of after mainnet.

Free and open source

A $30k firm audit takes weeks. VaultLint is on crates.io under MIT/Apache-2.0, answers in minutes, and costs nothing.

Tuned against false positives

Hand-written rules, each measured against real production code and narrowed until it stopped crying wolf. Fewer, higher-signal findings — not walls of noise.

Releases

What's in the current version.

The three most recent releases are below; the changelog has the full history. VaultLint follows semantic versioning, and a patch release only ever makes a rule quieter — it will not start reporting something your last clean build passed.

0.1.1 Latest 2026-07-29

Fewer false positives, and a scan that survives whatever you point it at.

  • VL002 and VL005 now read #[access_control(...)], so a check written in an Anchor guard silences the finding it covers.
  • VL004 no longer reports a create_program_address call whose bump comes from account data — the rule was firing on the very fix it recommends.
  • The human report prints each finding's documentation address, and a file nested deep enough to exhaust the parser's stack is skipped instead of taking the whole scan down.
0.1.0 2026-07-28

First public release.

  • Five rules — VL001 unproven authority on initialization, VL002 missing owner check, VL003 overflow-checks not enabled, VL004 non-canonical PDA bump, VL005 unchecked CPI to unknown program.
  • Three output formats — human, json and sarif — plus --fail-on to gate CI on severity.
  • Inline // vaultlint:allow VL001 suppression, and Anchor + overflow-checks detection from your Cargo.toml.

Install it in one command.

VaultLint is published on crates.io under MIT/Apache-2.0. It needs a Rust toolchain and nothing else — no account, no API key, and no network access unless you ask for it with --mainnet.

$ cargo install vaultlint
$ vaultlint scan ./programs