#!/usr/bin/env bash ############################################################################### # conformance-clone — fetch the impl repo at the exact commit under test. # # Baked into the conformance-runner image at /usr/local/bin/conformance-clone, mode 0755 # root:root, so the running container (uid 65532) cannot replace it. The Job's init # container runs it as `command: ["/usr/local/bin/conformance-clone"]` with NO args. # # WHY IT IS A FILE IN THE IMAGE AND NOT AN INLINE SCRIPT IN THE JOB # ----------------------------------------------------------------- # platform/kyverno/admission/conformance-trigger-job-shape.yaml pins the MAIN container's # `command` to ["./run.sh"] and constrains its `args` — but it never reads `initContainers`. # So a Job from `conformance-trigger` could carry an init container with # `command: ["/bin/sh","-c"]` and an arbitrary script, running as the privileged # `conformance-runner` SA. Reproduced by the policy's author: such a Job is ADMITTED # (pass 3, fail 0). # # The fix has two halves and NEITHER works alone: # 1. this file — a fixed path with fixed behaviour and no argument surface, so there is # nothing for a caller to inject into; and # 2. a 4th policy rule requiring every initContainer's `command` to be exactly # ["/usr/local/bin/conformance-clone"] with no `args`. That rule lives in the policy # and is NOT this branch's to write — a security boundary changes in its own reviewed PR. # Without (2) this file is merely available, not required. # # THE ENV SURFACE IS THE OTHER HALF OF THE SAME HOLE — READ THIS BEFORE "SIMPLIFYING" # ----------------------------------------------------------------------------------- # The admission policy says NOTHING about `env`. Verified: no `env`, `valueFrom` or # `secretKeyRef` clause appears in it. So a script that took its repository URL from the # environment would just move the injection one field over — the trigger sets # CONFORMANCE_REPO_URL to a repo it controls, this clones it, and `./run.sh` from THAT repo # executes under the privileged runner SA. Identical shape to the initContainers gap, and # "no args" would not have stopped it. # # Therefore the repository URL and the clone target are COMPILED IN below. The matching env # vars are still read, so the Job template can keep declaring them and stay self-documenting, # but a value that DISAGREES with the baked literal is a hard failure, never a redirect. # The only per-run input that is genuinely trusted is the commit SHA, and it must be 40 hex # characters of a commit that the baked repository actually contains. # # Inputs (environment; no arguments are accepted): # CONFORMANCE_GIT_SHA REQUIRED. 40 lowercase hex. The commit under test. # CONFORMANCE_REPO_URL optional. Must equal the baked URL if set. # CONFORMANCE_SRC optional. Must equal the baked target if set. # GITEA_USERNAME optional, from Secret `conformance-git-readonly`. # GITEA_TOKEN optional, from Secret `conformance-git-readonly`. # TMPDIR / HOME optional; must be under /workspace. Default to /workspace/{tmp,home}. # # Runs under: uid 65532, readOnlyRootFilesystem, only the `workspace` and `results` volumes. # Everything it writes therefore lives under /workspace. There is no writable /tmp. ############################################################################### set -euo pipefail # --- COMPILED-IN, NOT CONFIGURABLE (see the header) -------------------------- readonly BAKED_REPO_URL="https://gitea.home.keithjackson.dev/Home-Network/home-network-k3s-impl.git" readonly BAKED_SRC="/workspace/src" die() { printf 'FATAL: %s\n' "$*" >&2; exit 1; } log() { printf '==> %s\n' "$*"; } [ "$#" -eq 0 ] || die "takes no arguments (got $#: $*). Arguments are where an injection would live." # --- the one genuinely trusted input ---------------------------------------- # A bad SHA must never degrade into "ran whatever the branch tip was": an unrendered # @@CONFORMANCE_GIT_SHA@@ placeholder has to be a hard failure, not a silent run of main. : "${CONFORMANCE_GIT_SHA:?CONFORMANCE_GIT_SHA is not set; the CI trigger did not render it}" printf '%s' "${CONFORMANCE_GIT_SHA}" | grep -Eq '^[0-9a-f]{40}$' \ || die "CONFORMANCE_GIT_SHA is not a 40-hex commit id: '${CONFORMANCE_GIT_SHA}' The CI trigger did not substitute it, or substituted junk." # --- env that may agree with the baked values, but may not override them ----- REPO_URL="${CONFORMANCE_REPO_URL:-${BAKED_REPO_URL}}" [ "${REPO_URL}" = "${BAKED_REPO_URL}" ] || die "CONFORMANCE_REPO_URL does not match the image's baked repository. got: ${REPO_URL} baked: ${BAKED_REPO_URL} Refusing. A caller that can choose the repository can choose the code that runs." SRC="${CONFORMANCE_SRC:-${BAKED_SRC}}" [ "${SRC}" = "${BAKED_SRC}" ] || die "CONFORMANCE_SRC does not match the image's baked clone target. got: ${SRC} baked: ${BAKED_SRC} Refusing." # Scratch paths must stay on the workspace volume; the root filesystem is read-only. # `/workspace` ITSELF is allowed, not just subdirectories: the image's own ENV sets # HOME=/workspace, and an earlier version of this guard rejected exactly that — it matched # only `/workspace/*` and so refused its own default. Caught by running it, not by reading it. : "${TMPDIR:=/workspace/tmp}" : "${HOME:=/workspace/home}" on_workspace() { case "$1" in /workspace|/workspace/*) return 0 ;; *) return 1 ;; esac; } on_workspace "${TMPDIR}" || die "TMPDIR must be /workspace or under it (got '${TMPDIR}')" on_workspace "${HOME}" || die "HOME must be /workspace or under it (got '${HOME}')" export TMPDIR HOME mkdir -p "${TMPDIR}" "${HOME}" # --- credential (optional) --------------------------------------------------- # git's shell credential helper is invoked as `sh -c ' get'`, so it reads $1 and # answers from the environment. The token therefore never appears in argv and never on disk. # # ANONYMOUS FALLBACK, DELIBERATE AND ANNOUNCED. Read access to this repository currently # needs no credential (measured: `ls-remote` succeeds unauthenticated from inside this # image), so requiring the Secret would fail runs that would otherwise work — and would make # this script untestable without one. It is not a privilege downgrade: the integrity # guarantee here is the SHA assertion below, not the credential. Which mode was used is # logged, so a run that silently lost its Secret is visible in the log rather than inferred. CRED='' if [ -n "${GITEA_USERNAME:-}" ] && [ -n "${GITEA_TOKEN:-}" ]; then CRED='!f() { if [ "$1" = get ]; then printf "username=%s\npassword=%s\n" "$GITEA_USERNAME" "$GITEA_TOKEN"; fi; }; f' log "authenticating as '${GITEA_USERNAME}' (token from the environment, never argv)" else log "no GITEA_USERNAME/GITEA_TOKEN in the environment — cloning ANONYMOUSLY" fi git_c() { if [ -n "${CRED}" ]; then git -c credential.helper="${CRED}" "$@"; else git "$@"; fi } # --- clone, land the exact commit, and PROVE it ------------------------------ log "shallow clone ${REPO_URL} -> ${SRC}" git_c clone --depth 1 --no-tags --single-branch "${REPO_URL}" "${SRC}" if ! git -C "${SRC}" cat-file -e "${CONFORMANCE_GIT_SHA}^{commit}" 2>/dev/null; then log "${CONFORMANCE_GIT_SHA} is not in the shallow tip; fetching that commit" git_c -C "${SRC}" fetch --depth 1 --no-tags origin "${CONFORMANCE_GIT_SHA}" fi git -C "${SRC}" checkout --detach "${CONFORMANCE_GIT_SHA}" # The assertion is the point of the whole script: everything above is best-effort plumbing, # this is what makes "the suite ran at the commit under test" a fact rather than a hope. head="$(git -C "${SRC}" rev-parse HEAD)" [ "${head}" = "${CONFORMANCE_GIT_SHA}" ] \ || die "checked out ${head}, expected ${CONFORMANCE_GIT_SHA}." test -x "${SRC}/conformance/run.sh" \ || die "no executable conformance/run.sh at ${head}." log "suite ready at ${head}"