This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch install-rustup-cargo-in-images
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 7ae0bf9321ee13e670f6b2880f3e26a32801bcf3
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sat Apr 4 13:46:50 2026 +0200

    Pin rustup version with SHA256 verification like cosign
    
    Pin rustup-init to version 1.29.0 with hardcoded SHA256 checksums for
    amd64 and arm64, matching the existing cosign verification pattern.
    This prevents a compromised server from serving a tampered binary with
    a matching checksum.
---
 Dockerfile                                | 17 ++++++++++++-----
 Dockerfile.ci                             | 17 ++++++++++++-----
 scripts/docker/install_os_dependencies.sh | 17 ++++++++++++-----
 3 files changed, 36 insertions(+), 15 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 67cb0585a69..c7177a1d8ab 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -123,6 +123,7 @@ AIRFLOW_PYTHON_VERSION=${AIRFLOW_PYTHON_VERSION:-3.10.18}
 PYTHON_LTO=${PYTHON_LTO:-true}
 GOLANG_MAJOR_MINOR_VERSION=${GOLANG_MAJOR_MINOR_VERSION:-1.24.4}
 RUSTUP_DEFAULT_TOOLCHAIN=${RUSTUP_DEFAULT_TOOLCHAIN:-stable}
+RUSTUP_VERSION=${RUSTUP_VERSION:-1.29.0}
 COSIGN_VERSION=${COSIGN_VERSION:-3.0.5}
 
 if [[ "${1}" == "runtime" ]]; then
@@ -501,18 +502,24 @@ function install_rustup() {
         [amd64]="x86_64-unknown-linux-gnu"
         [arm64]="aarch64-unknown-linux-gnu"
     )
+    declare -A rustup_sha256s=(
+        # 
https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/{target}/rustup-init.sha256
+        
[amd64]="4acc9acc76d5079515b46346a485974457b5a79893cfb01112423c89aeb5aa10"
+        
[arm64]="9732d6c5e2a098d3521fca8145d826ae0aaa067ef2385ead08e6feac88fa5792"
+    )
     local target="${rustup_targets[${arch}]}"
+    local rustup_sha256="${rustup_sha256s[${arch}]}"
     if [[ -z "${target}" ]]; then
         echo "Unsupported architecture for rustup: ${arch}"
         exit 1
     fi
-    local base_url="https://static.rust-lang.org/rustup/dist/${target}";
-    curl --proto '=https' --tlsv1.2 -sSf "${base_url}/rustup-init" -o 
/tmp/rustup-init
-    curl --proto '=https' --tlsv1.2 -sSf "${base_url}/rustup-init.sha256" -o 
/tmp/rustup-init.sha256
-    cd /tmp && sha256sum --check rustup-init.sha256
+    curl --proto '=https' --tlsv1.2 -sSf \
+        
"https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/${target}/rustup-init";
 \
+        -o /tmp/rustup-init
+    echo "${rustup_sha256}  /tmp/rustup-init" | sha256sum --check
     chmod +x /tmp/rustup-init
     /tmp/rustup-init -y --default-toolchain "${RUSTUP_DEFAULT_TOOLCHAIN}"
