Repository navigation
Geode 3.0.0. Major version: local geode run and Linux custody now refuse a secret binding with an empty or unusable allow_hosts, and macOS now enforces allow_hosts.
Crates: geode-cli, geode-grotto, geode-tui, geode-redact, geode-os at 3.0.0.
BREAKING
- Linux custody and local
geode runrefuse a secret binding whoseallow_hostsis empty or unusable (policy_deny, nothing spawned). Tokens issued with an empty list no longer run and must be reissued with the hosts they may contact.
Security
test-trusted-rootis also refused at build time for any optimized build (opt-levelother than 0), so a custom profile with debug assertions on cannot ship the test-only trust-root switch. The release check script now proves this.geode run --homerefuses a path that is itself a symlink. The flag docs now say plainly that these checks are a usability guard, not a security boundary.- CI fails if any release, publish, or tag workflow does not run
check-no-test-trusted-root.sh. - The interim custody argv lint compares path components and requires the pinned command to sit directly in
/usr/local/libexec/hedronite. geode-grottoalso refuses itstest-trusted-rootfeature in any optimized build, matching the CLI guard.- The release-workflow guard ignores comments, requires
check-no-test-trusted-root.shon arun:line or inside a run block, and detects release triggers in map, flow-list (on: [release]), and scalar (on: release) form. cargo test -p geode-cliwith default features passes. The run tests that spawn a child with a secret need the test-only host override and are compiled only withtest-trusted-root, which CI uses.- Local
geode runenforcesallow_hostsfor every secret binding on every platform, including macOS. The check is the custody allowlist (AllowList): a host that is not listed ishost_deniedand is not dialed. A secret binding with an empty or unusableallow_hostsis refused before spawn (non-zero exit). There is no environment variable, flag, or config key that disables the check. Pass hosts with repeatable--allow-host. macOS confines the child with a deny-by-default seatbelt: file and process access is limited to what the child needs to run, mach-lookup is a named allowlist with no network service, Apple events are denied, and network helper programs cannot be exec'd. LaunchServices, the preferences daemon, and the keychain service are not on that list. The seatbelt used when there is no egress proxy is deny-by-default as well and has no outbound network. Outbound network for a confined run is allowed only to the local egress proxy. The proxy listens on both loopback stacks, because the seatbelt loopback name covers both, and refuses to start if either bind fails. Each run puts a token in the proxy URL; a request without it is not dialed. A process that can read the child environment can present that token. A DNS answer in a loopback, private, link-local, multicast, benchmarking, reserved, NAT64, or other non-global range is not dialed unless the request host is an IP literal already onallow_hosts. Proxy denials are audit rows with outcomehost_denied. Linux keeps the network namespace and the same proxy checks. - The egress dial filter treats the local-use NAT64 prefix
64:ff9b:1::/48as restricted, next to the well-known prefix64:ff9b::/96. A name that resolves into that range is not dialed unless the request host is an IP literal already onallow_hosts.
Changed
- Tests: CLI test helpers point
HOMEand the XDG dirs at per-test tempdirs and dropGEODE_KEY_FILE/GEODE_PASSPHRASE, so no test can resolve the operator's key. Custodygeode_rungains Fix 3 audit-fault tests (started-row and close-row) on the in-process daemon.
Full changelog: v2.0.0...v3.0.0