fix(bash): validate managed env namespace

This commit is contained in:
Yichen Jiang
2026-07-12 17:03:11 +08:00
parent 1aadce9fe7
commit d4b5227071
5 changed files with 22 additions and 8 deletions
+10 -4
View File
@@ -58,10 +58,11 @@ export const SENSITIVE_ENV_PATTERN = /KEY|SECRET|TOKEN/i
* `ENV_OVERRIDES` then forces model-friendly terminal values, ordinary `extra`
* follows, and `dshEnv` merges last. Ordinary `extra` may restore a
* credential-shaped name whose value the caller already holds, but cannot set
* the managed namespace. `dsh-tool-bash` builds both channels from trusted
* named fields and never forwards model-provided environment objects.
* the managed namespace; `dshEnv` rejects ordinary names symmetrically.
* `dsh-tool-bash` builds both channels from trusted named fields and never
* forwards model-provided environment objects.
* @param extra - ordinary caller-supplied entries; `DSH_*` names are rejected.
* @param dshEnv - trusted managed `DSH_*` entries for the current execution.
* @param dshEnv - managed entries; names outside `DSH_*` are rejected.
* @returns the environment to hand to `spawn` for the child process.
*/
export function childEnv(
@@ -77,6 +78,11 @@ export function childEnv(
throw new Error(`ordinary bash env cannot set reserved variable "${key}"; use dshEnv`)
}
}
for (const key of Object.keys(dshEnv ?? {})) {
if (!key.startsWith(DSH_ENV_PREFIX)) {
throw new Error(`managed bash env cannot set ordinary variable "${key}"; use env`)
}
}
return { ...env, ...ENV_OVERRIDES, ...extra, ...dshEnv }
}
@@ -107,7 +113,7 @@ export interface SpawnSpec {
* terminal overrides. `DSH_*` names are rejected and belong in `dshEnv`.
*/
env?: Record<string, string> | undefined
/** Harness-owned `DSH_*` entries merged after ambient `DSH_*` removal. */
/** Harness-owned entries; non-`DSH_*` names are rejected before spawn. */
dshEnv?: DshEnvironment | undefined
}