banger/internal/kernelcat
Thales Maciel 4004ce2e7e
imagecat,kernelcat: bound staged download, hash before extract
Both Fetch flows previously streamed resp.Body straight into
zstd → tar → on-disk extractor with the SHA256 check tacked on at
the END. A bad mirror or an attacker that's compromised the catalog
host could ship a multi-gigabyte tarball, watch banger expand it to
disk, and only THEN see the helpful "sha256 mismatch" message —
having already filled the host filesystem.

Reorder the operations: stage the compressed tarball to a temp file
under the destination directory through an io.LimitReader (cap +1
bytes), hash on the way in, refuse to decompress if either the cap
trips or the SHA mismatches. Worst-case disk use is bounded by the
cap, not by the source.

Cap is exposed as a package var (MaxFetchedBundleBytes,
MaxFetchedKernelBytes) so callers can tune per-deployment and tests
can squeeze it down to provoke the rejection. Default 8 GiB —
generous enough for a 4 GiB rootfs (which compresses to ~1-2 GiB),
tight enough to make a "fill the host disk" attack expensive.

The temp file lives in the destination dir so extraction stays on
the same filesystem and we don't pay for cross-FS rename. defer
os.Remove cleans up; the existing per-package cleanup() handler
still removes any partial extraction on hash mismatch / extraction
failure.

Tests: each package gets a TestFetchRejectsOversizedTarballBefore
Extraction that sets the cap to 64 bytes, points Fetch at a multi-KB
tarball, and asserts (a) error mentions "cap", (b) destination dir
is left clean (no leaked rootfs / manifest / kernel tree). All
existing tests still pass — happy path, hash mismatch, missing
files, path traversal, HTTP error, etc.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 16:09:55 -03:00
..
catalog.go Phase 4: remote catalog + banger kernel pull 2026-04-16 15:05:42 -03:00
catalog.json Prune legacy void/alpine + customize.sh flows 2026-04-18 15:39:53 -03:00
catalog_test.go Phase 4: remote catalog + banger kernel pull 2026-04-16 15:05:42 -03:00
fetch.go imagecat,kernelcat: bound staged download, hash before extract 2026-04-28 16:09:55 -03:00
fetch_test.go imagecat,kernelcat: bound staged download, hash before extract 2026-04-28 16:09:55 -03:00
import.go Prune legacy void/alpine + customize.sh flows 2026-04-18 15:39:53 -03:00
import_test.go Phase 3: banger kernel import bridges make-*-kernel.sh output 2026-04-16 14:53:49 -03:00
kernelcat.go Phase 1: local kernel catalog scaffolding 2026-04-16 14:21:10 -03:00
kernelcat_test.go Phase 1: local kernel catalog scaffolding 2026-04-16 14:21:10 -03:00