Skip to content

fix: clear remaining scanner findings (stacked on #535) - #536

Open
coder[bot] wants to merge 9 commits into
stirby/kaniko-mobyfrom
stirby/envbuilder-zero-vulns
Open

coder[bot] wants to merge 9 commits into
stirby/kaniko-mobyfrom
stirby/envbuilder-zero-vulns

Conversation

@coder

@coder coder Bot commented Oct 11, 2026

Copy link
Copy Markdown

Stacked on #535 (stirby/kaniko-moby). Goal: get every package/container scanner to report zero findings by upgrading or removing flagged dependencies instead of leaving them as "not affected".

Generated by Coder Agents on behalf of @stirby.

Depends on coder/kaniko#40 (stirby/kaniko-containerd-platforms, 76b64cc0), which is stacked on coder/kaniko#38. The kaniko replace points at that unmerged commit. Re-pin it once the kaniko change lands.

Summary

This drops the scanner findings from 116 to 5. grype on the image now reports 0. Every remaining finding is the same advisory, GO-2026-5932 (golang.org/x/crypto/openpgp). It lists every x/crypto version as affected and has no fixed version. envbuilder doesn't import openpgp. See Unresolved.

Before / after

Tools: trivy 0.75.0, grype 0.120.1, govulncheck v1.8.0 (vuln.go.dev DB 2026-10-08). The image is built with scripts/build.sh --arch=amd64. It is FROM scratch with no OS packages, so the only scanned target is the Go binary.

Scanner Before After Remaining
govulncheck -show verbose ./... 16 (12 symbol, 2 package, 2 module) 1 (module only, not called) GO-2026-5932
govulncheck -mode=binary 15 1 (module only, not called) GO-2026-5932
trivy fs --scanners vuln . 17 1 GO-2026-5932
grype dir:. 31 1 GO-2026-5932
trivy image 20 1 GO-2026-5932
grype image 17 0
Baseline findings by advisory
ID(s) Module Installed Fixed Scanners Resolution
GO-2026-6599/6600/6603/6604/6605/6607/6608/6609/6610/6611/6612/6613/6617 (+CVE aliases) stdlib go1.26.6 1.26.9 all except trivy fs Go 1.26.9
GO-2026-6603/6610/6611/6612/6617 (CVE-2026-78659/78660/78663/78669/97032) golang.org/x/net v0.58.0 v0.60.0 all bumped
GO-2026-6443 / GHSA-2v4p-qf9q-27wj / CVE-2026-84445 google.golang.org/grpc v1.83.1 v1.83.2 all bumped
GO-2026-6237 github.com/insomniacslk/dhcp 2023-12-06 pseudo 2026-07-19 pseudo govulncheck, grype dir bumped to 2026-09-01 pseudo
GHSA-xhgw-qwwf-pg32 / CVE-2026-10722 github.com/cilium/ebpf v0.16.0 v0.22.0 trivy fs, grype dir bumped
CVE-2026-33997/41567/41568/42306, GO-2026-4887, GHSA-pxq6/rg2x/vp62/x86f github.com/docker/docker v28.5.2+incompatible none / 29.3.1 trivy fs, grype dir removed from module graph
CVE-2026-34040/33997/41567/41568/42306, GHSA-x744/pxq6/rg2x/vp62/x86f github.com/moby/moby v28.3.0+incompatible none / 29.3.1 trivy fs, grype dir removed from module graph
GHSA-q3fv-x8vg-qqm4, GHSA-mcj4-mphf-j9ff, GHSA-8rc5-4fr6-64pw github.com/aquasecurity/trivy v0.61.1 pseudo 0.72.0 grype dir required v0.72.0
GHSA-xjvp-4fhw-gc47 github.com/opencontainers/runc v1.2.8 1.3.6 grype dir required v1.3.6
GO-2026-5064/5338/5622, GHSA-fqw6/jpcc/xhf5/7jxh/pg57 github.com/containerd/containerd v1.7.29 none for v1 (GO), 1.7.32 to 1.7.36 (GHSA) grype dir removed from module graph (kaniko change)
GO-2026-5932 golang.org/x/crypto v0.56.0 none all except grype image bumped to v0.58.0; unresolved

Changes

  • fix: build with Go 1.26.9: the stdlib fixes. The last commit turns this into go 1.26.9, because the kaniko fork now declares it.
  • fix: bump golang.org/x/net to v0.60.0 and google.golang.org/grpc to v1.83.2: golang.org/x/crypto also moves to v0.58.0, and the other x/ modules move with them.
  • fix: bump tailscale transitive deps: insomniacslk/dhcp and cilium/ebpf. Both come in through coder/tailscale, which coder/coder pulls in.
  • test(integration): migrate Docker client to moby/moby/client and moby/moby/api: this removes docker/docker and the moby/moby monolith from go.mod and go.sum. The monolith was only being selected because docker/cli (+incompatible, no go.mod) imports moby/moby/api/types/network. Requiring the split moby/moby/api module resolves that import instead.
  • fix: require opencontainers/runc v1.3.6, aquasecurity/trivy v0.72.0: neither module ends up in the binary. They're only reached through coder/coder test packages (dbtestutil/dockertest, coderdtest/preview). But go mod tidy records their checksums in go.sum, and grype dir:. reports them from there.
  • fix: require containerd/containerd v1.7.36 was an intermediate step. fix: pin kaniko without containerd v1 and drop containerd/containerd replaces it: it re-pins kaniko to coder/kaniko@76b64cc0, which imports github.com/containerd/platforms instead. containerd v1 is no longer in the module graph.

Behavior changes

  • Runtime code is unchanged. The binary's module set changes only through version bumps: the x/ modules, grpc, and dhcp. Requiring trivy v0.72.0 also makes MVS raise aws-sdk-go-v2/service/ecr (v1.27.4 to v1.57.2, used by the ECR credential helper), go-redis/v9 (v9.7.3 to v9.20.0), zap (v1.27.1 to v1.28.0) and gopsutil/v4 (v4.26.2 to v4.26.3).
  • The kaniko re-pin also brings in the fix: drop docker/docker and the chrismellard ACR helper, bump buildkit to v0.31.2 kaniko#38 commits that landed after 61a5b7da: ACR token handling updates, Go 1.26.9, and test/CI fixes.
  • go.mod now declares go 1.26.9 (previously go 1.26.5 + toolchain go1.26.9).
  • Integration tests use the moby client v0.6 API (options and result structs). Test coverage is unchanged.

Validation

  • make lint, make fmt, make gen (including scripts/docsgen): clean, no diff.
  • make test (unit and integration, local registry via make test-registry): 348 passed, 3 skipped, 0 failed in two consecutive full runs at the final commit.
    • Skipped tests (existing t.Skips): git TestShallowCloneRepo/OK, TestCloneRepo/invalid_auth/AlreadyCloned, TestCloneRepo/auth_but_no_creds/AlreadyCloned.
    • An earlier run on this branch had one flake: TestCloneFailsFallback/BadRepo, where OpenFile(/.envbuilder/Dockerfile) returned ENOENT. It hasn't reproduced since, in 3 isolated and 4 full runs, and it passes on the fix: drop docker/docker and bump buildkit to v0.31.2 via the kaniko fork #535 base.
  • Rebuilt the image and reran all six scans (table above).
  • Smoke test: ran the built image against a workspace with .devcontainer/Dockerfile and devcontainer.json. It built the image, ran postCreateCommand, and reached the init script (SMOKE_INIT_OK).

Decision log

  • Bump in envbuilder, don't drop coder/coder. coder/coder brings in tailscale, trivy, dockertest and runc only for log streaming (agentsdk and agent/proto dRPC). Replacing it would mean a protocol reimplementation, which is out of scope.
  • Did not replace trivy with github.com/coder/trivy, which is what coder/coder does. That fork is based on v0.69.3 and doesn't include the fixes, so it would only hide the findings by changing the module path. I required upstream v0.72.0 (the lowest fixed version) instead. v0.75.0 needs Go 1.27 and pulls in buildkit and go-containerregistry upgrades.
  • Fixed containerd in kaniko, not here. Every v1 release is affected by the CRI advisories. kaniko only used v1 for platforms, which already lives in the github.com/containerd/platforms module.
  • Did not pin x/crypto to an untagged master pseudo-version. The vuln DB still lists all versions as affected, so scanners would keep flagging it. It would also put unreleased x/crypto into a release.
  • Kept Go on 1.26.x (1.26.9) instead of moving to 1.27.2: it's the smallest change that fixes the stdlib findings.

Unresolved

  • GO-2026-5932 (golang.org/x/crypto/openpgp). envbuilder never imports openpgp; govulncheck reports it at module level only. Upstream x/crypto split openpgp out and deleted it on master (commits 2f1f834..99e4382, 2026-10-09). Once x/crypto v0.59.0 is tagged and vuln.go.dev marks it fixed, bumping x/crypto will clear this from every scanner.
  • Before merge: re-pin the kaniko replace once stirby/kaniko-containerd-platforms lands.

default added 8 commits October 11, 2026 00:50
…/moby/api

Drops github.com/docker/docker and the github.com/moby/moby monolith from
the module graph. The monolith was only selected because docker/cli
(+incompatible, no go.mod) imports moby/moby/api/types/network; requiring
the split moby/moby/api module resolves that import instead.
runc is only reached through a coder/coder test dependency (ory/dockertest),
but its checksum is recorded in go.sum, which module scanners report.
trivy is only reached through coder/coder test packages (coderdtest via
coder/preview), but its checksum is recorded in go.sum, which module
scanners report. v0.72.0 is the lowest release that fixes the reported
advisories; MVS also raises aws-sdk-go-v2/service/ecr, go-redis, zap and
gopsutil in the binary.
containerd v1 is only reached through kaniko's pkg/executor tests, but its
checksum is recorded in go.sum. v1.7.36 clears the advisories that have a
v1.7 fix; the remaining CRI advisories affect every v1 release.
Re-pins the kaniko fork to coder/kaniko@76b64cc0, which imports platforms
from github.com/containerd/platforms instead of containerd v1. containerd
v1 is no longer in the module graph, so the v1.7.36 requirement is
dropped. The fork now declares go 1.26.9, which raises the go directive
here and makes the separate toolchain line redundant.
@coder coder Bot assigned stirby Oct 11, 2026
@coder
coder Bot requested a review from johnstcn October 11, 2026 01:12
@stirby stirby closed this Oct 11, 2026
@stirby stirby reopened this Oct 14, 2026
…envbuilder-zero-vulns

# Conflicts:
#	go.mod
#	go.sum
@BobbyHo

BobbyHo commented Oct 15, 2026

Copy link
Copy Markdown

/coder-agents-review Please limit the review to P0, P1, and P2 issues only.

@coder-agents-review

coder-agents-review Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Chat: Review posted | View chat
Requested: 2026-10-15 01:28 UTC by @BobbyHo

Review history
  • R1 (2026-10-15): 11 reviewers, 3 P2, COMMENT. Review

deep-review v0.13.0 | Round 1 | 77452e6..37667dd

Last posted: Round 1, 3 findings (3 P2), COMMENT. Review

Finding inventory

Findings

# Sev Status Location Summary Round Reviewer Posted
CRF-1 P2 Open go.mod:7 kaniko replace pins unmerged branch commit 76b64cc0, not on coder/kaniko main R1 Netero Yes
CRF-2 Note Dropped by orchestrator (requester limited review to P0-P2) go.mod:98 trivy v0.72.0 and runc v1.3.6 security floors have no explaining comment R1 Netero No
CRF-3 Note Dropped by orchestrator (requester limited review to P0-P2) go.mod:107 trivy floor raises ecr SDK v1.27.4 to v1.57.2 in binary with no ECR test coverage R1 Netero No
CRF-4 P2 Open go.mod:7 kaniko re-pin hard-codes public-cloud ACR audience; Azure China ACR auth likely breaks R1 Kurapika Yes
CRF-5 P2 Open go.mod:7 "removed from module graph" is false: build list still has containerd v1.4.13 and docker/docker v28.5.2 R1 Mafu-san P2, Razor P3/P4, Pariston Note Yes
CRF-6 P3 Dropped by orchestrator (requester limited review to P0-P2) go.mod:98 trivy floor changes four shipped modules for a go.sum-only scanner hit R1 Pariston No
CRF-7 P3 Dropped by orchestrator (requester limited review to P0-P2) docs/development.md:36 Kaniko section says fork pins docker/docker and containerd; it pins neither now R1 Zoro No
CRF-8 P4 Dropped by orchestrator (requester limited review to P0-P2) docs/development.md:89 moby/go-archive section troubleshoots a docker/docker import this PR removes R1 Zoro No
CRF-9 P3 Dropped by orchestrator (requester limited review to P0-P2) PR description Changes list and table credit Go 1.26.9 and x/net fixes that are in base #535 R1 Leorio No
CRF-10 P4 Dropped by orchestrator (requester limited review to P0-P2) PR description "module set changes only through version bumps" omits go-rendezvous and go-jmespath removal R1 Leorio, Mafu-san No
CRF-11 Nit Dropped by orchestrator (requester limited review to P0-P2) PR title Title carries "(stacked on #535)" into squash commit; repo uses chore: for dep bumps R1 Leorio No
CRF-12 P2 Dropped by orchestrator (comment unchanged and accurate for fork main; pin mismatch is CRF-1) go.mod:5 kaniko replace comment link does not show pinned commit R1 Gon No
CRF-13 OOS Out of scope (body) coder/kaniko pkg/creds/acr/token.go:39 Root fix for CRF-4: kaniko must choose ACR audience per cloud R1 Kurapika No
CRF-14 OOS Out of scope (body) coder/kaniko go.mod:3 Fork's go 1.26.9 directive forces importers to Go 1.26.9; replace does not reach library consumers R1 Ryosuke, Pariston No
CRF-15 OOS Out of scope (body) .github/workflows/ci.yaml No CI job runs a vulnerability scanner R1 Bisky, Pariston No
CRF-16 OOS Out of scope (body) .github/workflows/ci.yaml:40 CI installs Go ~1.22 and relies on GOTOOLCHAIN=auto R1 Netero, Pariston No
CRF-17 OOS Out of scope (omitted from body per requester P0-P2 limit) integration/integration_test.go:141 Five pre-existing inline comments restate code (141, 153, 2760, 2767, 2831) R1 Gon No
CRF-18 OOS Out of scope (omitted from body per requester P0-P2 limit) integration/integration_test.go:2896 execID/execConfig/status names predate PR and describe result fields R1 Gon No
CRF-19 OOS Out of scope (omitted from body per requester P0-P2 limit) integration/integration_test.go:2806 runEnvbuilder starts container twice (also in streamContainerLogs) R1 Zoro No
CRF-20 OOS Out of scope (omitted from body per requester P0-P2 limit) integration/integration_test.go:850 client.New + require + Close repeated at 12 sites R1 Zoro No

Contested and acknowledged

Law analysis

Not run. Effective additions 86, below the 1000 threshold.

Round log

Round 1

Full panel (round 1). Netero first pass: 1 P2, 2 Notes; panel proceeded. Panel: ging-go, ryosuke, pariston, mafuuu, bisky, zoro, gon, leorio, mafu-san, kurapika, wildcard razor (11; multi-domain because the change is a supply-chain security fix). Requester comment IC_kwDOJPSNMM8AAAABcH4Vzw asked to limit the review to P0-P2, so P3 and below were not posted. Orchestrator verified CRF-1 (git ls-remote), CRF-4 (kaniko diff 61a5b7da..76b64cc0 pkg/creds/acr/token.go and docs.azure.cn ACR scope), CRF-5 (go list -m all at head). Gon comment findings moved out of scope: comment lines unchanged by the diff. 3 P2 posted. Reviewed against 77452e6..37667dd.

About deep-review

CRF = Coder Review Finding (P0-P4, Nit, Note)

Reviewer Focus
Bisky tests
Chopper ops/errors
Churn-guard change verification
Ging language modernization
Gon naming
Hisoka edge cases
Killua perf
Kite change integrity
Knov contracts
Knuckle SQL
Komugi flake/determinism
Kurapika security
Law decomposition
Leorio docs
Luffy product
Mafu-san process
Mafuuu contracts
Melody dispatch/pairing
Meruem structural
Nami frontend
Netero mechanical checks
Pariston premise testing
Pen-botter product gaps
Razor verification
Robin duplication
Ryosuke Go arch
Takumi concurrency
Zoro shape

🤖 Managed by Coder Agents.

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR re-pins the kaniko fork, migrates the integration tests to moby/moby/client, and raises dependency floors to clear scanner findings. 3 P2 findings. As requested on this PR, findings below P2 are not posted.

Out of scope (needs a ticket or explicit acceptance by a human):

  • coder/kaniko pkg/creds/acr/token.go:39: the hard-coded https://containerregistry.azure.net audience is the root cause of the Azure China finding below; sovereign-cloud ACR authentication fails until kaniko picks the audience per cloud.
  • coder/kaniko go.mod:3: the fork's go 1.26.9 directive forces every module that imports envbuilder to require Go 1.26.9, and the replace does not apply to importers, so a library consumer keeps its own kaniko pin and containerd v1 until it re-pins.
  • .github/workflows/ci.yaml: no job runs govulncheck, trivy, or grype, so a later dependency bump can bring scanner findings back without any check failing.
  • .github/workflows/ci.yaml:40: CI installs Go ~1.22 and relies on GOTOOLCHAIN=auto to download 1.26.9; a runner with GOTOOLCHAIN=local fails the build.

🤖 This review was automatically generated with Coder Agents.

Comment thread go.mod
// There are a few options we need added to Kaniko!
// See: https://github.com/GoogleContainerTools/kaniko/compare/main...coder:kaniko:main
replace github.com/GoogleContainerTools/kaniko => github.com/coder/kaniko v0.0.0-20261008191411-61a5b7da7ea3
replace github.com/GoogleContainerTools/kaniko => github.com/coder/kaniko v0.0.0-20261011010809-76b64cc01bec

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 [CRF-1] The kaniko replace pins coder/kaniko@76b64cc01bec, which exists only on the unmerged branch stirby/kaniko-containerd-platforms (refs/pull/40/head), not on kaniko main (a51d65b5). (Netero)

If coder/kaniko#40 is squash-merged or rebased and the branch is deleted, the commit stays fetchable only from proxy.golang.org's cache, so GOPROXY=direct builds fail and envbuilder releases ship kaniko code that is not on the fork's main. Keep this PR unmerged until the replace points at a commit on kaniko main.

🤖

Comment thread go.mod
// There are a few options we need added to Kaniko!
// See: https://github.com/GoogleContainerTools/kaniko/compare/main...coder:kaniko:main
replace github.com/GoogleContainerTools/kaniko => github.com/coder/kaniko v0.0.0-20261008191411-61a5b7da7ea3
replace github.com/GoogleContainerTools/kaniko => github.com/coder/kaniko v0.0.0-20261011010809-76b64cc01bec

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 [CRF-4] The kaniko re-pin brings in a change that hard-codes the ACR token audience to https://containerregistry.azure.net, so ACR authentication in Azure China likely stops working. (Kurapika)

Between 61a5b7da and 76b64cc0, pkg/creds/acr/token.go:39 changed from settings.Environment.ResourceManagerEndpoint to that constant for the client secret, federated token, and managed identity paths, with a comment saying it is "One value for every Azure cloud." Azure China documents the ACR scope as https://containerregistry.chinacloudapi.cn/.default (docs.azure.cn, "Configure Registry Acceptance of Microsoft Entra Authentication Scopes"), while the token is still requested from that cloud's ActiveDirectoryEndpoint, so private base images, features, and cache repos on *.azurecr.cn that creds.GetKeychain() authenticates (envbuilder.go:500, devcontainer/devcontainer.go:487, devcontainer/features/features.go:29) would fail where the ARM audience worked. This is inferred from the docs and was not run against a China tenant. Fix in kaniko by choosing the audience from settings.Environment and keeping ResourceManagerEndpoint for clouds with no known ACR audience, then re-pin.

🤖

Comment thread go.mod
// There are a few options we need added to Kaniko!
// See: https://github.com/GoogleContainerTools/kaniko/compare/main...coder:kaniko:main
replace github.com/GoogleContainerTools/kaniko => github.com/coder/kaniko v0.0.0-20261008191411-61a5b7da7ea3
replace github.com/GoogleContainerTools/kaniko => github.com/coder/kaniko v0.0.0-20261011010809-76b64cc01bec

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 [CRF-5] The description and commit f403dc1 say containerd v1, docker/docker, and the moby/moby monolith were removed from the module graph, but go list -m all at head still lists github.com/containerd/containerd v1.4.13 and github.com/docker/docker v28.5.2+incompatible. (Mafu-san, Razor, Pariston)

go mod graph shows gvisor requiring containerd v1.4.13, older than the v1.7.29 this PR started from, and trivy@v0.72.0 requiring docker/docker v28.5.2. Neither is in go.sum or the binary, so the six scanners in the table are unaffected, but a scanner or auditor that reads the build list reports both and contradicts the PR's stated result. Change "removed from module graph" to "absent from go.mod, go.sum, and the binary", and state that the build list still names both versions.

🤖

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants