Repository navigation
Releases: Encapsul/erebus
Releases · Encapsul/erebus
Release list
erebus v0.6.3
Fixed
- Windows release build:
LocalFreereceives the SID string pointer as an
untyped allocation, soerebus-stubcompiles forx86_64-pc-windows-gnu.
Changed
- Registry bearer comes from
--token-fileorERE_TOKEN. A--tokenflag
would show the secret inpsand in shell history. - The transparency log timestamps the checkpoint after the publish response,
so a slow RFC 3161 server no longer holdsPOST /attestations. - An installed CLI with no local
erebus-stubdownloads the matching stub
from the GitHub release and checks it againstchecksums.txt. - A release uploads one archive per built architecture plus
checksums.txt.
Added (registry)
scripts/erebus_registry/: the registry's proof core (Ed25519, Merkle,
RFC 3161, transparency log) as a stdlib-only package; byte formats
unchanged and pinned against the reference implementations in the battery.- Merkle roots and inclusion/consistency proofs are O(log n) over a cached
append-only tree instead of O(n) list scans (200k leaves: ~0.3 ms vs
~0.5 s per query); leaf lookup is a hash map.
Added
- Spec 2.1 action receipts:
erebus serve --attest-keysigns every tool
call the engine returns (name and call id in clear,sha256of the
arguments) intoexecution.request.tool_calls, for chat completions
(JSON, SSE deltas, legacyfunction_call) and the Responses API. A
response that cannot be fully parsed is flaggedtool_calls_incomplete
instead of being reported as "no calls". Receipts without tool calls stay
byte-identical to 2.0. erebus verify-attest <receipt> --response-body FILE: an auditor holding
the plaintext response checks it against the signedoutput_hashand
re-derives the signed tool-call list (exit 2 on any mismatch). Human
output lists the signed tool calls.- Spec 2.1 tool linkage: the proxy also signs the request's tool context
(tools_offered, replayedtool_history,tool_resultsas call id +
content digest).verify-attest --chainlinks every result to the call
that requested it and reports injected results, rewritten history,
changed results and calls to unoffered tools;--require-tool-linkage
makes them fatal (exit 2).verify-attest <receipt> --request-body FILE
re-derives the request side from the request body. - Spec 2.1 attested tool boundary:
erebus attest-tool http --listen … --upstream …(plain HTTP tools, MCP Streamable HTTP with JSON or SSE
answers) anderebus attest-tool stdio … -- <mcp server>sign one receipt
per tool execution (tool_invocation: tool name, canonical arguments
digest, result digests, error flag).verify-attest --chain AGENT --tool-trail [NAME=]DIRmatches every issued call to an execution and
reports results no tool produced (result_without_execution), results
that differ from what the tool returned (result_not_from_tool) and tool
runs no model call asked for (execution_without_call);
--require-tool-executionmakes them fatal (exit 2). Tool calls gain an
optionalarguments_jcs_hash(JCS of the parsed arguments) so the two
sides match whatever the whitespace. - Tool executions can be bound to the engine's call id: MCP
params._meta["dev.erebus/call_id"]or theErebus-Call-IdHTTP header
is signed astool_invocation.call_id. A bound execution matches only
its call, so identical calls executed out of order no longer yield a
spuriousresult_not_from_tool, and a tool that ran the call with other
arguments is reportedexecution_altered(fatal with
--require-tool-execution). verify-attest --tool-trusted-dir DIR: tool trails are verified only
against the tool operator's keys, which must share none with the agent's
trusted keys, so a single stolen key can no longer forge both the agent
and the tool trail. Reportstool_trust: separate|shared; shared trust
is flagged in the human output.- Egress confinement:
ERE_EGRESS=PORT[,PORT…]|nonelimits the payload's
outbound TCP to the given ports (macOS Seatbelt:localhostonly; Linux
6.7+: Landlock TCP connect rules plus a seccomp filter refusing UDP, raw
and packet sockets, TCP Fast Open,io_uringand foreign ABIs). Signed
asexecution.egress; an invalid policy or a kernel without Landlock
ABI 4 refuses the launch.scripts/egress_e2e.sh(Linux) and
scripts/macos_slice.shcheck it on a real bundle against a control. erebus evidence export <bundle> -o pack.zipanderebus verify-evidence pack.zip [--bundle] [--json]: a self-contained, offline-verifiable audit
pack (receipts, inclusion proofs, checkpoints, RFC 3161 tokens, DSSE
envelopes, signing keys). Export refuses an unverifiable trail; verify
refuses any edited, missing, extra or path-traversing entry and a
mismatched bundle (exit 2).verify-evidence --operator-key <key> --log-key <hex>pins the
keys an auditor obtained out of band; any other key in the pack is
refused, and the report lists every key as pinned orNOT PINNED.- Evidence packs carry
anchors/<receipt>.checkpoint, the exact bytes the
RFC 3161 token covers, soopenssl ts -verify -datachecks the TSA
signature without erebus. - Docs:
guides/audit.md(auditor walkthrough); proof-first introduction,
problem, positioning and comparison pages, in English; CLI help leads
with the proof commands.
Fixed
- Health-check server (stub): on macOS/BSD an accepted socket inherits
O_NONBLOCKfrom the listener, so a probe that had not yet written its
request got a reset instead of200. Accepted sockets are now blocking
with a 2 s read timeout. - SISR e2e mock server: same inheritance made
e2e_sisr_mainand
upgrade_migrationfail randomly on macOS ("Peer disconnected"). erebus builddetects Mach-O (thin and universal) agents as the binary
runtime; it only knew ELF and PE, so native macOS apps were refused. Java
class files, which share the fat magic, are not mistaken for them.erebus buildno longer stages a Linux glibc base (and warns about it)
for non-ELF payloads.verify-evidence --operator-keyaccepts the public key hex that
erebus keygenprints, as well as thesha256:fingerprint.attest --pushalso stores the inclusion proof beside the trail entry,
so trails built withattestcarry their proofs likeserve --pushones.- Spec and docs: a batch run's
input_hashcovers the launch vector
(entrypoint + arguments), not stdin, andoutput_hashneeds Linux
isolation ≥ 2; the spec claimed stdin. Quickstart trusted-keys path fixed.
Fixed (macOS, ROADMAP P1-5)
--landlockbundles are now confined by Seatbelt (sandbox_init), and
the launch is refused if the profile cannot be installed. Before, the
profile was never applied. Payload reads are limited to the system trees
and the rootfs; writes go to the rootfs and a privateTMPDIR.- With
ERE_ATTEST_KEY, macOS receipts now carryoutput_hashand
exit_code(the Linux capture supervisor, shared). - A launch that failed inside the capture supervisor exited 0, so its
receipt would have signed a clean run. It now exits 126. scripts/macos_slice.sh: no KNOWN GAP left; the chain check no longer
fails at random underpipefail.
Added (batch stdin)
- Spec 2.1
execution.stdin_hash: with capture on, a non-terminal stdin
is relayed by the supervisor and itssha256signed, only when the whole
input was delivered (Linux isolation ≥ 2 and macOS). Receipts without it
keep the 2.0 bytes.
Install: curl -fsSL https://raw.githubusercontent.com/Encapsul/erebus/main/scripts/install.sh | bash