






















@@ -20,6 +20,38 @@ import {
2020} from "./zod-schema.core.js";
2121import { sensitive } from "./zod-schema.sensitive.js";
222223+function validateSandboxBindEntries(
24+binds: readonly string[] | undefined,
25+ctx: z.RefinementCtx,
26+): void {
27+if (!binds) {
28+return;
29+}
30+for (let i = 0; i < binds.length; i += 1) {
31+const bind = normalizeOptionalString(binds[i]) ?? "";
32+if (!bind) {
33+ctx.addIssue({
34+code: z.ZodIssueCode.custom,
35+path: ["binds", i],
36+message: "Sandbox security: bind mount entry must be a non-empty string.",
37+});
38+continue;
39+}
40+41+const parsed = splitSandboxBindSpec(bind);
42+const source = (parsed ? parsed.host : bind).trim();
43+if (!isSandboxHostPathAbsolute(source)) {
44+ctx.addIssue({
45+code: z.ZodIssueCode.custom,
46+path: ["binds", i],
47+message:
48+`Sandbox security: bind mount "${bind}" uses a non-absolute source path "${source}". ` +
49+"Only absolute POSIX or Windows drive-letter paths are supported for sandbox binds.",
50+});
51+}
52+}
53+}
54+2355export const AgentRunRetriesConfigSchema = z
2456.object({
2557base: z.number().int().positive().optional(),
@@ -168,31 +200,7 @@ const SandboxDockerSchema = z
168200})
169201.strict()
170202.superRefine((data, ctx) => {
171-if (data.binds) {
172-for (let i = 0; i < data.binds.length; i += 1) {
173-const bind = normalizeOptionalString(data.binds[i]) ?? "";
174-if (!bind) {
175-ctx.addIssue({
176-code: z.ZodIssueCode.custom,
177-path: ["binds", i],
178-message: "Sandbox security: bind mount entry must be a non-empty string.",
179-});
180-continue;
181-}
182-183-const parsed = splitSandboxBindSpec(bind);
184-const source = (parsed ? parsed.host : bind).trim();
185-if (!isSandboxHostPathAbsolute(source)) {
186-ctx.addIssue({
187-code: z.ZodIssueCode.custom,
188-path: ["binds", i],
189-message:
190-`Sandbox security: bind mount "${bind}" uses a non-absolute source path "${source}". ` +
191-"Only absolute POSIX or Windows drive-letter paths are supported for sandbox binds.",
192-});
193-}
194-}
195-}
203+validateSandboxBindEntries(data.binds, ctx);
196204const blockedNetworkReason = getBlockedNetworkModeReason({
197205network: data.network,
198206allowContainerNamespaceJoin: data.dangerouslyAllowContainerNamespaceJoin === true,
@@ -253,6 +261,7 @@ const SandboxBrowserSchema = z
253261binds: z.array(z.string()).optional(),
254262})
255263.superRefine((data, ctx) => {
264+validateSandboxBindEntries(data.binds, ctx);
256265if (normalizeLowercaseStringOrEmpty(data.network ?? "") === "host") {
257266ctx.addIssue({
258267code: z.ZodIssueCode.custom,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。