-    rm -f /tmp/rustup-init /tmp/rustup-init.sha256
+    rm -f /tmp/rustup-init
 }
 
 function apt_clean() {
diff --git a/Dockerfile.ci b/Dockerfile.ci
index e330d88d9b7..298323d223f 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -63,6 +63,7 @@ AIRFLOW_PYTHON_VERSION=${AIRFLOW_PYTHON_VERSION:-3.10.18}
 PYTHON_LTO=${PYTHON_LTO:-true}
 GOLANG_MAJOR_MINOR_VERSION=${GOLANG_MAJOR_MINOR_VERSION:-1.24.4}
 RUSTUP_DEFAULT_TOOLCHAIN=${RUSTUP_DEFAULT_TOOLCHAIN:-stable}
+RUSTUP_VERSION=${RUSTUP_VERSION:-1.29.0}
 COSIGN_VERSION=${COSIGN_VERSION:-3.0.5}
 
 if [[ "${1}" == "runtime" ]]; then
@@ -441,18 +442,24 @@ function install_rustup() {
         [amd64]="x86_64-unknown-linux-gnu"
         [arm64]="aarch64-unknown-linux-gnu"
     )
+    declare -A rustup_sha256s=(
+        # 
https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/{target}/rustup-init.sha256
+        
[amd64]="4acc9acc76d5079515b46346a485974457b5a79893cfb01112423c89aeb5aa10"
+        
[arm64]="9732d6c5e2a098d3521fca8145d826ae0aaa067ef2385ead08e6feac88fa5792"
+    )
     local target="${rustup_targets[${arch}]}"
+    local rustup_sha256="${rustup_sha256s[${arch}]}"
     if [[ -z "${target}" ]]; then
         echo "Unsupported architecture for rustup: ${arch}"
         exit 1
     fi
-    local base_url="https://static.rust-lang.org/rustup/dist/${target}";
-    curl --proto '=https' --tlsv1.2 -sSf "${base_url}/rustup-init" -o 
/tmp/rustup-init
-    curl --proto '=https' --tlsv1.2 -sSf "${base_url}/rustup-init.sha256" -o 
/tmp/rustup-init.sha256
-    cd /tmp && sha256sum --check rustup-init.sha256
+    curl --proto '=https' --tlsv1.2 -sSf \
+        
"https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/${target}/rustup-init";
 \
+        -o /tmp/rustup-init
+    echo "${rustup_sha256}  /tmp/rustup-init" | sha256sum --check
     chmod +x /tmp/rustup-init
     /tmp/rustup-init -y --default-toolchain "${RUSTUP_DEFAULT_TOOLCHAIN}"
-    rm -f /tmp/rustup-init /tmp/rustup-init.sha256
+    rm -f /tmp/rustup-init
 }
 
 function apt_clean() {
diff --git a/scripts/docker/install_os_dependencies.sh 
b/scripts/docker/install_os_dependencies.sh
index f5c049144a9..f351d4fbe0c 100644
--- a/scripts/docker/install_os_dependencies.sh
+++ b/scripts/docker/install_os_dependencies.sh
@@ -29,6 +29,7 @@ AIRFLOW_PYTHON_VERSION=${AIRFLOW_PYTHON_VERSION:-3.10.18}
 PYTHON_LTO=${PYTHON_LTO:-true}
 GOLANG_MAJOR_MINOR_VERSION=${GOLANG_MAJOR_MINOR_VERSION:-1.24.4}
 RUSTUP_DEFAULT_TOOLCHAIN=${RUSTUP_DEFAULT_TOOLCHAIN:-stable}
+RUSTUP_VERSION=${RUSTUP_VERSION:-1.29.0}
 COSIGN_VERSION=${COSIGN_VERSION:-3.0.5}
 
 if [[ "${1}" == "runtime" ]]; then
@@ -407,18 +408,24 @@ function install_rustup() {
         [amd64]="x86_64-unknown-linux-gnu"
         [arm64]="aarch64-unknown-linux-gnu"
     )
+    declare -A rustup_sha256s=(
+        # 
https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/{target}/rustup-init.sha256
+        
[amd64]="4acc9acc76d5079515b46346a485974457b5a79893cfb01112423c89aeb5aa10"
+        
[arm64]="9732d6c5e2a098d3521fca8145d826ae0aaa067ef2385ead08e6feac88fa5792"
+    )
     local target="${rustup_targets[${arch}]}"
+    local rustup_sha256="${rustup_sha256s[${arch}]}"
     if [[ -z "${target}" ]]; then
         echo "Unsupported architecture for rustup: ${arch}"
         exit 1
     fi
-    local base_url="https://static.rust-lang.org/rustup/dist/${target}";
-    curl --proto '=https' --tlsv1.2 -sSf "${base_url}/rustup-init" -o 
/tmp/rustup-init
-    curl --proto '=https' --tlsv1.2 -sSf "${base_url}/rustup-init.sha256" -o 
/tmp/rustup-init.sha256
-    cd /tmp && sha256sum --check rustup-init.sha256
+    curl --proto '=https' --tlsv1.2 -sSf \
+        
"https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/${target}/rustup-init";
 \
+        -o /tmp/rustup-init
+    echo "${rustup_sha256}  /tmp/rustup-init" | sha256sum --check
     chmod +x /tmp/rustup-init
     /tmp/rustup-init -y --default-toolchain "${RUSTUP_DEFAULT_TOOLCHAIN}"
-    rm -f /tmp/rustup-init /tmp/rustup-init.sha256
+    rm -f /tmp/rustup-init
 }
 
 function apt_clean() {

Reply via email to