3"""Inert case data for the structural shell-caller policy selftest."""
5from __future__
import annotations
7from shell_entrypoint_policy
import (
14INSTALL =
"scripts/ci/install_unicorn.sh"
15INFRA =
"infra/network/ap_openwrt.sh"
16EXTENSIONLESS =
"scripts/git/pre-commit"
17SOURCED =
"scripts/hil/lib/bench_lock.sh"
18DUAL =
"scripts/ci/lib/tool_env.sh"
19RELEASE_LOADER_REL =
"scripts/dev/provision_dev_box_toolchain.sh"
20RELEASE_LOADER_CALL = (
21 'source_release_selftest_helper_from "$main" "$helper" '
22 '"$expected_dir" "$expected_digest" || return 1'
24RELEASE_FIXTURE_REL =
"scripts/dev/provision_dev_box_toolchain_selftest.bash"
25RELEASE_FIXTURE_CALL = (
26 'source_release_selftest_helper_from "$main" "$helper" "$directory" "$digest" || status=$?'
31 security: ShellSecurity,
35 privileged_parent: bool =
False,
37 """Build one compact inert typed-policy fixture."""
42 executable=executable,
43 source_requires_privileged_parent=privileged_parent,
48 INSTALL: _policy(ShellSecurity.PRIVILEGED, ShellUsage.ENTRY, executable=
True),
49 INFRA: _policy(ShellSecurity.PRIVILEGED, ShellUsage.ENTRY, executable=
True),
50 EXTENSIONLESS: _policy(ShellSecurity.PRIVILEGED, ShellUsage.ENTRY, executable=
True),
52 ShellSecurity.PRIVILEGED,
53 ShellUsage.SOURCED_ONLY,
55 privileged_parent=
True,
57 DUAL: _policy(ShellSecurity.PORTABLE, ShellUsage.DUAL_USE, executable=
False),
59PRIVILEGED_CALLER = _policy(
60 ShellSecurity.PRIVILEGED,
64PORTABLE_CALLER = _policy(ShellSecurity.PORTABLE, ShellUsage.ENTRY, executable=
True)
65SOURCED_CALLER = _policy(
66 ShellSecurity.PRIVILEGED,
67 ShellUsage.SOURCED_ONLY,
69 privileged_parent=
True,
71UNBOUND_SOURCED_CALLER = _policy(
72 ShellSecurity.PRIVILEGED,
73 ShellUsage.SOURCED_ONLY,
76NONEXECUTABLE_CALLER = _policy(
77 ShellSecurity.PRIVILEGED,
81SH_CALLER = ShellPolicy(
82 ShellSecurity.PRIVILEGED,
84 ShellDialect.POSIX_SH,
86 source_requires_privileged_parent=
False,
89RELEASE_LOADER_CASES = (
90 (RELEASE_LOADER_REL, PRIVILEGED_CALLER, RELEASE_LOADER_CALL,
False,
"exact loader rejected"),
96 "exact fixture loader rejected",
101 f
"source_release_selftest_helper_from() {{\n :\n}}\n{RELEASE_LOADER_CALL}",
103 "loader definition treated as a call",
106 "scripts/dev/other.sh",
110 "wrong file accepted",
112 (RELEASE_LOADER_REL,
None, RELEASE_LOADER_CALL,
True,
"wrong caller accepted"),
118 "portable caller accepted",
125 "sourced-only caller accepted",
129 NONEXECUTABLE_CALLER,
132 "non-executable caller accepted",
134 (RELEASE_LOADER_REL, SH_CALLER, RELEASE_LOADER_CALL,
True,
"non-Bash caller accepted"),
138 RELEASE_FIXTURE_CALL,
140 "fixture entry caller accepted",
144 UNBOUND_SOURCED_CALLER,
145 RELEASE_FIXTURE_CALL,
147 "fixture unbound source parent accepted",
150 "scripts/dev/other_selftest.bash",
152 RELEASE_FIXTURE_CALL,
154 "fixture wrong file accepted",
159 RELEASE_FIXTURE_CALL.replace(
"source_release_selftest_helper_from",
"source"),
161 "fixture wrong function accepted",
163 (RELEASE_FIXTURE_REL, SOURCED_CALLER,
"",
True,
"missing fixture loader call accepted"),
167 f
"{RELEASE_FIXTURE_CALL} extra",
169 "extra fixture loader argument accepted",
174 RELEASE_FIXTURE_CALL.replace(
'"$main" "$helper"',
'"$helper" "$main"'),
176 "reordered fixture loader arguments accepted",
181 RELEASE_FIXTURE_CALL.replace(
'"$digest"',
'"$helper"'),
183 "substituted fixture loader argument accepted",
188 RELEASE_FIXTURE_CALL.replace(
' "$main"',
' \\\n "$main"'),
190 "continued fixture loader argv accepted",
195 RELEASE_FIXTURE_CALL.replace(
"source_release_selftest_helper_from ",
"$loader "),
197 "indirect fixture loader command accepted",
202 RELEASE_LOADER_CALL.replace(
"source_release_selftest_helper_from",
"source"),
204 "wrong loader function accepted",
206 (RELEASE_LOADER_REL, PRIVILEGED_CALLER,
"",
True,
"missing loader call accepted"),
210 f
"{RELEASE_LOADER_CALL} extra",
212 "extra loader argument accepted",
217 RELEASE_LOADER_CALL.replace(
'"$main" "$helper"',
'"$helper" "$main"'),
219 "reordered loader arguments accepted",
224 RELEASE_LOADER_CALL.replace(
'"$expected_digest"',
'"$helper"'),
226 "substituted loader argument accepted",
231 f
"{RELEASE_LOADER_CALL}\n{RELEASE_LOADER_CALL}",
233 "duplicate loader call accepted",
238 f
"{RELEASE_FIXTURE_CALL}\n{RELEASE_FIXTURE_CALL}",
240 "duplicate fixture loader call accepted",
245 RELEASE_LOADER_CALL.replace(
' "$main"',
' \\\n "$main"'),
247 "continued loader argv accepted",
252 RELEASE_LOADER_CALL.replace(
"source_release_selftest_helper_from ",
"$loader "),
254 "indirect loader command accepted",
259 (f
"/bin/bash -p {INSTALL}\n", 0,
"exact privileged argv rejected"),
260 (f
"/bin/bash -p {INSTALL} --prefix /tmp/x\n", 0,
"target arguments rejected"),
261 (f
"/bin/bash -p -- {INSTALL}\n", 1,
"extra interpreter option accepted"),
262 (f
"./{INSTALL}\n", 0,
"direct verified entry rejected"),
263 (f
"$ROOT/{INSTALL} --help\n", 0,
"literal rooted direct entry rejected"),
264 (f
"/usr/bin/bash {INSTALL}\n", 1,
"/usr/bin/bash accepted"),
265 (f
"/usr/local/bin/bash {INSTALL}\n", 1,
"/usr/local/bin/bash accepted"),
266 (f
'"/bin/bash" {INSTALL}\n', 1,
"quoted weak Bash accepted"),
267 (f
"/bin/ba\\\nsh {INSTALL}\n", 1,
"split weak Bash accepted"),
268 (
"bash scripts/ci/\\\ninstall_unicorn.sh\n", 1,
"split target accepted"),
270 f
"/bin/bash -p {INSTALL}\nbash scripts/ci/\\\ninstall_unicorn.sh\n",
272 "exact plus weak child accepted",
274 (f
'runner=/bin/bash; "$runner" {INSTALL}\n', 1,
"variable Bash accepted"),
275 (f
'script={INSTALL}; /bin/bash -p "$script"\n', 1,
"variable target accepted"),
276 (f
"/bin/bash -p {INFRA}\n", 0,
"infra target rejected"),
277 (f
"/bin/bash -p {EXTENSIONLESS}\n", 0,
"extensionless target rejected"),
278 (f
"/bin/bash -p {SOURCED}\n", 1,
"sourced-only target executed"),
279 (f
"source {SOURCED}\n", 1,
"unprivileged source parent accepted"),
280 (f
"source {DUAL}\n", 0,
"portable dual-use source rejected"),
281 (f
"exec /bin/bash -p {INSTALL} --help\n", 0,
"exec prefix rejected"),
282 (f
"FILES=(\n {SOURCED}\n)\n", 0,
"array data treated as a sourced-helper launch"),
284 'OWNER_BASH=/bin/bash\n[[ -x "$OWNER_BASH" ]]\n',
286 "conditional path data treated as an indirect launch",
288 (f
"/bin/bash -p -n {INSTALL}\n", 1,
"unregistered interpreter-option accepted"),
290 f
"printf '%s\\n' item | xargs -P 2 -I{{}} /bin/bash -p {INSTALL} {{}}\n",
292 "xargs protected child argv rejected",
295 f
"printf '%s\\n' item | xargs -P 2 -I{{}} bash {INSTALL} {{}}\n",
297 "xargs weak child argv accepted",
303 f
'import subprocess\nsubprocess.run(["/bin/bash", "-p", "{INSTALL}"])\n',
305 "safe Python argv rejected",
308 f
'import subprocess\nsubprocess.run(["/bin/bash", "{INSTALL}"])\n',
310 "weak Python argv accepted",
313 f
'import subprocess\na=["/usr/bin/bash", "{INSTALL}"]\nsubprocess.run(a)\n',
315 "Python argv dataflow accepted",
318 f
'FIXTURE = "/usr/bin/bash {INSTALL}"\n',
320 "inert Python fixture string treated as a process launch",
325 (f
'{{"command":"/bin/bash","args":["{INFRA}"]}}',
"json", 1,
"JSON weak"),
327 f
'{{"command":"/bin/bash","args":["-p","{INFRA}"]}}',
330 "grouped JSON argv was re-scanned as detached args",
332 (f
"run: /usr/bin/bash {INSTALL}\n",
"yaml", 1,
"YAML weak argv accepted"),
334 f
"run: >-\n /bin/bash -p\n {INSTALL}\n --help\n",
337 "YAML folded exact privileged argv rejected",
340 f
"run: >-\n bash\n {INSTALL}\n --help\n",
343 "YAML folded weak argv accepted",
346 f
"run: >-\n /bin/bash -p\n {{{{ (repo_dir ~ '/{INSTALL}') | quote }}}}\n",
349 "YAML quoted literal-path template rejected",
352 f
"run: >-\n bash\n {{{{ (repo_dir ~ '/{INSTALL}') | quote }}}}\n",
355 "YAML weak templated argv accepted",
358 f
"run: >-\n /bin/bash -p\n {{{{ (repo_dir ~ '/{INSTALL}') }}}}\n",
361 "YAML unquoted path template accepted",
364 f
"description: /usr/bin/bash {INSTALL}\n",
367 "YAML data field treated as a command",
369 (f
"RUN /usr/local/bin/bash {INSTALL}\n",
"docker", 1,
"Docker weak argv"),
371 f
"```shell\n/bin/bash {INSTALL}\n```\n",
374 "Markdown shell weak argv accepted",
377 f
'```json\n{{"command":"/bin/bash","args":["{INFRA}"]}}\n```\n',
380 "Markdown JSON weak argv accepted",
383 f
"The historical spelling `/usr/bin/bash {INSTALL}` is prose.\n",
386 "Markdown prose treated as executable",
392 f
"safe image:\n #!/bin/bash -p\n source {SOURCED}\n",
394 "privileged Just source context rejected",
397 f
"weak image:\n #!/usr/bin/env bash\n source {SOURCED}\n",
399 "portable Just source context accepted",
401 (f
"direct:\n @/bin/bash -p {INSTALL}\n", 0,
"Just quiet prefix broke exact argv"),
403 'clean := "/usr/bin/env -i PATH=/usr/bin:/bin"\n'
404 f
"setup:\n {{{{ clean }}}} /bin/bash -p {INSTALL}\n",
406 "Just clean-environment prefix broke exact protected argv",