Repository navigation
Conversation
iurii-ssv
added this pull request to stack #3095
October 7, 2026 11:11
iurii-ssv
removed this pull request from stack #3095
October 7, 2026 11:11
iurii-ssv
added this pull request to stack #3096
October 7, 2026 11:12
Contributor
|
Codecov Report✅ All modified and coverable lines are covered by tests. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This was referenced Oct 7, 2026
momosh-ssv
previously approved these changes
Oct 8, 2026
iurii-ssv
dismissed
momosh-ssv’s stale review
October 13, 2026 13:08
The merge-base changed after approval.
momosh-ssv
removed this pull request from stack #3096
October 15, 2026 07:36
otel/sdk moved to v1.45.0 but the exporters stayed on older release sets (otlptrace* v1.41.0, otlpmetric* v1.36.0, otlplog* v0.12.2, autoexport v0.61.0, prometheus exporter v0.58.0, otelhttp v0.63.0). Move all of them to the v1.45.0 / v0.21.0 / v0.67.0 / contrib v0.70.0 release set. Clears GO-2026-6505 (otlptrace*), GO-2026-4985 (otlptracehttp), GO-2026-6508 (otlploggrpc), GO-2026-6615 (sdk/log); the klauspost/compress bump that comes along also clears GO-2026-5841. Visible on /metrics: the prometheus exporter no longer emits the otel_scope_info series and adds an otel_scope_schema_url label to every series. Metric names and their suffixes are unchanged.
v5.2.2 is still affected by GO-2026-5775/GO-2026-5777 and newly by GO-2026-4316 (RedirectSlashes) and GO-2026-5774 (RealIP), all fixed in v5.3.0. None of these middlewares are used (api/server only uses Throttle, Compress and NewWrapResponseWriter), so this is scanner hygiene; behavior changes in the middlewares we do use are limited to a Throttle fast path and a WrapResponseWriter byte-count fix.
ssvsigner builds its own binary from its own go.mod, so the root bumps do not reach it. Move x/crypto v0.52.0 -> v0.55.0, x/net v0.54.0 -> v0.58.0 and x/text v0.37.0 -> v0.41.0 (same versions the root module resolves to). Clears GO-2026-6303, GO-2026-5025..5030, GO-2026-5942 and GO-2026-5970; the latter is on a reachable path (keystore password normalization during decrypt), though the input is operator-supplied.
x/crypto v0.56.0 clears GO-2026-6354/GO-2026-6355 (x/crypto/ssh, not used by the shipped binaries). It requires go >= 1.26.0, so the go directive moves from "go 1.26" to "go 1.26.0" in both modules. On its own that would make actions/setup-go (go-version-file: go.mod) install exactly 1.26.0 instead of resolving "1.26" to the latest 1.26.x (currently 1.26.8). Add "toolchain go1.26.8" so CI keeps building and testing with the patched release; local builds with an older Go switch to it automatically (GOTOOLCHAIN=auto). Docker builds are unaffected: the official golang images set GOTOOLCHAIN=local.
v0.49.0 is the first go-libp2p release on quic-go v0.60.0 and webtransport-go v0.11.1, which clear GO-2025-4233, GO-2026-5676 and GO-2026-4483/4485/4488/6099; pion/dtls/v3 v3.1.4 and pion/stun/v3 v3.1.5 are bumped explicitly for GO-2026-6165 and GO-2026-6163. None of these are reachable: our libp2p host only configures the TCP transport. Upstream behavior changes that touch our code: - Connected/Disconnected notifications moved into the swarm's events emitter; ordering is unchanged (conn removed from the swarm before Disconnected fires asynchronously, never before Connected finished), so conn_handler's Connectedness check in DisconnectedF still holds. - Addrs()/AllAddrs() list all interface addresses when listening on 0.0.0.0; we only use host.Addrs() for the "starting p2p" log line. MVS also moves the gomock runtime to v0.6.0 (mockgen in tool.mod stays at v0.5.2; existing generated mocks compile and pass), zap v1.28.0, yamux v5.1.0, x/exp and multiformats/ipfs utility libs.
Clears GO-2026-6179/GO-2026-6180 (x/mod/sumdb, module-level only: we only use x/mod/modfile and x/mod/module in ibft/storage test utils). Pulls x/tools v0.49.0 and a newer x/telemetry along.
Clears GO-2026-4950 (ServeFile/ServeFS path decoding). Not reachable: ssvsigner only uses fasthttp as its API server and serves no files. Also moves klauspost/compress v1.18.0 -> v1.19.1 to match root, which clears GO-2026-5841 for the ssvsigner build. Header parsing is stricter since v1.65/v1.70 (CRLF-only delimiters, exactly one Host header, URI format validation); the node's net/http-based ssvsigner client round-trips fine against it.
Clears GO-2026-5073 and GO-2026-5684 (DAG-CBOR/DAG-JSON decoder allocation and recursion limits). Indirect via go-libp2p-kad-dht / boxo's IPNS support; the decoders are imported but never called. ipld-prime v0.23.0 requires a newer polydawn/refmt pseudo-version.
Moves ssvsigner's otel, otel/metric and otel/trace from v1.41.0 to v1.45.0 (clears GO-2026-5158, baggage header length cap) and the semconv import to v1.43.0, matching the root module. ssvsigner only uses semconv for HTTP attribute keys (no resource merge), and the keys it uses keep the same names. otelhttp and otel/sdk/metric stay as they are: they only come in via the e2e testcontainers dependency.
The go-libp2p bump moved the go.uber.org/mock runtime to v0.6.0 while mockgen in tool.mod stayed at v0.5.2. Align the generator with the runtime. Regenerating all mockgen go:generate targets with v0.6.0 produces byte-identical mocks, so no generated files change.
The go:generate directive in recipients.go targets mocks/recipients.go, which was never committed and has no users; running go generate only produced an untracked, unused file.
…ve v0.3.0
moby/go-archive v0.3.0 fixes GO-2026-6253 (tar extraction outside the
target directory), but no testcontainers-go release requires it (v0.44.0
still pins v0.2.0), and bumping it on its own breaks
docker/docker v28's pkg/archive. testcontainers-go v0.42+ moved from
github.com/docker/docker to the github.com/moby/moby/{api,client}
modules, so:
- testcontainers-go v0.37.0 -> v0.44.0 and moby/go-archive -> v0.3.0
- e2e/testenv: import container/mount/network types from
github.com/moby/moby/api instead of docker/docker and go-connections
This drops github.com/docker/docker from ssvsigner entirely, which also
removes its no-fix advisories (GO-2026-4883, GO-2026-4887,
GO-2026-5617, GO-2026-5668, GO-2026-5746). All of this is e2e-only.
go.spec.alan.mod was a frozen copy of an old go.mod (go 1.24.6, grpc 1.75, otel 1.38, ...), but nothing is built against it: make spec-test-alan only runs go mod download with it and ibft/storage reads the ssv-spec version from it to locate the Alan vectors. Only the ssv-spec requirement matters. It cannot be refreshed as a copy of the current go.mod: the ./ssvsigner replace requires a newer ssv-spec, so the go command raises the pin to the main-line pseudo-version on the first go mod download and the Alan run silently uses the wrong vectors. Keep only `require github.com/ssvlabs/ssv-spec v1.2.2` (and its two go.sum lines), which also cannot go stale. make spec-test-alan passes and resolves the same v1.2.2 artifacts as before.
momosh-ssv
force-pushed
the
deps/vuln-cleanup
branch
from
October 15, 2026 07:40
d98d805 to
69f1607
Compare
momosh-ssv
added this pull request to stack #3123
October 15, 2026 07:40
Since go-libp2p v0.48 the 0.0.0.0 listen address resolves to every interface address instead of only the default-route one, and identify and the signed peer record advertise what our AddrsFactory returns. The factory only appended the HostAddress/HostDNS address, so peers got our docker bridge, VPN and other private interface addresses too. With an external address configured, peers reach us through it (it's what our ENR carries), so the factory now keeps only the public addresses and appends the external one; a private HostAddress is still announced. The my_address field of the "starting p2p" log line shows the same list. Without HostAddress/HostDNS nothing changes, as local clusters and private networks rely on the private addresses. AutoNAT already filters the factory's output down to public addresses, and mDNS announces the interface listen addresses directly, so neither is affected.
momosh-ssv
approved these changes
Oct 15, 2026
1 task
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #3093 (grpc bump), which is stacked on #3071. Cleans up the remaining
govulncheckfindings that #3071 and #3093 leave open. One commit per dependency so each can be reverted alone, plus onenetwork/p2pcommit so the go-libp2p bump doesn't advertise our private addresses.RealIP/RedirectSlashesaren't usedgo 1.26→go 1.26.0andtoolchain go1.26.8x/crypto/sshisn't usednetwork/p2p/config.go), so QUIC/WebTransport/WebRTC never runmodfile/moduleinibft/storagetest utils)tool.mod)github.com/docker/dockerreplaced bygithub.com/moby/moby/{api,client}Heads-up:
/metricslabels changeThe OTel Prometheus exporter 0.67.0, which autoexport 0.70.0 requires, changes the exposition slightly. I diffed a scrape of representative ssv instruments before and after:
_total,_seconds,_bucket, ...) are unchanged.otel_scope_schema_url=""label. This creates new series identities at upgrade time; name-based queries and dashboards keep working.otel_scope_infoseries is no longer emitted. Nothing in this repo references it.The prometheus
client_golang(1.23.2 → 1.24.1) andprometheus/commonbumps come along with it.Why the
toolchainlinex/crypto 0.56.0 requires go ≥ 1.26.0, so
go mod tidyrewritesgo 1.26togo 1.26.0. CI'sactions/setup-go(go-version-file: go.mod) currently resolves1.26to the latest 1.26.x (1.26.8). With1.26.0it would install exactly 1.26.0.toolchain go1.26.8keeps CI on the patched release; setup-go prefers thetoolchainline when it's present.GOTOOLCHAIN=auto).golangimages setGOTOOLCHAIN=local, andgo 1.26.0is satisfied by every 1.26.x image.go-libp2p 0.45 → 0.49: what I checked
The upstream release notes have no API breaks for the options we use (TCP transport, noise, ping, NAT service, AutoNAT rate limit). Behavior changes that touch our code:
Connectedfires synchronously.Disconnectedis dispatched asynchronously, after the conn has been removed from the swarm, and never beforeConnectedfinished.conn_handler'sConnectedness()check inDisconnectedFbehaves as before.AllAddrs()/Addrs()resolve0.0.0.0to every interface address since v0.48 (basichost: advertise all interface addrs for unspecified listen addrs libp2p/go-libp2p#3468). Before, only the default-route interface address was used.host.Addrs()for themy_addressfield of the "starting p2p" log line.AddrsFactoryonly appended the HostAddress/HostDNS address and didn't filter.loandeth0, so its list doesn't change; it's hosts with several interfaces (e.g. host networking) that advertise more.network/p2pcommit now drops the non-public ones (see below).tool.modfollows in its own commit (see the table), and regenerating the mocks with it leaves them byte-identical.This is the riskiest commit here. Please give it an E2E run and some soak time on stage, watching peer counts, connection churn, and the addresses other nodes record for ours (
/v1/node/peers).Advertised addresses (
network/p2p)With HostAddress/HostDNS set, our
AddrsFactorynow keeps only the public addresses and appends the external one. identify, the signed peer record andmy_addressthen carry just what peers can dial, and a private HostAddress is still announced.libp2p.NonPublicAddrPublishing(false)alone wouldn't do: it only covers the signed peer record, not identify's unsigned list.fasthttp 1.58 → 1.70 (ssvsigner API server)
Header parsing became stricter (1.65: CRLF-only delimiters; 1.70: exactly one
Hostheader, request-URI validation, CRLF sanitization in setters). The ssv node talks to ssvsigner through thenet/http-basedssvsigner.Client, which sends compliant requests. To double-check, I ran a throwaway test that serves the realServer.Handler()over TCP with fasthttp 1.70 and calls it withssvsigner.Client. List, identity, sign and remove all round-trip correctly. The test is not committed; the e2e suite covers this path in CI.testcontainers-go 0.37 → 0.44 (ssvsigner e2e only)
No testcontainers release requires the fixed moby/go-archive (v0.44.0 still pins v0.2.0). Bumping go-archive on its own breaks
docker/dockerv28'spkg/archive, which testcontainers ≤0.41 uses. Since v0.42, testcontainers uses themoby/mobyclient modules, so this commit:e2e/testenv/containers.goto thecontainer/mount/networktypes fromgithub.com/moby/moby/api, replacingdocker/dockerandgo-connections/nat.network.Port.Port()has the same semantics asnat.Port.Port().I ran the ssvsigner e2e suite locally with a freshly built
ssv-signer:latestimage, i.e.make test-e2ewith the image built from the repo root as in CI. All 4 tests (22 including subtests) pass:TestAttestationSlashing,TestBlockSlashing,TestValidatorRegistrationSigning,TestVoluntaryExitSigning.Housekeeping
registry/storage/recipients.go: dropped thego:generatedirective formocks/recipients.go. That mock was never committed and has no users.go.spec.alan.mod/.sumare reduced to the singlerequire github.com/ssvlabs/ssv-spec v1.2.2pin and its twogo.sumlines.make spec-test-alanonly runsgo mod downloadwith it, andibft/storagereads the ssv-spec version from it to locate the Alan vectors.go.mod. The./ssvsignerreplace requires the newer ssv-spec, so the firstgo mod downloadraises the pin to the main-line pseudo-version, and the Alan run then silently uses the wrong vectors. I hit exactly this, andTestQBFTMappingAlanfailed with error-code and proposer mismatches.make spec-test-alanpasses with it (qbft + ssv), and it resolves the same v1.2.2 artifact key as onstage.Notes on the follow-up commits
go.sumgrows by ~440 lines in the ipld-prime commit. Nearly all are/go.modchecksums from its larger module graph; only 7 are new module source hashes. ipld-prime 0.23.0 also requires apolydawn/refmtpseudo-version.http.request.method,http.response.status_code,http.route). They are identical in v1.39.0 and v1.43.0, so its metric attributes don't change.otelhttpandotel/sdk/metriconly come in via the e2e testcontainers dependency, so the otel commit leaves them alone. The testcontainers move later takesotelhttpto v0.69.0 (indirect) and dropsotel/sdk/metricfromssvsigner/go.mod(only otelhttp's own tests import it).go:generatetarget with v0.6.0 leaves all committed mocks byte-identical.Still open (no fix available)
openpgpis unmaintained): no fix, and we don't import it.Verification
go mod tidymakes no further changes (root and ssvsigner). Build, vet (including test files) and the fullmake lintpass. That covers golangci-lint for root and ssvsigner, deadcode, openapi and the ssvsigner import-boundary check.Root unit tests (
make unit-testpackage set, without-race/coverage): 76 packages pass. The only failures are three mDNS-based tests innetwork/p2pandnetwork/topics. They fail the same way on unmodifiedstagein my local sandbox (multicast), and CI covers them. The pass/fail set is identical before and after each commit here.ssvsigner unit tests pass, and the ssvsigner e2e suite passes locally (see above).
make spec-test-alanpasses locally against the reducedgo.spec.alan.mod.observability/...passes, including deps: security bumps (x/crypto, otel/sdk, chi) #3071'sTestBuildResources(semconv still matches) and/metricsscrape test.api/...andexporter/v1/api/...pass after the chi bump, andnetwork/discoverypasses after the ipld-prime bump.network/p2p:TestConfig_AddrsFactorycovers the filter (public and private HostAddress, HostDNS, neither) and fails without it. On a real v0.49 host with HostAddress set,h.Addrs()and the signed peer record carry only the external address; without it they list a VPN, the loopback and the LAN address. The rest ofnetwork/p2pfails only the same mDNS tests as before the commit.govulncheck ./...on this branch (Go 1.26.8 via thetoolchainline):stage(41 reachable) → 2, both without an available fix (kad-dht GO-2024-3218, x/cryptoopenpgp).openpgpentry).E2E passed - [action log](put link here)