diff --git a/agents/hermes/policy-additions.yaml b/agents/hermes/policy-additions.yaml index f9bad72ae6c..6e44874bec2 100644 --- a/agents/hermes/policy-additions.yaml +++ b/agents/hermes/policy-additions.yaml @@ -22,6 +22,7 @@ filesystem_policy: - /dev/urandom - /app - /etc + - /run/nemoclaw/managed-startup-ca-bundle.pem - /var/log - /var/lib/dpkg # Allow package-version inspection without package mutation. read_write: diff --git a/agents/hermes/policy-permissive.yaml b/agents/hermes/policy-permissive.yaml index 50ecd2252b5..130c5f2c74b 100644 --- a/agents/hermes/policy-permissive.yaml +++ b/agents/hermes/policy-permissive.yaml @@ -23,6 +23,7 @@ filesystem_policy: - /dev/urandom - /app - /etc + - /run/nemoclaw/managed-startup-ca-bundle.pem - /var/log - /var/lib/dpkg # Allow package-version inspection without package mutation. read_write: diff --git a/agents/langchain-deepagents-code/policy-additions.yaml b/agents/langchain-deepagents-code/policy-additions.yaml index 7a5c7d247c5..a16737e26e4 100644 --- a/agents/langchain-deepagents-code/policy-additions.yaml +++ b/agents/langchain-deepagents-code/policy-additions.yaml @@ -19,6 +19,7 @@ filesystem_policy: - /dev/urandom - /app - /etc + - /run/nemoclaw/managed-startup-ca-bundle.pem - /var/log - /var/lib/dpkg # Allow package-version inspection without package mutation. read_write: diff --git a/agents/openclaw/policy-permissive.yaml b/agents/openclaw/policy-permissive.yaml index 458e9a3bd3d..879be837edd 100644 --- a/agents/openclaw/policy-permissive.yaml +++ b/agents/openclaw/policy-permissive.yaml @@ -19,6 +19,7 @@ filesystem_policy: - /dev/urandom - /app - /etc + - /run/nemoclaw/managed-startup-ca-bundle.pem - /var/log - /var/lib/dpkg # Allow package-version inspection without package mutation. read_write: diff --git a/agents/pi/policy-additions.yaml b/agents/pi/policy-additions.yaml index ed20cbc588d..968e93d1631 100644 --- a/agents/pi/policy-additions.yaml +++ b/agents/pi/policy-additions.yaml @@ -13,6 +13,7 @@ filesystem_policy: - /proc - /dev/urandom - /etc + - /run/nemoclaw/managed-startup-ca-bundle.pem - /var/log - /var/lib/dpkg # Allow package-version inspection without package mutation. read_write: diff --git a/nemoclaw-blueprint/policies/openclaw-sandbox-permissive.yaml b/nemoclaw-blueprint/policies/openclaw-sandbox-permissive.yaml index c59265bfb70..569f8f55d2d 100644 --- a/nemoclaw-blueprint/policies/openclaw-sandbox-permissive.yaml +++ b/nemoclaw-blueprint/policies/openclaw-sandbox-permissive.yaml @@ -24,6 +24,7 @@ filesystem_policy: - /dev/urandom - /app - /etc + - /run/nemoclaw/managed-startup-ca-bundle.pem - /var/log - /var/lib/dpkg # Allow package-version inspection without package mutation. read_write: diff --git a/nemoclaw-blueprint/policies/openclaw-sandbox.yaml b/nemoclaw-blueprint/policies/openclaw-sandbox.yaml index 497d8160443..a6ea3d52285 100644 --- a/nemoclaw-blueprint/policies/openclaw-sandbox.yaml +++ b/nemoclaw-blueprint/policies/openclaw-sandbox.yaml @@ -27,6 +27,7 @@ filesystem_policy: - /dev/urandom - /app - /etc + - /run/nemoclaw/managed-startup-ca-bundle.pem - /var/log - /var/lib/dpkg # Allow package-version inspection without package mutation. read_write: diff --git a/test/managed-startup-ca-policy.test.ts b/test/managed-startup-ca-policy.test.ts new file mode 100644 index 00000000000..f2a5df9a985 --- /dev/null +++ b/test/managed-startup-ca-policy.test.ts @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { readFileSync } from "node:fs"; + +import { describe, expect, it } from "vitest"; +import YAML from "yaml"; + +const CA_BUNDLE = "/run/nemoclaw/managed-startup-ca-bundle.pem"; +const POLICY_PATHS = [ + "nemoclaw-blueprint/policies/openclaw-sandbox.yaml", + "nemoclaw-blueprint/policies/openclaw-sandbox-permissive.yaml", + "agents/openclaw/policy-permissive.yaml", + "agents/hermes/policy-additions.yaml", + "agents/hermes/policy-permissive.yaml", + "agents/langchain-deepagents-code/policy-additions.yaml", + "agents/pi/policy-additions.yaml", +] as const; + +type Policy = { + filesystem_policy?: { + read_only?: string[]; + read_write?: string[]; + }; +}; + +describe("managed startup CA policy", () => { + it.each(POLICY_PATHS)("grants only exact read access in %s", (policyPath) => { + const policy = YAML.parse(readFileSync(policyPath, "utf8")) as Policy; + const runtimePrefix = "/run/nemoclaw"; + const readOnlyRuntimeGrants = (policy.filesystem_policy?.read_only ?? []).filter( + (entry) => entry === runtimePrefix || entry.startsWith(`${runtimePrefix}/`), + ); + const readWriteRuntimeGrants = (policy.filesystem_policy?.read_write ?? []).filter( + (entry) => entry === runtimePrefix || entry.startsWith(`${runtimePrefix}/`), + ); + + expect(policy.filesystem_policy?.read_only).toContain(CA_BUNDLE); + expect(readOnlyRuntimeGrants).toEqual([CA_BUNDLE]); + expect(readWriteRuntimeGrants).toEqual([]); + }); +});