From 6f8c069c71810e68884afda0f2a4189eae1bf142 Mon Sep 17 00:00:00 2001 From: Ben U Date: Thu, 30 Jul 2026 13:33:48 -0600 Subject: [PATCH] Reject noncanonical protected provider values --- provider/protected-service.test.ts | 2 ++ provider/protected-service.ts | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/provider/protected-service.test.ts b/provider/protected-service.test.ts index 58e64a0..85c6fb6 100644 --- a/provider/protected-service.test.ts +++ b/provider/protected-service.test.ts @@ -88,8 +88,10 @@ test("rejects substitution, writable artifacts, noncanonical versions, and non-l ["providerVersion", "01.0.0"], ["providerVersion", "1.0.0-01"], ["providerVersion", "latest"], + ...["\n", "\r", "\u2028", "\u2029"].map((terminator) => ["providerVersion", `1.2.3${terminator}`] as [string, unknown]), ["providerDigest", "A".repeat(64)], ["providerDigest", "a".repeat(63)], + ...["\n", "\r", "\u2028", "\u2029"].map((terminator) => ["providerDigest", `${"a".repeat(64)}${terminator}`] as [string, unknown]), ["artifactPath", "/usr/lib/agent-intercom/providers/codex/../evil/provider.mjs"], ["artifactPath", "/tmp/codex/provider.mjs"], ["artifactOwnerUid", 1000], diff --git a/provider/protected-service.ts b/provider/protected-service.ts index 4b41e0f..8fe569c 100644 --- a/provider/protected-service.ts +++ b/provider/protected-service.ts @@ -95,6 +95,7 @@ function readProviderVersion(value: unknown): string { if ( typeof value !== "string" || value.length > 128 + || /[\r\n\u2028\u2029]/.test(value) || !CANONICAL_SEMANTIC_VERSION.test(value) ) { invalid("$candidate.providerVersion", "must be a canonical semantic version"); @@ -103,7 +104,7 @@ function readProviderVersion(value: unknown): string { } function readProviderDigest(value: unknown): string { - if (typeof value !== "string" || !/^[a-f0-9]{64}$/.test(value)) { + if (typeof value !== "string" || value.length !== 64 || !/^[a-f0-9]{64}$/.test(value)) { invalid("$candidate.providerDigest", "must be a lowercase SHA-256 digest"); } return value;