@@ -117,6 +117,13 @@ resolve_version() {
117117 fi
118118
119119 [ -n " ${VERSION} " ] || fatal " Could not determine the latest version. Check your internet connection."
120+
121+ # Validate format to guard against tampered API responses
122+ case " ${VERSION} " in
123+ v[0-9]* .[0-9]* .[0-9]* ) ;;
124+ * ) fatal " Unexpected version format received: '${VERSION} '. Aborting." ;;
125+ esac
126+
120127 info " Latest version: ${VERSION} "
121128}
122129
@@ -183,13 +190,25 @@ verify_checksum() {
183190 BINARY_PATH=" $1 "
184191 EXPECTED=" $2 "
185192
193+ # Validate expected hash is a 64-char hex string before trusting it
194+ case " ${EXPECTED} " in
195+ [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\
196+ [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\
197+ [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\
198+ [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\
199+ [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\
200+ [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\
201+ [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\
202+ [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]) ;;
203+ * ) fatal " Checksum file contains unexpected content — aborting." ;;
204+ esac
205+
186206 if command -v sha256sum > /dev/null 2>&1 ; then
187207 ACTUAL=" $( sha256sum " ${BINARY_PATH} " | awk ' {print $1}' ) "
188208 elif command -v shasum > /dev/null 2>&1 ; then
189209 ACTUAL=" $( shasum -a 256 " ${BINARY_PATH} " | awk ' {print $1}' ) "
190210 else
191- warn " No sha256sum or shasum found — skipping checksum verification."
192- return
211+ fatal " sha256sum or shasum is required to verify the download. Please install one and retry."
193212 fi
194213
195214 if [ " ${ACTUAL} " != " ${EXPECTED} " ]; then
0 commit comments