4 releases
Uses new Rust 2024
new 0.1.3 | May 5, 2025 |
---|---|
0.1.2 | May 5, 2025 |
0.1.1 | May 5, 2025 |
0.1.0 | May 5, 2025 |
#162 in Memory management
61 downloads per month
18KB
324 lines
SecBits
A Rust library for secure memory handling featuring:
- ๐ Memory locking (mlock/madvise)
- ๐ก๏ธ Configurable protection modes (RW/RO/NOACCESS)
- ๐งผ Secure zeroing with platform-specific intrinsics
- ๐๏ธ Automatic memory wiping on drop
- ๐ Page-aligned allocations
Use Case: Sensitive data handling (cryptographic keys, passwords, PII)
Quick Start
use secbits::SecBytes;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create secure storage
let mut secret = SecBytes::new("my_secret".as_bytes().to_vec())?;
// Store sensitive data (source gets zeroed)
secret.append(b"extra data".to_vec())?;
// Read access
{
let view = secret.read()?;
assert_eq!(view.as_slice(), b"my_secretextra data");
} // drop view
// Write access (exclusive)
{
let mut edit = secret.write()?;
edit.as_slice()[..3].copy_from_slice(b"NEW");
} // drop edit
println!("{:?}", std::str::from_utf8(secret.read()?.as_slice()));
assert_eq!(secret.read()?.as_slice(), b"NEWsecretextra data");
Ok(())
} // Memory automatically unlocked and zeroed here
Major Components
1. SecMem Core
struct SecMem {
ptr: NonNull<u8>,
cap: usize,
layout: Layout,
}
Key Features:
- ๐ Page-Aligned Allocations: Always uses system page size multiples
- ๐ Memory Locking:
mlock()
prevents swapping to diskmadvise(MADV_DONTDUMP)
excludes from core dumps
- ๐ก๏ธ Protection Modes:
ProtectionMode::None
- No access (default)ProtectionMode::Read
- Read-onlyProtectionMode::ReadWrite
- Read-write
- โ ๏ธ Secure Drop:
- Set memory to RW mode
- Zero using platform-secure methods
- Unlock and deallocate
2. SecBytes Buffer
struct SecBytes {
mem: SecMem,
len: usize,
reader_count: AtomicUsize,
}
Key Features:
- ๐ Dynamic Resizing: Maintains 2x growth factor
- ๐ Access Views:
SecReadBytes
: Shared read access (RO mode)SecWriteBytes
: Exclusive write access (RW mode)
- ๐งต Concurrency Safety:
- Multiple readers allowed
- Writers get exclusive access via &mut
Key Tricks
1. Safe Memory Management
// Always use RAII guards
{
let view = secret.read()?; // Auto sets RO
// use view...
} // Auto resets to NOACCESS
2. Secure Data Handling
// Source data gets zeroed automatically
secret.append(&mut sensitive_data)?;
๐ Security Considerations
Guarantees
- ๐ก๏ธ Memory never swapped to disk (mlock)
- ๐ซ Sensitive data excluded from core dumps
- ๐ต๏ธโ๏ธ Defeats heap inspection attacks
- ๐ง Prevents compiler optimizations from skipping zeroing
Limitations
- โ ๏ธ Requires CAP_IPC_LOCK on Linux (or root)
- ๐พ Physical memory still potentially recoverable
- ๐ Doesn't protect against hardware attacks
Dependencies
~3โ5MB
~86K SLoC