You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
All sandbox pods and CLI tools share a single mTLS client certificate (CN=navigator-client). The server authenticates that the client holds a valid cert but has no mechanism to verify which sandbox is calling. Sandbox identity is determined entirely by the sandbox_id field in the protobuf request message, which is not verified against the TLS connection.
Impact
A compromised sandbox pod could:
Read another sandbox's policy via GetSandboxPolicy(sandbox_id="other-sandbox")
Read another sandbox's provider credentials via GetSandboxProviderEnvironment(sandbox_id="other-sandbox")
Problem
All sandbox pods and CLI tools share a single mTLS client certificate (
CN=navigator-client). The server authenticates that the client holds a valid cert but has no mechanism to verify which sandbox is calling. Sandbox identity is determined entirely by thesandbox_idfield in the protobuf request message, which is not verified against the TLS connection.Impact
A compromised sandbox pod could:
GetSandboxPolicy(sandbox_id="other-sandbox")GetSandboxProviderEnvironment(sandbox_id="other-sandbox")ReportPolicyStatus(sandbox_id="other-sandbox")Current Mitigations
ListSandboxes)Root Cause
crates/navigator-bootstrap/src/pki.rs:35-98— PKI generates a single shared client certcrates/navigator-server/src/sandbox/mod.rs:681-710— Samenavigator-client-tlssecret mounted in all podscrates/navigator-server/src/multiplex.rs:44-56— No tonic interceptor extracts client cert identitycrates/navigator-server/src/grpc.rs:517-580— Handlers callrequest.into_inner()discarding connection metadataProposed Fix Options
Option A: Per-sandbox client certificates
crates/navigator-bootstrap/src/pki.rsto generate unique client certs per sandbox withsandbox_idin the SANsandbox_idin requestOption B: Tonic interceptor with Kubernetes identity
Request::extensions()for handler consumptionsandbox_idin requestOption C: Service mesh or network policy
Affected RPCs
GetSandboxPolicy— reads policy (existing)GetSandboxProviderEnvironment— reads credentials (existing)UpdateSandboxPolicy— writes policy (issue fix: use github backend for sccache in mise.toml #78)ReportPolicyStatus— writes status (issue fix: use github backend for sccache in mise.toml #78)ListSandboxPolicies— reads history (issue fix: use github backend for sccache in mise.toml #78)GetSandboxPolicyStatus— reads status (issue fix: use github backend for sccache in mise.toml #78)GetSandboxLogs— reads logs (issue fix: use github backend for sccache in mise.toml #78)Related
Discovered during security review of issue #78 (live policy updates).
Originally by @johntmyers on 2026-02-25T08:58:12.857-08:00