Skip to content

Commit d7654ef

Browse files
committed
ci(security): Make tools' versions environment vars
To further cleanup the GH actions workflows, we use env vars instead of the input. We should follow-up on this to sanitize the actual inputs. Signed-off-by: Anastassios Nanos <ananos@nubificus.co.uk>
1 parent a81834e commit d7654ef

1 file changed

Lines changed: 68 additions & 22 deletions

File tree

‎.github/workflows/vm_test.yml‎

Lines changed: 68 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ on:
4343
required: false
4444

4545
workflow_dispatch:
46-
46+
4747
permissions:
4848
contents: read
4949

@@ -60,8 +60,34 @@ jobs:
6060
runner: ubuntu-22.04
6161
- arch: arm64
6262
runner: ubuntu-22.04-arm
63-
63+
6464
steps:
65+
- name: Validate inputs (prevent command injection)
66+
shell: bash
67+
run: |
68+
# Validate version-like inputs (X.Y.Z format)
69+
for var in go_version runc_version containerd_version cni_version nerdctl_version crictl_version firecracker_version solo5_version; do
70+
value="${{ inputs.$var }}"
71+
if ! [[ "$value" =~ ^[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then
72+
echo "Invalid format for $var: $value"
73+
exit 1
74+
fi
75+
done
76+
77+
# Validate runner JSON arrays
78+
if ! echo '${{ inputs.runner-archs }}' | jq empty 2>/dev/null; then
79+
echo "Invalid JSON for runner-archs"
80+
exit 1
81+
fi
82+
if ! echo '${{ inputs.runner }}' | jq empty 2>/dev/null; then
83+
echo "Invalid JSON for runner"
84+
exit 1
85+
fi
86+
if ! echo '${{ inputs.runner-arch-map }}' | jq empty 2>/dev/null; then
87+
echo "Invalid JSON for runner-arch-map"
88+
exit 1
89+
fi
90+
6591
- name: Harden the runner (Audit all outbound calls)
6692
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
6793
with:
@@ -83,20 +109,27 @@ jobs:
83109
sudo mv virtiofsd /usr/libexec/virtiofsd
84110
85111
- name: Install runc
112+
env:
113+
RUNC_VERSION: ${{ inputs.runc_version }}
86114
run: |
87-
wget -q https://github.com/opencontainers/runc/releases/download/v${{ inputs.runc_version }}/runc.$(dpkg --print-architecture)
115+
SAFE_RUNC="${RUNC_VERSION}"
116+
wget -q "https://github.com/opencontainers/runc/releases/download/v${SAFE_RUNC}/runc.$(dpkg --print-architecture)"
88117
sudo install -m 755 runc.$(dpkg --print-architecture) /usr/local/sbin/runc
89118
rm -f ./runc.$(dpkg --print-architecture)
90119
91120
- name: Install containerd
121+
env:
122+
CONTAINERD_VERSION: ${{ inputs.containerd_version }}
92123
run: |
93-
wget -q https://github.com/containerd/containerd/releases/download/v${{ inputs.containerd_version }}/containerd-${{ inputs.containerd_version }}-linux-$(dpkg --print-architecture).tar.gz
94-
sudo tar Cxzvf /usr/local containerd-${{ inputs.containerd_version }}-linux-$(dpkg --print-architecture).tar.gz
95-
rm -f containerd-${{ inputs.containerd_version }}-linux-$(dpkg --print-architecture).tar.gz
124+
SAFE_CONTAINERD="${CONTAINERD_VERSION}"
125+
wget -q "https://github.com/containerd/containerd/releases/download/v${SAFE_CONTAINERD}/containerd-${SAFE_CONTAINERD}-linux-$(dpkg --print-architecture).tar.gz"
126+
sudo tar Cxzvf /usr/local "containerd-${SAFE_CONTAINERD}-linux-$(dpkg --print-architecture).tar.gz"
127+
rm -f "containerd-${SAFE_CONTAINERD}-linux-$(dpkg --print-architecture).tar.gz"
96128
97129
- name: Set up containerd service
98130
run: |
99-
wget -q https://raw.githubusercontent.com/containerd/containerd/v${{ inputs.containerd_version }}/containerd.service
131+
SAFE_CONTAINERD="${{ inputs.containerd_version }}"
132+
wget -q "https://raw.githubusercontent.com/containerd/containerd/v${SAFE_CONTAINERD}/containerd.service"
100133
sudo rm -f /lib/systemd/system/containerd.service
101134
sudo mv containerd.service /lib/systemd/system/containerd.service
102135
sudo systemctl daemon-reload
@@ -133,42 +166,55 @@ jobs:
133166
sudo systemctl restart containerd
134167
135168
- name: Install CNI plugins
169+
env:
170+
CNI_VERSION: ${{ inputs.cni_version }}
136171
run: |
137-
wget -q https://github.com/containernetworking/plugins/releases/download/v${{ inputs.cni_version }}/cni-plugins-linux-$(dpkg --print-architecture)-v${{ inputs.cni_version }}.tgz
172+
SAFE_CNI="${CNI_VERSION}"
173+
wget -q "https://github.com/containernetworking/plugins/releases/download/v${SAFE_CNI}/cni-plugins-linux-$(dpkg --print-architecture)-v${SAFE_CNI}.tgz"
138174
sudo mkdir -p /opt/cni/bin
139-
sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-$(dpkg --print-architecture)-v${{ inputs.cni_version }}.tgz
140-
rm -f cni-plugins-linux-$(dpkg --print-architecture)-v${{ inputs.cni_version }}.tgz
175+
sudo tar Cxzvf /opt/cni/bin "cni-plugins-linux-$(dpkg --print-architecture)-v${SAFE_CNI}.tgz"
176+
rm -f "cni-plugins-linux-$(dpkg --print-architecture)-v${SAFE_CNI}.tgz"
141177
142178
- name: Install nerdctl
179+
env:
180+
NERDCTL_VERSION: ${{ inputs.nerdctl_version }}
143181
run: |
144-
wget -q https://github.com/containerd/nerdctl/releases/download/v${{ inputs.nerdctl_version }}/nerdctl-${{ inputs.nerdctl_version }}-linux-$(dpkg --print-architecture).tar.gz
145-
sudo tar Cxzvf /usr/local/bin nerdctl-${{ inputs.nerdctl_version }}-linux-$(dpkg --print-architecture).tar.gz
146-
rm -f nerdctl-${{ inputs.nerdctl_version }}-linux-$(dpkg --print-architecture).tar.gz
182+
SAFE_NERDCTL="${NERDCTL_VERSION}"
183+
wget -q "https://github.com/containerd/nerdctl/releases/download/v${SAFE_NERDCTL}/nerdctl-${SAFE_NERDCTL}-linux-$(dpkg --print-architecture).tar.gz"
184+
sudo tar Cxzvf /usr/local/bin "nerdctl-${SAFE_NERDCTL}-linux-$(dpkg --print-architecture).tar.gz"
185+
rm -f "nerdctl-${SAFE_NERDCTL}-linux-$(dpkg --print-architecture).tar.gz"
147186
148187
- name: Install crictl
188+
env:
189+
CRICTL_VERSION: ${{ inputs.crictl_version }}
149190
run: |
150-
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/${{ inputs.crictl_version }}/crictl-${{ inputs.crictl_version }}-linux-${{matrix.arch}}.tar.gz
151-
sudo tar zxvf crictl-${{ inputs.crictl_version }}-linux-${{matrix.arch}}.tar.gz -C /usr/local/bin
152-
rm -f crictl-${{ inputs.crictl_version }}-linux-${{matrix.arch}}.tar.gz
191+
SAFE_CRI="${CRICTL_VERSION}"
192+
wget "https://github.com/kubernetes-sigs/cri-tools/releases/download/${SAFE_CRI}/crictl-${SAFE_CRI}-linux-${{ matrix.arch }}.tar.gz"
193+
sudo tar zxvf "crictl-${SAFE_CRI}-linux-${{ matrix.arch }}.tar.gz" -C /usr/local/bin
194+
rm -f "crictl-${SAFE_CRI}-linux-${{ matrix.arch }}.tar.gz"
153195
sudo tee -a /etc/crictl.yaml > /dev/null <<'EOT'
154196
runtime-endpoint: unix:///run/containerd/containerd.sock
155197
image-endpoint: unix:///run/containerd/containerd.sock
156198
timeout: 20
157199
EOT
158200
159-
160201
- name: Install Firecracker
202+
env:
203+
FC_VERSION: ${{ inputs.firecracker_version }}
161204
run: |
205+
SAFE_FC="${FC_VERSION}"
162206
ARCH="$(uname -m)"
163207
release_url="https://github.com/firecracker-microvm/firecracker/releases"
164-
curl -L ${release_url}/download/${{ inputs.firecracker_version }}/firecracker-${{ inputs.firecracker_version }}-${ARCH}.tgz | tar -xz
165-
# Rename the binary to "firecracker"
166-
sudo mv release-${{ inputs.firecracker_version }}-${ARCH}/firecracker-${{ inputs.firecracker_version }}-${ARCH} /usr/local/bin/firecracker
167-
rm -fr release-${{ inputs.firecracker_version }}-${ARCH}
208+
curl -L "${release_url}/download/${SAFE_FC}/firecracker-${SAFE_FC}-${ARCH}.tgz" | tar -xz
209+
sudo mv "release-${SAFE_FC}-${ARCH}/firecracker-${SAFE_FC}-${ARCH}" /usr/local/bin/firecracker
210+
rm -fr "release-${SAFE_FC}-${ARCH}"
168211
169212
- name: Install solo5
213+
env:
214+
SOLO5_VERSION: ${{ inputs.solo5_version }}
170215
run: |
171-
git clone -b ${{ inputs.solo5_version }} https://github.com/Solo5/solo5.git
216+
SAFE_SOLO5="${SOLO5_VERSION}"
217+
git clone -b "${SAFE_SOLO5}" https://github.com/Solo5/solo5.git
172218
cd solo5
173219
./configure.sh && make -j$(nproc)
174220
sudo cp tenders/hvt/solo5-hvt /usr/local/bin

0 commit comments

Comments
 (0)