From 02b493b17b8399dddfbf8fa566cca3a4bf261d9c Mon Sep 17 00:00:00 2001 From: tgolob <34978067+tgolob@users.noreply.github.com> Date: Sat, 22 Aug 2026 08:58:54 -0400 Subject: [PATCH] fix(config): reject unknown top-level keys --- src/sandbox/sandbox-config.ts | 3 +++ test/config-validation.test.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/sandbox/sandbox-config.ts b/src/sandbox/sandbox-config.ts index baa6052d4..7cb415cf6 100644 --- a/src/sandbox/sandbox-config.ts +++ b/src/sandbox/sandbox-config.ts @@ -1140,6 +1140,9 @@ export const SandboxRuntimeConfigSchema = z '`safe.directory` without adding them to `filesystem.allowWrite`.', ), }) + // Reject unknown top-level keys so misspelled policy settings fail closed + // instead of being silently stripped by Zod. + .strict() .superRefine((cfg, ctx) => { const creds = cfg.credentials if (!creds) return diff --git a/test/config-validation.test.ts b/test/config-validation.test.ts index a041958bc..7aa518102 100644 --- a/test/config-validation.test.ts +++ b/test/config-validation.test.ts @@ -19,6 +19,33 @@ describe('Config Validation', () => { expect(result.success).toBe(true) }) + test('should reject unknown top-level config keys', () => { + const result = SandboxRuntimeConfigSchema.safeParse({ + network: { + allowedDomains: [], + deniedDomains: [], + }, + filesystem: { + denyRead: [], + allowWrite: [], + denyWrite: [], + }, + denyWriteTypo: ['/Users/me'], + }) + + expect(result.success).toBe(false) + if (!result.success) { + expect( + result.error.issues.some( + issue => + issue.code === 'unrecognized_keys' && + issue.path.length === 0 && + issue.keys.includes('denyWriteTypo'), + ), + ).toBe(true) + } + }) + test('should validate a config with valid domains', () => { const config = { network: {