mirror of
https://github.com/pgsty/minio.git
synced 2026-08-09 15:53:28 +03:00
ci: stop interpolating the dispatch tag into the release script
The compute step spliced ${{ github.event.inputs.tag }} straight into the
run: body, so a dispatch tag containing shell metacharacters was parsed as
script - arbitrary code in a job holding a contents:write token. Pass the
input through the environment instead (INPUT_TAG), the same shape
docker-release.yml already uses, so the value reaches bash as data.
Second vector: the old format check compared the sed output against the input
to decide validity, and sed anchors ^...$ per line. A tag carrying a newline
passed the check on its first line and the remaining lines flowed into
$GITHUB_ENV, setting arbitrary variables (PATH, LD_PRELOAD, ...) for every
later step. Replace it with a bash =~ whitelist anchored to the whole string,
which rejects any multi-line value up front.
Verified: a legal RELEASE.* tag is accepted and yields the right PKG_VERSION;
a `"; touch ...; #` injection and a newline-carrying PATH/LD_PRELOAD payload
are both rejected; an empty input falls back to the git ref name.
Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -38,15 +38,24 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Compute release variables
|
- name: Compute release variables
|
||||||
|
env:
|
||||||
|
# Passed through the environment, never interpolated into the script
|
||||||
|
# body: a dispatch input reaches bash as data, so it cannot inject
|
||||||
|
# commands the way a `${{ ... }}` splice into the source would.
|
||||||
|
INPUT_TAG: ${{ github.event.inputs.tag }}
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
TAG="${{ github.event.inputs.tag || github.ref_name }}"
|
TAG="${INPUT_TAG:-${GITHUB_REF_NAME}}"
|
||||||
VERSION_HYPHEN="${TAG#RELEASE.}"
|
# Whitelist the exact tag shape before the value is used anywhere. bash
|
||||||
PKG_VERSION="$(echo "${VERSION_HYPHEN}" | sed -E 's/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2})-([0-9]{2})-([0-9]{2})Z$/\1\2\3\4\5\6.0.0/')"
|
# =~ anchors ^...$ to the whole string (not per line, as sed would), so
|
||||||
if [ "${PKG_VERSION}" = "${VERSION_HYPHEN}" ]; then
|
# a tag carrying a newline cannot pass and then smuggle extra lines into
|
||||||
echo "Invalid release tag format: ${TAG}"
|
# $GITHUB_ENV below.
|
||||||
|
if [[ ! "${TAG}" =~ ^RELEASE\.[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}-[0-9]{2}-[0-9]{2}Z$ ]]; then
|
||||||
|
echo "Invalid release tag format: ${TAG}" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
VERSION_HYPHEN="${TAG#RELEASE.}"
|
||||||
|
PKG_VERSION="$(echo "${VERSION_HYPHEN}" | sed -E 's/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2})-([0-9]{2})-([0-9]{2})Z$/\1\2\3\4\5\6.0.0/')"
|
||||||
VERSION_COLON="$(echo "${VERSION_HYPHEN}" | sed -E 's/T([0-9]{2})-([0-9]{2})-([0-9]{2})Z$/T\1:\2:\3Z/')"
|
VERSION_COLON="$(echo "${VERSION_HYPHEN}" | sed -E 's/T([0-9]{2})-([0-9]{2})-([0-9]{2})Z$/T\1:\2:\3Z/')"
|
||||||
LDFLAGS="$(MINIO_RELEASE=RELEASE go run buildscripts/gen-ldflags.go "${VERSION_COLON}")"
|
LDFLAGS="$(MINIO_RELEASE=RELEASE go run buildscripts/gen-ldflags.go "${VERSION_COLON}")"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user