diff --git a/build.sh b/build.sh index c3ea180..b9d49f7 100755 --- a/build.sh +++ b/build.sh @@ -478,18 +478,28 @@ APPRUN done [[ -f "$bd/_deps/sdl3-build/libSDL3.so" ]] && cp "$bd/_deps/sdl3-build/libSDL3.so"* "$APPDIR/usr/lib/" 2>/dev/null || true - # appimagetool + # appimagetool — pinned to a tagged release and SHA-256 verified before we exec it. + # The old "continuous" tag is a MOVING build fetched over the network and run on the release + # builder; a compromised/MITM'd artifact would execute here. Verify, or refuse to package. + local APPIMAGETOOL_URL="https://github.com/AppImage/appimagetool/releases/download/1.9.0/appimagetool-x86_64.AppImage" + local APPIMAGETOOL_SHA256="46fdd785094c7f6e545b61afcfb0f3d98d8eab243f644b4b17698c01d06083d1" local APPIMAGETOOL="" if command -v appimagetool &>/dev/null; then - APPIMAGETOOL="appimagetool" - elif [[ -f "$bd/appimagetool-x86_64.AppImage" ]]; then - APPIMAGETOOL="$bd/appimagetool-x86_64.AppImage" + APPIMAGETOOL="appimagetool" # maintainer's own trusted system install else - info "Downloading appimagetool ..." - wget -q -O "$bd/appimagetool-x86_64.AppImage" \ - "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" - chmod +x "$bd/appimagetool-x86_64.AppImage" - APPIMAGETOOL="$bd/appimagetool-x86_64.AppImage" + local at="$bd/appimagetool-x86_64.AppImage" + # Re-verify any cached copy too; a stale unverified download must not be trusted. + if [[ ! -f "$at" ]] || ! echo "${APPIMAGETOOL_SHA256} ${at}" | sha256sum -c --status; then + info "Downloading appimagetool 1.9.0 (pinned) ..." + wget -q -O "$at" "$APPIMAGETOOL_URL" + if ! echo "${APPIMAGETOOL_SHA256} ${at}" | sha256sum -c --status; then + err "appimagetool SHA-256 verification failed — refusing to use it" + rm -f "$at" + return 1 + fi + chmod +x "$at" + fi + APPIMAGETOOL="$at" fi local ARCH diff --git a/scripts/create-appimage.sh b/scripts/create-appimage.sh index 794a482..5e28faf 100755 --- a/scripts/create-appimage.sh +++ b/scripts/create-appimage.sh @@ -24,18 +24,27 @@ if [ ! -f "${BUILD_DIR}/bin/ObsidianDragon" ]; then exit 1 fi -# Check for appimagetool +# Check for appimagetool — pinned to a tagged release and SHA-256 verified before we exec it. +# The old "continuous" tag is a moving, unverified network download that runs on the release +# builder; verify it or refuse to package. +APPIMAGETOOL_URL="https://github.com/AppImage/appimagetool/releases/download/1.9.0/appimagetool-x86_64.AppImage" +APPIMAGETOOL_SHA256="46fdd785094c7f6e545b61afcfb0f3d98d8eab243f644b4b17698c01d06083d1" APPIMAGETOOL="" if command -v appimagetool &> /dev/null; then - APPIMAGETOOL="appimagetool" -elif [ -f "${BUILD_DIR}/appimagetool-x86_64.AppImage" ]; then - APPIMAGETOOL="${BUILD_DIR}/appimagetool-x86_64.AppImage" + APPIMAGETOOL="appimagetool" # maintainer's own trusted system install else - print_status "Downloading appimagetool..." - wget -q -O "${BUILD_DIR}/appimagetool-x86_64.AppImage" \ - "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" - chmod +x "${BUILD_DIR}/appimagetool-x86_64.AppImage" - APPIMAGETOOL="${BUILD_DIR}/appimagetool-x86_64.AppImage" + AT="${BUILD_DIR}/appimagetool-x86_64.AppImage" + if [ ! -f "$AT" ] || ! echo "${APPIMAGETOOL_SHA256} ${AT}" | sha256sum -c --status; then + print_status "Downloading appimagetool 1.9.0 (pinned)..." + wget -q -O "$AT" "$APPIMAGETOOL_URL" + if ! echo "${APPIMAGETOOL_SHA256} ${AT}" | sha256sum -c --status; then + print_error "appimagetool SHA-256 verification failed — refusing to use it" + rm -f "$AT" + exit 1 + fi + chmod +x "$AT" + fi + APPIMAGETOOL="$AT" fi print_status "Creating AppDir structure..." diff --git a/setup.sh b/setup.sh index 2340bee..dd20983 100755 --- a/setup.sh +++ b/setup.sh @@ -391,11 +391,26 @@ elif $SETUP_SAPLING; then SPEND_URL="https://z.cash/downloads/sapling-spend.params" OUTPUT_URL="https://z.cash/downloads/sapling-output.params" + # Consensus-critical MPC parameters with fixed, well-known SHA-256 (identical across every + # Zcash-family node; also pinned in scripts/build-lite-backend-artifact.sh). z.cash is + # plain HTTPS with no signature, so verify the digest and refuse a tampered/corrupt file. + SPEND_SHA256="8e48ffd23abb3a5fd9c5589204f32d9c31285a04b78096ba40a79b75677efc13" + OUTPUT_SHA256="2f0ebbcbb9bb0bcffe95a397e7eba89c29eb4dde6191c339db88570e3f3fb0e4" - curl -fSL -o "$PARAMS_DIR/sapling-spend.params" "$SPEND_URL" && \ - ok "Downloaded sapling-spend.params" - curl -fSL -o "$PARAMS_DIR/sapling-output.params" "$OUTPUT_URL" && \ - ok "Downloaded sapling-output.params" + if curl -fSL -o "$PARAMS_DIR/sapling-spend.params" "$SPEND_URL" \ + && echo "${SPEND_SHA256} $PARAMS_DIR/sapling-spend.params" | sha256sum -c --status; then + ok "Downloaded + verified sapling-spend.params" + else + rm -f "$PARAMS_DIR/sapling-spend.params" + err "sapling-spend.params download or SHA-256 verification failed — not installed" + fi + if curl -fSL -o "$PARAMS_DIR/sapling-output.params" "$OUTPUT_URL" \ + && echo "${OUTPUT_SHA256} $PARAMS_DIR/sapling-output.params" | sha256sum -c --status; then + ok "Downloaded + verified sapling-output.params" + else + rm -f "$PARAMS_DIR/sapling-output.params" + err "sapling-output.params download or SHA-256 verification failed — not installed" + fi fi else skip "Sapling params not found (use --sapling to download, or they'll be extracted at runtime from embedded builds)"