[ISS-4] Foundation-build omzeilt de ingecheckte vendor/-directory door GOFLAGS=-mod=readonly #162

Open
opened 2026-09-03 12:45:37 +02:00 by janpeter · 0 comments
Owner

Beheerd door Scrum4Me — wijzigingen hier worden overschreven. Bron: https://thuis.jp-visser.nl/issues/cmtle3voa000n7u17l17keouj

Status: new · Severity: s3_major · Gemeld door: claude · Occurrences: 1 (laatst: 2026-09-03T10:36:23.194Z) · Aangemaakt: 2026-09-03T10:36:23.194Z

Registratie

Gevonden als nevenbevinding tijdens de ISS-3-diagnose (2026-09-03).

Waarneming

deploy/mac-production/build-foundation-bundle.sh bouwt elke binary met
GOFLAGS="-mod=readonly" (regels 74 en 202); build-tailscale.sh zet dezelfde
GOFLAGS op regel ~113. De Go-module in deploy/mac-production/go heeft echter
een ingecheckte vendor/-directory met vendor/modules.txt, en go.mod
declareert go 1.26. Vanaf Go 1.14 is -mod=vendor in die situatie de
default. Door -mod=readonly expliciet te zetten wordt die default
overschreven en lost de build op uit de module-cache in plaats van uit
vendor/.

Bewijs (2026-09-03, Go 1.26.6, deploy/mac-production/go)

$ go list -f '{{.Dir}}' golang.org/x/sys/unix
.../deploy/mac-production/go/vendor/golang.org/x/sys/unix

$ GOFLAGS=-mod=readonly go list -f '{{.Dir}}' golang.org/x/sys/unix
.../go-mod-cache/golang.org/x/sys@v0.47.0/unix

Aanvullend: bij het cross-platform-experiment in een schone
golang:1.26.6-container moest de build golang.org/x/sys v0.47.0 alsnog
downloaden, terwijl vendor/ in de checkout aanwezig was. Op een host zonder
gevulde module-cache doet deze build dus een netwerk-fetch.

Waarom dit telt

De foundation-bundle is de trust anchor voor T14. Het punt van een
ingecheckte vendor/ is dat de build hermetisch is en niet afhangt van de
module-cache, GOPROXY of netwerk. Nu is vendor/ dode ballast: hij wordt
meegeleverd en gereviewd maar nooit gebruikt.

Belangrijke waarschuwing bij het oplossen

Dit is géén drive-by-fix. Build-info legt afhankelijkheden anders vast in
vendor-modus dan in module-modus (dep-regels met h1:-hashes), dus het
omzetten naar -mod=vendor verandert de bytes van elke binary. De
gepinde digests in manifests/tailscale-v1.102.3.json en het
foundation-ingest-anker moeten daarna opnieuw worden vastgesteld met
tweemaal-gereproduceerd bewijs. Plan het als eigen taak met die re-pin erin.

Locaties

  • deploy/mac-production/build-foundation-bundle.sh:74, :202
  • deploy/mac-production/build-tailscale.sh (GOFLAGS-export in build_once)
  • deploy/mac-production/go/vendor/ (aanwezig, ongebruikt)

Onderzoek

Nog geen onderzoek.

Oplossing

Nog geen oplossing.

> Beheerd door Scrum4Me — wijzigingen hier worden overschreven. Bron: https://thuis.jp-visser.nl/issues/cmtle3voa000n7u17l17keouj Status: new · Severity: s3_major · Gemeld door: claude · Occurrences: 1 (laatst: 2026-09-03T10:36:23.194Z) · Aangemaakt: 2026-09-03T10:36:23.194Z ## Registratie Gevonden als nevenbevinding tijdens de ISS-3-diagnose (2026-09-03). ## Waarneming `deploy/mac-production/build-foundation-bundle.sh` bouwt elke binary met `GOFLAGS="-mod=readonly"` (regels 74 en 202); `build-tailscale.sh` zet dezelfde GOFLAGS op regel ~113. De Go-module in `deploy/mac-production/go` heeft echter een ingecheckte `vendor/`-directory met `vendor/modules.txt`, en `go.mod` declareert `go 1.26`. Vanaf Go 1.14 is `-mod=vendor` in die situatie de default. Door `-mod=readonly` expliciet te zetten wordt die default overschreven en lost de build op uit de module-cache in plaats van uit `vendor/`. ## Bewijs (2026-09-03, Go 1.26.6, deploy/mac-production/go) $ go list -f '{{.Dir}}' golang.org/x/sys/unix .../deploy/mac-production/go/vendor/golang.org/x/sys/unix $ GOFLAGS=-mod=readonly go list -f '{{.Dir}}' golang.org/x/sys/unix .../go-mod-cache/golang.org/x/sys@v0.47.0/unix Aanvullend: bij het cross-platform-experiment in een schone `golang:1.26.6`-container moest de build `golang.org/x/sys v0.47.0` alsnog downloaden, terwijl `vendor/` in de checkout aanwezig was. Op een host zonder gevulde module-cache doet deze build dus een netwerk-fetch. ## Waarom dit telt De foundation-bundle is de trust anchor voor T14. Het punt van een ingecheckte `vendor/` is dat de build hermetisch is en niet afhangt van de module-cache, GOPROXY of netwerk. Nu is `vendor/` dode ballast: hij wordt meegeleverd en gereviewd maar nooit gebruikt. ## Belangrijke waarschuwing bij het oplossen Dit is géén drive-by-fix. Build-info legt afhankelijkheden anders vast in vendor-modus dan in module-modus (`dep`-regels met `h1:`-hashes), dus het omzetten naar `-mod=vendor` **verandert de bytes van elke binary**. De gepinde digests in `manifests/tailscale-v1.102.3.json` en het foundation-ingest-anker moeten daarna opnieuw worden vastgesteld met tweemaal-gereproduceerd bewijs. Plan het als eigen taak met die re-pin erin. ## Locaties - deploy/mac-production/build-foundation-bundle.sh:74, :202 - deploy/mac-production/build-tailscale.sh (GOFLAGS-export in build_once) - deploy/mac-production/go/vendor/ (aanwezig, ongebruikt) ## Onderzoek _Nog geen onderzoek._ ## Oplossing _Nog geen oplossing._ <!-- s4m:issue:cmtle3voa000n7u17l17keouj -->
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/Ops-dashboard#162
No description provided.