-
Notifications
You must be signed in to change notification settings - Fork 0
Security
Sakur4 is not a security boundary. This page says what its threat model actually is, rather than implying a posture the project does not have.
Sakur4 stores a verbatim transcript of an agent session, which in practice contains anything the agent read: source code, tool output, file contents, and credentials that appeared in output.
Treat the Memory Fabric store — sakur4.db — as exactly as sensitive as the sessions it recorded.
That may be more sensitive than the code they touched, because the transcript includes what was read and what was said about it.
Localhost binding is the default, and that default is the security control. There is no token, no password, no per-client identity.
sakur4d serve --transport http --bind 0.0.0.0:8765 # ← don't, unless you mean itBinding to a non-loopback address exposes the entire Memory Fabric — including the ability to write to it — to anyone who can reach the port. On a shared network that is every device on it. Do not do it on a network you do not control.
If you need remote access, put it behind something that authenticates: an SSH tunnel, a reverse proxy with TLS and client certificates, or a private network you administer.
| Feature |
encryption (rusqlite/bundled-sqlcipher) |
| Default | off — the standard build links plain SQLite |
| Key | 64 hex characters — a raw 256-bit key, not a passphrase |
| Generate | sakur4d gen-key |
| Consequence of off | a store is readable by anyone with file access |
cargo build --release -p sakur4d --features encryption
sakur4d gen-key # prints a key; store it somewhere safeThe key is applied as SQLCipher's PRAGMA key before the file is read, which is a requirement of
SQLCipher rather than a preference — a pragma issued after the header is read is too late.
Because the key is raw rather than derived, there is no PBKDF2 step to attack and also no recovery from a lost key. Back it up deliberately.
A store written by an encrypted build is unreadable by a plain SQLite client; the test
crates/sakur4-core/tests/encryption_at_rest.rs asserts exactly that by opening one without the key.
OpenSSL development files are required to build the feature, which is why the encryption job is a
separate CI job and why it reports INCOMPLETE on a machine that lacks them rather than passing
vacuously.
| Redact secrets from transcripts | It is a recorder. If a token appeared in tool output, it is in the store |
| Encrypt in transit | stdio is a pipe; HTTP is plain unless you put TLS in front of it |
| Isolate one project's data from another on the same root | Project scoping separates projects; it is not a sandbox |
| Verify the model's summaries | That is the point of the Ledger — model output cannot write to it — but it is a correctness property, not a security one |
| Reduce what an agent may read | Sakur4 observes; it does not gate |
| Control | State |
|---|---|
| Known-vulnerability scan |
cargo audit runs in CI on every push. Running it by hand the first time found a medium-severity rustls advisory (RUSTSEC-2026-0285, TLS 1.3 handshake messages accepted across encryption-level boundaries) that had been published ten days earlier — reached through reqwest for the reverse proxy |
| Checksum-verified installs |
install.sh fetches SHA256SUMS.txt and refuses to install an archive that is not listed or does not match. A missing checksum file is a failure, not a silent downgrade |
| Signed artifacts | Not yet. A checksum proves a download was not corrupted; it does not prove origin. See Limitations |
| Licence and duplicate-version policy | Runs in CI against deny.toml — licences, duplicates, sources |
| Unused dependencies | Checked. Three were declared and referenced nowhere, including file-watching crates that implied a feature which did not exist |
Please do not open a public issue. Report privately through GitHub's Security Advisories, or contact the maintainers directly if you cannot use that.
Include what you can: affected version, reproduction steps, and the impact you believe it has. You will get an acknowledgement, and credit in the fix's release notes unless you would rather not be named.
- It is a local tool for one developer. Keep it local.
- The store is as sensitive as the session. Back it up accordingly, or encrypt it.
- Encryption is a build flag, not a setting. If it matters to you, it matters today.
- Binding to a non-loopback address removes the only access control there is.
Local memory and context for long agent sessions.
- Home
- Getting Started — install, configure, first session
- Concepts — the vocabulary, if the README was too dense
- Tool Reference — all 17 tools, with arguments and when to call them
- Harnesses — OMP · Hermes · Claude · any MCP client · raw HTTP
- Configuration — every flag and environment variable
- CLI Reference — the terminal surface
- Architecture — how eviction, memory and coherence fit together
- Cache Coherence — why compaction invalidates a prompt cache, and what to do
- Memory Model — the Ledger, the Atlas, and why a model may not write to both
- Benchmarks — what changes with it, and without it
- Verification — the checks, and how to run them
- Limitations — what does not work yet, stated plainly
- Security — threat model, encryption at rest, reporting
- Design Decisions — the trade-offs, including the ones that were wrong first
- Contributing — from checkout to pull request
- Releasing — how a version ships
- Troubleshooting — when something is not working