build: сверка артефакта Hysteria с upstream hashes.txt

SHA-256 считался локально от уже скачанного файла. Это защищает target
от последующей подмены, но не доказывает, что builder скачал именно
ожидаемый upstream artifact: сумма фиксирует то, что пришло, каким бы
оно ни было. То есть trust-on-first-use, а не проверка происхождения.

Upstream публикует контрольные суммы релиза ассетом hashes.txt:

  6493dfff...f94  build/hysteria-linux-amd64
  f24f63be...189  build/hysteria-linux-amd64-avx

Теперь резолвер отдаёт и URL этого ассета, сборка скачивает его,
берёт оттуда ожидаемую сумму и сверяет с ней бинарник - и только после
этого записывает SHA-256 в HY2XS lock и metadata.

Сопоставление идёт по базовому имени и строго на равенство: build/ -
часть пути, а hysteria-linux-amd64-avx - другой артефакт, который не
должен совпасть по префиксу. Разбор вынесен в parseUpstreamHashes и
покрыт тестами, включая форму sha256:<hex>, верхний регистр,
противоречивые и отсутствующие записи.

Релиз без hashes.txt для production-сборки непригоден и отклоняется.
Источник ожидаемой суммы фиксируется в metadata как hysteria_sha_source.
This commit is contained in:
2026-08-27 12:15:38 +05:00
parent 9da61c9482
commit 10d2c48cf0
7 changed files with 350 additions and 18 deletions
+10 -1
View File
@@ -2,11 +2,16 @@ import { describe, expect, test } from "bun:test";
import { readFileSync } from "node:fs";
import { join } from "node:path";
import {
HYSTERIA_HASHES_ASSET,
HYSTERIA_LINUX_AMD64_ASSET,
selectLatestStableRelease,
type GithubRelease
} from "../src/build/hysteriaRelease";
function assetUrl(tag: string, name: string): string {
return `https://github.com/HyNetworks/hysteria/releases/download/${tag}/${name}`;
}
function release(tag: string): GithubRelease {
return {
tag_name: tag,
@@ -16,7 +21,11 @@ function release(tag: string): GithubRelease {
assets: [
{
name: HYSTERIA_LINUX_AMD64_ASSET,
browser_download_url: `https://github.com/HyNetworks/hysteria/releases/download/${tag}/${HYSTERIA_LINUX_AMD64_ASSET}`
browser_download_url: assetUrl(tag, HYSTERIA_LINUX_AMD64_ASSET)
},
{
name: HYSTERIA_HASHES_ASSET,
browser_download_url: assetUrl(tag, HYSTERIA_HASHES_ASSET)
}
]
};