RUSTSEC-2026-0253: Potential use-after-free due to lack of panic safety in `LruCache::pop()`
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 147
- Forks
- 39
- Avg merge
- 16h 39m
- Merged PRs (30d)
- 2
Description
Potential use-after-free due to lack of panic safety in
LruCache::pop()
| Details | |
|---|---|
| Status | unsound |
| Package | lru |
| Version | 0.16.4 |
| URL | https://github.com/jeromefroe/lru-rs/pull/238 |
| Date | 2026-05-12 |
LruCache::pop() in lru was not panic-safe. If the Drop implementation of a stored key panics during pop(), self.detach() is never called, leaving dangling pointers in the internal doubly-linked list.
A subsequent cache operation that triggers eviction can then dereference these dangling pointers:
- The node is freed from the map, but remains linked in the LRU list due to the skipped
detach()call - When a new insertion causes eviction, the LRU traversal encounters the dangling pointer
- This results in a write to already-freed memory during the eviction process
Impact
- CWE-416 (Use-After-Free): memory corruption when subsequent cache operations access freed node pointers in the linked list
- CWE-415 (Double Free): potential heap corruption when the same memory is freed multiple times
Both types of undefined behavior can be invoked in safe Rust, but only if unwinding panics are enabled and std::panic::catch_unwind is used with key types that have potentially-panicking Drop implementations.
Fix
Fixed in lru 0.18.2 by detaching the node from the linked list before freeing it and dropping the key (lru-rs#238).
See advisory page for additional details.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by checking the Rust dependency manifests and lockfile for the affected lru version, then read the linked advisory and upstream fix. Done means the project no longer resolves the vulnerable version and its existing checks pass.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- security
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100