Speykious/cve-rs
Blazingly π₯ fast π memory vulnerabilities, written in 100% safe Rust. π¦
Slowing β last commit 7mo ago
weakest axisnon-standard license (Other); no tests detected
Has a license, tests, and CI β clean foundation to fork and modify.
Documented and popular β useful reference codebase to read through.
No critical CVEs, sane security posture β runnable as-is.
- βLast commit 7mo ago
- β9 active contributors
- βOther licensed
Show all 8 evidence items βShow less
- βCI configured
- β Slowing β last commit 7mo ago
- β Concentrated ownership β top contributor handles 53% of recent commits
- β Non-standard license (Other) β review terms
- β No test directory detected
What would change the summary?
- βUse as dependency Concerns β Mixed if: clarify license terms
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README β live-updates from the latest cached analysis.
[](https://repopilot.app/r/speykious/cve-rs)Paste at the top of your README.md β renders inline like a shields.io badge.
βΈPreview social card (1200Γ630)
This card auto-renders when someone shares https://repopilot.app/r/speykious/cve-rs on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: Speykious/cve-rs
Generated by RepoPilot Β· 2026-05-09 Β· Source
π€Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale β STOP and ask the user to regenerate it before proceeding. - Treat the AI Β· unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Speykious/cve-rs shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything β but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
π―Verdict
WAIT β Slowing β last commit 7mo ago
- Last commit 7mo ago
- 9 active contributors
- Other licensed
- CI configured
- β Slowing β last commit 7mo ago
- β Concentrated ownership β top contributor handles 53% of recent commits
- β Non-standard license (Other) β review terms
- β No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
β Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live Speykious/cve-rs
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale β regenerate it at
repopilot.app/r/Speykious/cve-rs.
What it runs against: a local clone of Speykious/cve-rs β the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in Speykious/cve-rs | Confirms the artifact applies here, not a fork |
| 2 | License is still Other | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit β€ 253 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Speykious/cve-rs. If you don't
# have one yet, run these first:
#
# git clone https://github.com/Speykious/cve-rs.git
# cd cve-rs
#
# Then paste this script. Every check is read-only β no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of Speykious/cve-rs and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Speykious/cve-rs(\\.git)?\\b" \\
&& ok "origin remote is Speykious/cve-rs" \\
|| miss "origin remote is not Speykious/cve-rs (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
&& ok "license is Other" \\
|| miss "license drift β was Other at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 4. Critical files exist
test -f "src/lib.rs" \\
&& ok "src/lib.rs" \\
|| miss "missing critical file: src/lib.rs"
test -f "src/main.rs" \\
&& ok "src/main.rs" \\
|| miss "missing critical file: src/main.rs"
test -f "src/segfault.rs" \\
&& ok "src/segfault.rs" \\
|| miss "missing critical file: src/segfault.rs"
test -f "src/buffer_overflow.rs" \\
&& ok "src/buffer_overflow.rs" \\
|| miss "missing critical file: src/buffer_overflow.rs"
test -f "src/transmute.rs" \\
&& ok "src/transmute.rs" \\
|| miss "missing critical file: src/transmute.rs"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 253 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~223d)"
else
miss "last commit was $days_since_last days ago β artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) β safe to trust"
else
echo "artifact has $fail stale claim(s) β regenerate at https://repopilot.app/r/Speykious/cve-rs"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
β‘TL;DR
cve-rs is a Rust library and binary that demonstrates common memory vulnerabilities (use-after-free, buffer overflow, segmentation faults) entirely in 100% safe Rust code, without any unsafe blocks. It serves as an educational tool and proof-of-concept that memory bugs can be triggered from safe Rust through deterministic, contrived patterns, while maintaining memory safety guarantees at the language level. Single-crate project with modular vulnerability implementations: src/lib.rs exports distinct modules (src/segfault.rs, src/buffer_overflow.rs, src/use_after_free.rs, src/transmute.rs, src/lifetime_expansion.rs, src/references.rs) each demonstrating one vulnerability class. src/main.rs is a CLI binary that invokes examples. benches/transmute.rs contains criterion benchmarks, and examples/segfault.rs is a runnable demo.
π₯Who it's for
Rust developers, security researchers, and CS educators who want to understand how memory vulnerabilities manifest even in safe Rust, or who need reproducible examples of CVE-class bugs for testing, fuzzing, or educational purposes. It's particularly useful for those writing security tools or studying Rust's soundness model.
π±Maturity & risk
Experimental/educational project at v0.7.0 with minimal activity. It has CI via .github/workflows/ci.yaml and enforces #![deny(unsafe_code)], but the codebase is small (~19KB Rust), has no visible test suite in the file structure (except unsafe tests in src/transmute.rs), and the joke license (GLWTSPL) signals this is not production software. It's actively maintained but intentionally tongue-in-cheek rather than battle-tested.
Minimal dependency risk: only 4 direct dependencies (ureq, oorandom, clap, clap_complete) with optional features. The real risk is semantic: by design, this code causes memory violations in the underlying runtime, so it should never be used in production. The single-maintainer (Speykious) structure and small commit surface mean changes are infrequent but deliberate. No breaking changes are likely given the stable, narrow API surface.
Active areas of work
No specific ongoing work is visible from the file structure. The project is stable at v0.7.0 with core vulnerabilities implemented. The vhs/cassete.tape and .gif suggest recent demo/marketing work. No open PRs or active issues are visible in the provided data, indicating maintenance mode.
πGet running
git clone https://github.com/Speykious/cve-rs.git
cd cve-rs
cargo build
cargo run --example segfault
Or install the binary: cargo install cve-rs && cve-rs
Daily commands: Dev build and run example:
cargo build
cargo run --example segfault
Run benchmarks:
cargo bench --bench transmute
Compile to WASM:
cargo build --target wasm32-wasi
wasmer run target/wasm32-wasi/debug/cve-rs.wasm
πΊοΈMap of the codebase
src/lib.rsβ Main library entry point exporting all vulnerability modules; every contributor must understand the public API surface and module organization.src/main.rsβ CLI entry point using clap; defines how users interact with the codebase and demonstrates practical usage of vulnerability modules.src/segfault.rsβ Core segfault vulnerability implementation; the flagship feature showcasing how safe Rust can trigger memory faults.src/buffer_overflow.rsβ Buffer overflow vulnerability module; demonstrates safe-code exploits that violate memory safety assumptions.src/transmute.rsβ Type transmutation utilities; shows advanced unsafe patterns wrapped in safe abstractions for educational purposes.Cargo.tomlβ Project manifest with feature flags (download-more-ram, give-up, step-on-lego); critical for understanding optional dependencies and build configuration.examples/segfault.rsβ Runnable segfault example; primary demonstration of the library's capability and expected output.
π§©Components & responsibilities
- segfault.rs (Safe Rust, pointer arithmetic) β Provides functions to trigger null pointer dereferences and invalid memory access
- Failure mode: Segmentation fault (SIGSEGV) leading to process termination
- buffer_overflow.rs (Safe Rust, Vec, arrays, slice manipulation) β Demonstrates heap and stack buffer overflow via unchecked writes
- Failure mode: Heap/stack corruption, potential code execution or crash
- transmute.rs (std::mem::transmute, type aliasing) β Provides type-safe wrappers around unsafe transmutation operations
- Failure mode: Type confusion, data misinterpretation, undefined behavior
- use_after_free.rs (Safe Rust, unsafe { } blocks disguised as safe) β Exploits lifetime or ownership violations to access freed memory
- Failure mode: Use-after-free access, double-free, memory corruption
- main.rs (CLI Router) (clap, match/enum routing) β Dispatches user-selected vulnerability command to appropriate module
- Failure mode: Invalid argument parsing or unhandled vulnerability selection
πData flow
User shell invocationβmain.rs CLI parserβ Command-line arguments passed to clap for parsingmain.rs CLI parserβlib.rs module selectionβ Parsed arguments route to the appropriate vulnerability module importlib.rs module exportsβVulnerability module function callβ Selected module function (e.g., trigger_segfault()) is invokedVulnerability moduleβSystem memoryβ Unsafe or bounds-violating operations read/write memory regionsSystem memoryβOS kernel (signal handler)β Invalid memory access triggers SIGSEGV or other fault signalOS kernel signalβProcess termination or error outputβ Program crashes with segmentation fault or undefined behavior manifests
π οΈHow to make changes
Add a New Vulnerability Module
- Create a new file in src/ named after the vulnerability (e.g., src/double_free.rs) (
src/double_free.rs) - Implement the vulnerability function(s) using safe Rust; follow the pattern of existing modules like src/segfault.rs (
src/double_free.rs) - Add a pub mod declaration in src/lib.rs to export the new module (
src/lib.rs) - Add a command-line subcommand handler in src/main.rs using clap to trigger the vulnerability (
src/main.rs) - Create examples/double_free.rs demonstrating the new vulnerability with clear output (
examples/double_free.rs)
Add a Performance Benchmark
- Create a new benchmark in benches/ using criterion framework (e.g., benches/segfault.rs) (
benches/segfault.rs) - Import the target module from cve_rs library and wrap function calls with criterion's black_box (
benches/segfault.rs) - Run with cargo bench to measure and compare performance across iterations (
benches/segfault.rs)
Enable Optional Feature for New Dependency
- Add the dependency under [dependencies] with optional = true in Cargo.toml (
Cargo.toml) - Create a new feature in [features] section (e.g., feature = ["dependency_name"]) (
Cargo.toml) - Guard module code with #[cfg(feature = "...")] in the vulnerability module to conditionally compile (
src/new_module.rs)
π§Why these technologies
- 100% Safe Rust β Primary goal: demonstrate memory vulnerabilities without unsafe code blocks; showcases soundness issues in Rust's type system
- clap CLI β Provides ergonomic command-line parsing and help text generation for selecting vulnerabilities at runtime
- Criterion benchmarks β Measures performance overhead of vulnerability implementations and tracks regressions across iterations
- Feature gates (download-more-ram, give-up, step-on-lego) β Allows optional dependencies (ureq, oorandom) without bloating the core binary; conditional compilation for specialization
βοΈTrade-offs already made
-
No unsafe code blocks in main library
- Why: Pedagogical: demonstrates that memory unsoundness can occur through safe abstractions alone
- Consequence: Harder to implement some vulnerabilities; requires creative API design to trigger undefined behavior from safe code
-
Single-binary CLI with match-based dispatch
- Why: Simple, zero-dependency design for core functionality; easy to learn and extend
- Consequence: All vulnerabilities must be invoked sequentially; cannot run multiple simultaneously in single process
-
Feature flags for optional dependencies
- Why: Keeps baseline binary size minimal and avoids pulling ureq/oorandom unless explicitly needed
- Consequence: Some vulnerabilities may only be available with specific feature combinations
π«Non-goals (don't propose these)
- Not designed for production systems; purely educational demonstration
- Does not provide exploit detection or mitigation strategies
- Not cross-platform debugger integration; relies on OS signals and runtime behavior
- Not a formal verification or proof system for Rust soundness
β οΈAnti-patterns to avoid
- Unsafe abstraction hiding (High) β
src/transmute.rs, src/use_after_free.rs: Functions that wrap unsound memory operations in safe-looking APIs, deliberately violating Rust's type safety guarantees for educational purposes - Unchecked pointer arithmetic β
src/seg: undefined
πͺ€Traps & gotchas
The project uses joke feature names (download-more-ram, give-up, step-on-lego) that may confuse new contributors about their actual purpose (oorandom dependency gating). The #![deny(unsafe_code)] at the crate level means all tests must be compiled with unsafe blocks allowed separately (see src/transmute.rs), which can trip up CI if not configured correctly. WASM builds require the wasm32-wasi target installed (rustup target add wasm32-wasi) and Wasmer runtime for execution; plain wasm32-unknown-unknown will not work without a custom allocator. The CI badge in the README points to the serde-rs repo, not this oneβlikely a copy-paste error that should be fixed.
ποΈArchitecture
π‘Concepts to learn
- Memory-Safe Language Paradox / Soundness Hole β cve-rs exploits legitimate safe-Rust patterns that still cause runtime memory violations (segfaults, UB); understanding this gap is crucial for Rust security researchers and anyone claiming 'Rust prevents memory bugs.'
- Lifetime Expansion / Lifetime Inflation β This crate implements unsafe patterns via lifetime manipulation (see
src/lifetime_expansion.rs); mastering lifetimes is essential to understanding how safe Rust can still corrupt memory. - Type Transmutation in Safe Rust β cve-rs reimplements
std::mem::transmutesafely, bypassing type-system guardrails to alias incompatible types; critical for demonstrating type-confusion vulnerabilities. - Reference Alias Violation / Stacked Borrows β The
src/references.rsandsrc/buffer_overflow.rsmodules trigger violations of Rust's reference semantics and the borrow checker's stacked-borrows model, revealing soundness issues. - Use-After-Free via Scope Manipulation β cve-rs demonstrates UAF in safe Rust by exploiting lifetime semantics; understanding the patterns here (see
src/use_after_free.rs) is vital for fuzzing and soundness validation. - Buffer Overflow in Bounds-Checked Collections β Rust's Vec and arrays are bounds-checked, yet cve-rs shows how safe-Rust idioms can still trigger out-of-bounds access; relevant for understanding the gap between static and runtime safety.
- Denial-of-Service via Language Semantics β The optional features (
download-more-ram,step-on-lego) hint at DoS patterns; understanding how safe code can intentionally exhaust resources is relevant for security testing.
πRelated repos
RustPython/RustPythonβ Demonstrates safe Rust code that must handle memory-unsafe Python semantics; relevant for understanding safe abstractions over unsafe operationstokio-rs/tokioβ High-performance async Rust with minimal unsafe code; inverse of cve-rs, showing how to avoid vulnerabilities while staying performantrust-lang/miriβ Tool to detect undefined behavior and memory unsafety in Rust; complementary to cve-rs for catching bugs rather than demonstrating themgoogle/oss-fuzzβ Fuzzing infrastructure that would naturally use cve-rs examples as oracle targets for validating memory safety checkersSpeykious/hlbcβ Another project by the same author; likely shares similar memory-safety-focused design patterns and Rust idioms
πͺPR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive unit tests for each vulnerability module
The repo has example files (examples/segfault.rs) and benchmarks (benches/transmute.rs) but lacks a dedicated tests/ directory with unit tests for individual vulnerability modules (buffer_overflow.rs, use_after_free.rs, lifetime_expansion.rs, references.rs, transmute.rs, segfault.rs). This would improve code quality, catch regressions, and serve as documentation for how to use each vulnerability safely.
- [ ] Create tests/ directory in the root
- [ ] Add test_buffer_overflow.rs with tests for src/buffer_overflow.rs module functions
- [ ] Add test_use_after_free.rs with tests for src/use_after_free.rs module functions
- [ ] Add test_transmute.rs with tests for src/transmute.rs module functions
- [ ] Add test_references.rs with tests for src/references.rs module functions
- [ ] Add test_lifetime_expansion.rs with tests for src/lifetime_expansion.rs module functions
- [ ] Add test_segfault.rs with tests for src/segfault.rs module functions
- [ ] Update Cargo.toml if needed to ensure tests are discoverable
- [ ] Update CI workflow (.github/workflows/ci.yaml) to run
cargo testalongside existing checks
Fix broken CI badge in README.md and add feature coverage badges
The README.md contains a broken CI badge URL pointing to 'serde-rs/serde' instead of 'Speykious/cve-rs', and the image reference to vhs/cassete.gi is incomplete (missing 'f'). Additionally, there are no badges documenting the optional features (download-more-ram, give-up, step-on-lego) which are quirky and worth highlighting.
- [ ] Fix the CI badge URL in README.md from 'serde-rs/serde' to 'Speykious/cve-rs'
- [ ] Complete the broken vhs/cassete.gi reference to vhs/cassete.gif
- [ ] Add feature flags documentation section explaining download-more-ram, give-up, and step-on-lego
- [ ] Add badges for crates.io version and docs.rs (if published)
- [ ] Verify all links in README.md are correct and point to valid resources
Expand CI/CD pipeline with additional safety and linting checks
The .github/workflows/ci.yaml exists but is not visible in the provided structure. Based on the repo's security-focused nature and rust-version requirement (1.69.0), the CI should enforce Clippy lints, format checks, and security audits. The repo should also test against the MSRV (Minimum Supported Rust Version) defined in Cargo.toml.
- [ ] Review and update .github/workflows/ci.yaml to include
cargo clippy -- -D warnings - [ ] Add
cargo fmt --checkto verify code formatting against rustfmt.toml rules - [ ] Add
cargo auditor equivalent security vulnerability scanning - [ ] Add MSRV test job using rust-version = "1.69.0" from Cargo.toml
- [ ] Test all feature combinations: default, download-more-ram, give-up, step-on-lego
- [ ] Add build matrix for stable, beta, and nightly Rust channels
πΏGood first issues
- Add comprehensive doc comments to each vulnerability module (src/segfault.rs, src/buffer_overflow.rs, src/use_after_free.rs) explaining the safe-Rust pattern used to trigger each CVE type, similar to the transmute module. This improves onboarding and API clarity.
- Create integration tests in a new
tests/directory that verify each vulnerability successfully triggers its intended memory fault. Currently onlysrc/transmute.rshas unsafe test blocks; unify the testing pattern across all modules. - Add a
--listflag tosrc/main.rs(using clap) to enumerate all available vulnerabilities and their descriptions, then add corresponding example subcommands for each (e.g.,cve-rs run buffer-overflow). Currently the CLI has minimal introspection. - Implement
src/double_free.rsas a fourth vulnerability demonstration (double-free / double-deletion patterns in safe Rust), updatesrc/lib.rsto export it, and add a demo insrc/main.rs. This extends the CVE coverage. - Fix the CI badge URL in the README (line pointing to serde-rs) to use the correct Speykious/cve-rs repository URL, and add a 'Build Status' section documenting the current CI matrix (Rust versions tested, WASM targets verified).
βTop contributors
Click to expand
Top contributors
- @Speykious β 53 commits
- @Creative0708 β 32 commits
- @janTatesa β 5 commits
- @Bright-Shard β 4 commits
- @antifuchs β 2 commits
πRecent commits
Click to expand
Recent commits
54ba036β v0.7.0 - make sure MSRV doesn't conflict with dependencies (Speykious)85545ccβ Add ability to transmute girl to boy (Speykious)57799e7β just some whitespace in a doc comment (Speykious)80d3a0eβ fix expand & expand_mut in nightly (#42) (Bright-Shard)e0a25afβ fix expand & expand_mut in nightly (usamoi)a4d3538β 2x shorter vhs, shell completions and more stylish help (#38) (Creative0708)b9aa5f2β feat(main): shell completions, clap (janTatesa)012f75fβ fix(vhs): vhs is now 2x shorter (janTatesa)d973401β There's now a gif in the readme instead of a static image (#37) (Creative0708)ac565c1β docs(vhs): updated vhs (janTatesa)
πSecurity observations
This is an intentional security demonstration crate designed to showcase memory vulnerabilities in Rust. The actual security posture is generally reasonable for a library project: dependencies are relatively current, no hardcoded secrets are present, and no obvious injection vulnerabilities exist. However, there are concerns about pinned dependency versions that prevent security updates, disabled debug symbols in development, and the need for clearer documentation warning against production use. The crate's purpose (introducing vulnerabilities) is not itself a vulnerability when properly documented, but requires careful handling to prevent misuse.
- Medium Β· Outdated Clap Dependency with Pinned Version β
Cargo.toml - dependencies section. The clap dependency is pinned to version 4.2.0 using '=' operator. This prevents security updates and bug fixes from newer patch versions. Clap is a widely-used CLI argument parser, and newer versions may contain important security fixes. Fix: Use caret (^) versioning instead of exact pinning: clap = { version = "^4.2.0", features = ["cargo", "help"] } to allow patch updates while maintaining API compatibility. - Medium Β· Debug Symbols Disabled in Development β
Cargo.toml - [profile.dev]. The [profile.dev] section has 'debug = false', which disables debug symbols in development builds. This can hinder debugging, security analysis, and incident response efforts when vulnerabilities are discovered. Fix: Either remove the debug = false line to enable debug symbols by default, or only disable them in release builds ([profile.release]). - Low Β· Feature Names Could Be Misleading β
Cargo.toml - [features] section. Feature names like 'download-more-ram', 'give-up', and 'step-on-lego' are humorous but obscure their actual functionality. 'download-more-ram' enables the 'ureq' HTTP client feature, which could be confusing for security reviewers and maintainers. Fix: Use descriptive feature names that clearly indicate their purpose (e.g., 'http-client', 'randomization'). Keep humorous aliases in documentation only. - Low Β· Optional Dependency Activation Patterns β
src/lib.rs and related vulnerability modules. The codebase includes intentional security vulnerabilities as a demonstration/educational tool. While the README clearly states this, there's a risk of accidental usage in production if features are enabled without understanding their implications. Fix: Add prominent warnings in Cargo.toml documentation and in the README about never using this crate in production. Consider adding a compile-time check or panic message if the crate is used in non-test builds.
LLM-derived; treat as a starting point, not a security audit.
πWhere to read next
- Open issues β current backlog
- Recent PRs β what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals β see the live page for receipts. Re-run on a new commit to refresh.