| name | rust-security |
| description | Rust security skill for supply chain safety and memory-safe development. Use when auditing dependencies with cargo-audit, enforcing policies with cargo-deny, reviewing RUSTSEC advisories, writing memory-safe FFI patterns, or integrating fuzzing and Miri into a security review pipeline. Activates on queries about cargo-audit, cargo-deny, RUSTSEC advisories, supply chain security, Rust CVEs, safe FFI, or fuzzing for security. |
Rust Security
Purpose
Guide agents through Rust security practices: dependency auditing with cargo-audit, policy enforcement with cargo-deny, RUSTSEC advisory database, memory-safe patterns for FFI, and combining fuzzing with Miri for security review.
Triggers
- "How do I check my Rust dependencies for CVEs?"
- "How do I use cargo-audit?"
- "How do I enforce dependency policies in CI?"
- "What's the RUSTSEC advisory database?"
- "How do I write memory-safe FFI in Rust?"
- "How do I fuzz-test my Rust library for security bugs?"
Workflow
1. cargo-audit — vulnerability scanning
cargo install cargo-audit --locked
cargo audit
cargo audit --deny warnings
cargo audit --file Cargo.lock
cargo audit --json | jq '.vulnerabilities.list[].advisory.id'
Output format:
error[RUSTSEC-2023-0052]: Vulnerability in `vm-superio`
Severity: low
Title: MMIO Register Misuse
Solution: upgrade to `>= 0.7.0`
2. cargo-deny — policy enforcement
cargo-deny goes beyond audit: it enforces license policies, bans specific crates, checks source origins, and validates duplicate dependency versions.
cargo install cargo-deny --locked
cargo deny init
cargo deny check
cargo deny check advisories
cargo deny check licenses
cargo deny check bans
cargo deny check sources
deny.toml configuration:
[advisories]
vulnerability = "deny"
unmaintained = "warn"
yanked = "deny"
ignore = [
"RUSTSEC-2021-0145",
]
[licenses]
unlicensed = "deny"
allow = [
"MIT", "Apache-2.0", "Apache-2.0 WITH LLVM-exception",
"BSD-2-Clause", "BSD-3-Clause", "ISC", "Unicode-DFS-2016",
]
deny = ["GPL-2.0", "GPL-3.0"]
[bans]
multiple-versions = "warn"
wildcards = "deny"
[[bans.deny]]
name = "openssl"
wrappers = ["reqwest"]
[sources]
unknown-registry = "deny"
unknown-git = "deny"
allow-git = [
"https://github.com/my-org/private-crate",
]
GitHub Actions CI integration:
- name: Security audit
run: |
cargo install cargo-deny --locked
cargo deny check
3. RUSTSEC advisory database
The RUSTSEC database at https://rustsec.org/ tracks vulnerabilities, unmaintained crates, and unsound code.
cargo audit --db ~/.cargo/advisory-db fetch
ls ~/.cargo/advisory-db/crates/
curl https://rustsec.org/advisories/RUSTSEC-2023-0001.json | jq .
4. Memory-safe FFI patterns
Common sources of unsafety at the Rust/C boundary:
extern "C" fn process_data(data: *const u8, len: usize) {
let slice = unsafe { std::slice::from_raw_parts(data, len) };
}
extern "C" fn process_data(data: *const u8, len: usize) -> i32 {
if data.is_null() || len == 0 || len > 1024 * 1024 {
return -1;
}
let slice = unsafe { std::slice::from_raw_parts(data, len) };
do_work(slice);
0
}
use nix::unistd::read;
use windows::Win32::System::Memory::VirtualAlloc;
5. Fuzzing for security bugs
cargo install cargo-fuzz
cargo fuzz init
cargo fuzz add my_target
cargo fuzz run my_target
cargo fuzz run my_target -- -sanitizer=address
cargo fuzz run my_target artifacts/my_target/crash-xxxx
cargo install honggfuzz
cargo hfuzz run my_target
6. Miri for soundness
rustup +nightly component add miri
cargo +nightly miri test
MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-backtrace=full" \
cargo +nightly miri test
7. Supply chain hardening
cargo fetch --locked
cargo tree
cargo tree -d
cargo install cargo-vet
cargo vet
cargo machete
Related skills
- Use
skills/rust/rust-sanitizers-miri for Miri and sanitizer details
- Use
skills/runtimes/fuzzing for fuzzing strategy and corpus management
- Use
skills/rust/rust-unsafe for unsafe code audit patterns
- Use
skills/rust/cargo-workflows for Cargo.lock and workspace management