Security Practices — Cryptographic Safety, Memory Zeroization & Hardened I/O
Defense-in-depth security across Rust, TypeScript, and Bash: key handling, memory zeroization, secure file I/O, input validation, privilege management, and dependency auditing.
Memory Zeroization
Rust
use zeroize::Zeroize;
struct SecureBytes(Vec<u8>);
impl Drop for SecureBytes {
fn drop(&mut self) {
self.0.zeroize();
}
}
TypeScript
try {
// ... use secretKey
} finally {
secretKey.fill(0);
// Best-effort: GC may have copied the buffer
}
Shell
shred -u "$keypair_file" 2>/dev/null || rm -P "$keypair_file"
RNG Quality
| Language |
Source |
Verification |
| Rust |
OsRng |
Verify via solana-sdk internals |
| TypeScript |
crypto.getRandomValues |
Node.js built-in CSPRNG |
| Shell |
solana-keygen |
Delegates to Rust OsRng |
Keypair Integrity Verification
- Re-derive public key from secret key
- Compare derived key with stored public key
- Sign a test message with the keypair
- Verify the signature with the public key
- Validate Base58 encoding roundtrip
Secure File I/O
- Set permissions to
0o600 before writing content (race-free on Unix)
- Use
O_CREAT | O_EXCL to prevent overwrites
- Write to temp file + atomic rename for crash safety
- Never write secret keys to stdout unless explicitly requested
Input Validation
| Input |
Validation |
| Base58 address |
Regex: ^[1-9A-HJ-NP-Za-km-z]{32,44}$ |
| File paths |
Reject .., prevent traversal |
| Tool inputs |
Zod schemas in MCP server |
| Shell arguments |
Quoted variables, no eval |
Security Checklist Summary (60+ items)
Key categories:
- Cryptographic library allowlist
- Memory zeroization in all code paths
- File permission enforcement
- Input validation and sanitization
- Error message information leakage prevention
- Dependency auditing (
cargo audit, npm audit)
- No network calls during key generation
- Secret key never in logs, error messages, or telemetry
Attack Vectors to Test
| Vector |
Defense |
| Weak RNG |
Only CSPRNG (OsRng / crypto.getRandomValues) |
| Memory dump |
Zeroize on drop/finally |
| File permission leak |
0o600 enforcement |
| Path traversal |
Input validation |
| Shell injection |
Quoted variables, no eval |
| Dependency supply chain |
cargo audit, npm audit |
Patterns to Follow
- Always use approved crypto libraries:
solana-sdk, @solana/web3.js, solana-keygen
- Zeroize key material in all code paths (success, error, early return)
- Set file permissions before writing content
- Validate all inputs at the boundary (CLI args, API inputs, file paths)
- Never log or display secret keys
- Run dependency audits in CI
Common Pitfalls
- JavaScript
fill(0) is best-effort — GC may relocate buffers
- Rust
String types may leave copies in memory — use Vec<u8> with Zeroize
chmod after write has a race window — prefer fchmod or umask
- Error messages must not include secret key material
cargo audit may miss recently disclosed CVEs — supplement with manual review
1---2name: pump-security3description: Security Practices — Cryptographic Safety, Memory Zeroization & Hardened I/O4---56# Security Practices — Cryptographic Safety, Memory Zeroization & Hardened I/O78Defense-in-depth security across Rust, TypeScript, and Bash: key handling, memory zeroization, secure file I/O, input validation, privilege management, and dependency auditing.910## Memory Zeroization1112### Rust13```rust14use zeroize::Zeroize;1516struct SecureBytes(Vec<u8>);1718impl Drop for SecureBytes {19 fn drop(&mut self) {20 self.0.zeroize();21 }22}23```2425### TypeScript26```typescript27try {28 // ... use secretKey29} finally {30 secretKey.fill(0);31 // Best-effort: GC may have copied the buffer32}33```3435### Shell36```bash37shred -u "$keypair_file" 2>/dev/null || rm -P "$keypair_file"38```3940## RNG Quality4142| Language | Source | Verification |43|----------|--------|-------------|44| Rust | `OsRng` | Verify via `solana-sdk` internals |45| TypeScript | `crypto.getRandomValues` | Node.js built-in CSPRNG |46| Shell | `solana-keygen` | Delegates to Rust `OsRng` |4748## Keypair Integrity Verification49501. Re-derive public key from secret key512. Compare derived key with stored public key523. Sign a test message with the keypair534. Verify the signature with the public key545. Validate Base58 encoding roundtrip5556## Secure File I/O5758- Set permissions to `0o600` before writing content (race-free on Unix)59- Use `O_CREAT | O_EXCL` to prevent overwrites60- Write to temp file + atomic rename for crash safety61- Never write secret keys to stdout unless explicitly requested6263## Input Validation6465| Input | Validation |66|-------|-----------|67| Base58 address | Regex: `^[1-9A-HJ-NP-Za-km-z]{32,44}$` |68| File paths | Reject `..`, prevent traversal |69| Tool inputs | Zod schemas in MCP server |70| Shell arguments | Quoted variables, no eval |7172## Security Checklist Summary (60+ items)7374Key categories:75- Cryptographic library allowlist76- Memory zeroization in all code paths77- File permission enforcement78- Input validation and sanitization79- Error message information leakage prevention80- Dependency auditing (`cargo audit`, `npm audit`)81- No network calls during key generation82- Secret key never in logs, error messages, or telemetry8384## Attack Vectors to Test8586| Vector | Defense |87|--------|---------|88| Weak RNG | Only CSPRNG (OsRng / crypto.getRandomValues) |89| Memory dump | Zeroize on drop/finally |90| File permission leak | 0o600 enforcement |91| Path traversal | Input validation |92| Shell injection | Quoted variables, no eval |93| Dependency supply chain | cargo audit, npm audit |9495## Patterns to Follow9697- Always use approved crypto libraries: `solana-sdk`, `@solana/web3.js`, `solana-keygen`98- Zeroize key material in all code paths (success, error, early return)99- Set file permissions before writing content100- Validate all inputs at the boundary (CLI args, API inputs, file paths)101- Never log or display secret keys102- Run dependency audits in CI103104## Common Pitfalls105106- JavaScript `fill(0)` is best-effort — GC may relocate buffers107- Rust `String` types may leave copies in memory — use `Vec<u8>` with `Zeroize`108- `chmod` after `write` has a race window — prefer `fchmod` or umask109- Error messages must not include secret key material110- `cargo audit` may miss recently disclosed CVEs — supplement with manual review