fix: validate workspace secret source paths
This commit is contained in:
@@ -12,7 +12,17 @@ trim() {
|
||||
printf '%s' "$value"
|
||||
}
|
||||
|
||||
verify_secret_file_values() {
|
||||
is_safe_absolute_path() {
|
||||
local value="$1" segment
|
||||
local -a segments
|
||||
[[ "$value" == /* && "$value" != *//* ]] || return 1
|
||||
IFS=/ read -r -a segments <<<"$value"
|
||||
for segment in "${segments[@]}"; do
|
||||
[[ "$segment" != . && "$segment" != .. ]] || return 1
|
||||
done
|
||||
}
|
||||
|
||||
verify_path_variable_values() {
|
||||
local source="$1" line trimmed name value
|
||||
while IFS= read -r line || [[ -n "$line" ]]; do
|
||||
trimmed="$(trim "$line")"
|
||||
@@ -20,14 +30,14 @@ verify_secret_file_values() {
|
||||
name="$(trim "${trimmed%%[=:]*}")"
|
||||
value="$(trim "${trimmed#"$name"}")"
|
||||
value="$(trim "${value#[:=]}")"
|
||||
if [[ "$name" =~ ^[A-Za-z_][A-Za-z0-9_]*_FILE$ ]]; then
|
||||
if [[ "$name" =~ ^[A-Za-z_][A-Za-z0-9_]*_(FILE|SOURCE)$ ]]; then
|
||||
value="$(trim "${value%%#*}")"
|
||||
value="${value#\"}"; value="${value%\"}"
|
||||
value="${value#\'}"; value="${value%\'}"
|
||||
if [[ -n "$value" && "$value" != /* ]]; then
|
||||
echo "non-path secret-file value for $name in $source" >&2
|
||||
return 1
|
||||
fi
|
||||
value="${value#\"}"; value="${value%\"}"
|
||||
value="${value#\'}"; value="${value%\'}"
|
||||
if [[ -n "$value" ]] && ! is_safe_absolute_path "$value"; then
|
||||
echo "unsafe path value for $name in $source" >&2
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done <"$source"
|
||||
@@ -168,11 +178,18 @@ verify_copied_operator_fixtures() {
|
||||
verify_connector_fixture "$connector_dir"
|
||||
|
||||
printf 'THT_WS_EXAMPLE_DWH_PASSWORD_FILE=not-a-path\n' >"$fixture_root/non-path-secret.env"
|
||||
if verify_secret_file_values "$fixture_root/non-path-secret.env" >/dev/null 2>&1; then
|
||||
if verify_path_variable_values "$fixture_root/non-path-secret.env" >/dev/null 2>&1; then
|
||||
echo "non-path secret-file fixture was accepted" >&2
|
||||
return 1
|
||||
fi
|
||||
echo "non-path secret-file fixture rejected passed"
|
||||
|
||||
printf 'THT_WS_EXAMPLE_DWH_PASSWORD_SOURCE=literal-value\n' >"$fixture_root/literal-source.env"
|
||||
if verify_path_variable_values "$fixture_root/literal-source.env" >/dev/null 2>&1; then
|
||||
echo "literal secret-source fixture was accepted" >&2
|
||||
return 1
|
||||
fi
|
||||
echo "literal secret-source fixture rejected passed"
|
||||
}
|
||||
|
||||
case "$profile" in
|
||||
@@ -247,12 +264,12 @@ if grep -Ein '(^|[[:space:]])(password|api[_-]?key|token|secret)[[:space:]]*[:=]
|
||||
echo "installation documentation contains a secret literal" >&2
|
||||
exit 1
|
||||
fi
|
||||
verify_secret_file_values "$manual"
|
||||
verify_secret_file_values "$example"
|
||||
verify_secret_file_values "$root/docs/install/examples/git-https.workspace-registry.yaml"
|
||||
verify_secret_file_values "$root/docs/install/examples/git-ssh.workspace-registry.yaml"
|
||||
verify_secret_file_values "$root/docs/install/examples/workspace-bindings.env.example"
|
||||
verify_secret_file_values "$root/docs/install/examples/connector-secrets.workspace-registry.yaml"
|
||||
verify_path_variable_values "$manual"
|
||||
verify_path_variable_values "$example"
|
||||
verify_path_variable_values "$root/docs/install/examples/git-https.workspace-registry.yaml"
|
||||
verify_path_variable_values "$root/docs/install/examples/git-ssh.workspace-registry.yaml"
|
||||
verify_path_variable_values "$root/docs/install/examples/workspace-bindings.env.example"
|
||||
verify_path_variable_values "$root/docs/install/examples/connector-secrets.workspace-registry.yaml"
|
||||
verify_server_public_contract
|
||||
|
||||
commands="$(mktemp "${TMPDIR:-/tmp}/thoth-install-docs.XXXXXX")"
|
||||
|
||||
Reference in New Issue
Block a user