fix: reject shell strings in trans argv
This commit is contained in:
@@ -382,6 +382,13 @@ export async function runSshArgvGuidanceContract(): Promise<JsonRecord> {
|
||||
assertCondition(argv.remoteCommand === "'true'", "argv command must shell-quote each token", argv);
|
||||
assertCondition(argv.requiresStdin === false, "argv command must not require stdin", argv);
|
||||
assertCondition(sshFailureHint("D601", argv, 255, "kex_exchange_identification: Connection closed by remote host") === null, "argv failures must not produce ssh-like friction hint", argv);
|
||||
assertThrows(
|
||||
() => parseSshInvocation("D601:/tmp", ["argv", "pwd && ls -la"]),
|
||||
/one shell-like command string.*script --/u,
|
||||
"argv must reject a single shell command string before the remote host treats it as an executable path",
|
||||
);
|
||||
const argvExplicitShell = parseSshInvocation("D601:/tmp", ["argv", "sh", "-c", "pwd && ls -la"]);
|
||||
assertCondition(argvExplicitShell.parsed.remoteCommand === "'sh' '-c' 'pwd && ls -la'", "argv must still allow explicit sh -c as multi-token direct argv", argvExplicitShell);
|
||||
|
||||
const shortcut = parseSshArgs(["pwd"]);
|
||||
assertCondition(shortcut.invocationKind === "argv", "safe command shortcuts must use argv quoting", shortcut);
|
||||
@@ -559,6 +566,11 @@ export async function runSshArgvGuidanceContract(): Promise<JsonRecord> {
|
||||
const routeTargetArgv = parseSshInvocation("D601:k3s:hwlab-dev:hwlab-cloud-api", ["argv", "sh", "-c", "printf ok"]);
|
||||
assertCondition(routeTargetArgv.parsed.invocationKind === "argv", "k3s target argv operation must stay explicit argv", routeTargetArgv);
|
||||
assertCondition(routeTargetArgv.parsed.remoteCommand === "'env' 'KUBECONFIG=/etc/rancher/k3s/k3s.yaml' 'kubectl' 'exec' '-n' 'hwlab-dev' 'deployment/hwlab-cloud-api' '--' 'sh' '-c' 'printf ok'", "D601:k3s:<namespace>:<workload> argv must exec the argv payload instead of treating argv as a pod command", routeTargetArgv);
|
||||
assertThrows(
|
||||
() => parseSshInvocation("D601:k3s:hwlab-dev:hwlab-cloud-api", ["argv", "pwd && ls -la"]),
|
||||
/one shell-like command string.*script --/u,
|
||||
"k3s workload argv must reject a single shell command string before kubectl exec treats it as an executable path",
|
||||
);
|
||||
|
||||
const routeTargetShell = parseSshInvocation("D601:k3s:hwlab-dev:hwlab-cloud-api/app", ["shell", "pwd && ls"]);
|
||||
assertCondition(routeTargetShell.parsed.remoteCommand === shellArgv(["env", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml", "kubectl", "exec", "-n", "hwlab-dev", "deployment/hwlab-cloud-api", "--", "sh", "-c", 'cd "$1" || exit; shift; exec "$@"', "unidesk-cwd", "/app", "sh", "-c", `${sshShellScriptPrelude()}\npwd && ls`]), "D601:k3s:<namespace>:<workload>/<workspace> shell must run shell logic after cd inside the pod", routeTargetShell);
|
||||
@@ -1075,7 +1087,7 @@ export async function runSshArgvGuidanceContract(): Promise<JsonRecord> {
|
||||
|
||||
assertThrows(
|
||||
() => parseSshInvocation("D601:k3s:kubectl", ["get", "pods"]),
|
||||
/route must locate a target only.*trans D601:k3s kubectl/u,
|
||||
/route must locate a target only.*ssh D601:k3s kubectl/u,
|
||||
"operation names must not be accepted as k3s route segments",
|
||||
);
|
||||
assertThrows(
|
||||
|
||||
Reference in New Issue
Block a user