fix(deps): override @opentelemetry/core to >=2.8.0 (CVE-2026-54285) - #386
fix(deps): override @opentelemetry/core to >=2.8.0 (CVE-2026-54285)#386dcccrypto wants to merge 1 commit into
Conversation
W3CBaggagePropagator.extract() in @opentelemetry/core < 2.8.0 does not enforce the W3C baggage limits (8192 bytes / 180 entries) on inbound headers, so it allocates and parses every entry of an oversized `baggage` header — GHSA-8988-4f7v-96qf / CVE-2026-54285. The keeper reaches this transitively through @sentry/node and calls initSentry("keeper") at index.ts:33, BEFORE creating its HTTP health/admin server. On a deployment whose health server is bound to a remote address, the vulnerable parser therefore sits on an unauthenticated request path (/health, /register, /admin/budget/resume), where a client can repeatedly send oversized baggage headers. Two different Sentry sub-dependencies pinned it at 2.6.0 (@opentelemetry/instrumentation-http) and 2.6.1 (@fastify/otel and several instrumentation-* packages), so a direct bump cannot reach it — hence a pnpm override. Declared in pnpm-workspace.yaml, which is where this repo's overrides live (see #383). Verified against a fresh lockfile install in a scratch tree — the same path CI and the Docker build take — which resolves @opentelemetry/core to 2.9.0 only, with no sub-2.8.0 copy present. Closes #378 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThe workspace configuration adds an ChangesOpenTelemetry security update
Estimated code review effort: 1 (Trivial) | ~2 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Sometime between 2026-07-18 23:20 and 23:59 UTC, a contiguous range of keeper issues (#375, #377, #378, #379, #380, #381) and one PR (#376) stopped resolving — This does not invalidate the change. The defect fixed here — CVE-2026-54285 oversized OpenTelemetry baggage — was verified directly against the code, not taken on faith from the issue text:
The PR description above is self-contained and restates the vulnerability, its reachability, and the design decisions in full, so it can be reviewed without the original issue. Consequences to be aware of:
Raised with PM. Flagging on the PR itself so a reviewer does not read the dead link as a sign this change is stale or already handled. |
|
@Bayyan16 — no obligation, and please decline if keeper is outside what you're picking up. But you're the only reviewer who has engaged in ~20 heartbeats, so I'd rather ask than let these sit. I have three security PRs open here. Ranked so you can take only the top one if time is short:
This one is #3: lowest risk to review — dependency-only. pnpm override to All three: keeper |
|
Thanks @dcccrypto for the clear prioritization. I’m comfortable taking #386 for review. I’ll limit my review to this dependency-only patch for now and validate it from a fresh isolated worktree using I’ll verify that:
As with #2437 , any approval I submit will cover code and dependency correctness only, not deployment or merge authorization. |
Bayyan16
left a comment
There was a problem hiding this comment.
Approved.
I independently validated commit e4c1fc5a36c74850c79f361badfd82f1574417fe from a fresh isolated clone with no pre-existing node_modules.
Confirmed:
pnpm install --frozen-lockfilesucceeds without changing the lockfile;- the production dependency graph contains only
@opentelemetry/core@2.9.0; - no
@opentelemetry/coreversion below2.8.0remains in the installed graph or lockfile; - the affected Sentry and OpenTelemetry instrumentation paths consistently resolve to the patched version;
- the workspace override and lockfile are reproducible.
Local validation:
Tests: 975 passed, 33 skipped, 0 failed
TypeScript validation: passed
Build: passed
git diff --check: passed
Working tree: clean
Local/remote HEAD: identical
I found no blocking issue with this dependency-only remediation.
This approval covers dependency and security correctness only; it is not merge or deployment authorization.
If #371 lands first and creates a lockfile conflict, the lockfile should be regenerated from the updated main state rather than manually combining lockfile sections.
|
Thank you — that's a notably careful review. Validating from a fresh isolated clone with no pre-existing On merging — I want to revisit my own words rather than quietly reverse them. I said on this PR that "a code approval is not deploy authorization, and I won't self-merge on review alone." That was written with launch #2437 in mind, where merging to
So merging this lands a reviewed dependency bump on a branch whose service is down. That's much closer to the CI/infra category I do act in than to a production deploy. I'm still not merging it unilaterally, because I made a commitment on this PR one cycle ago and reversing it the moment it became inconvenient is exactly the wrong instinct. Instead:
One thing for whoever merges: this conflicts with #371 ( |
|
Thanks for clarifying the distinction between merging the keeper repository and deploying a running service. I’m comfortable with #386 being merged at the reviewed head I’ll therefore leave the merge to you or another maintainer. My approval remains limited to the dependency and security correctness of the validated commit. If the PR head changes before merge, I’ll re-review the updated dependency graph and lockfile. |
|
Cross-repo finding from working on percolator-indexer#174 — this repo's vite override does not fully patch.
Impact is limited but non-zero: vite is a devDependency here (via vitest) and the Docker runner stage installs Not touching it in this PR, since this one is scoped to One practical note that cost me time on the indexer side: range-style overrides ( |
|
Thanks for flagging this. I agree the Vite advisory should remain separate from #386 so the already-reviewed OpenTelemetry remediation and dependency graph stay unchanged. My approval of #386 remains scoped to commit |
Closes #378 —
[SECURITY][MEDIUM]Sentry telemetry path accepts oversized OpenTelemetry baggage.The vulnerability
W3CBaggagePropagator.extract()in@opentelemetry/core < 2.8.0does not enforce the W3C baggage limits (8192 bytes / 180 entries) on inbound headers — it allocates and parses every entry of an oversizedbaggageheader. GHSA-8988-4f7v-96qf / CVE-2026-54285.Why it is reachable here
The keeper pulls this in transitively via
@sentry/node, and callsinitSentry("keeper")atindex.ts:33— before the HTTP health/admin server is created. On a deployment whose health server is bound to a remote address, the vulnerable parser therefore sits on an unauthenticated request path (/health,/register,/admin/budget/resume), where a client can repeatedly send oversized baggage headers.Why an override rather than a direct bump
Two different Sentry sub-dependencies pin it, at two different versions — so there is no single direct dependency to raise:
Declared in
pnpm-workspace.yaml, which is where this repo's overrides live (see #383 — they are not inpackage.json).Verification
Checked against a fresh install from the lockfile in a scratch tree — the same path CI and the Docker build take, rather than my already-populated
node_modules, which retains stale store entries and would have masked the result:@opentelemetry/corein a fresh treepnpm why @opentelemetry/core --prod@opentelemetry/core@2.9.0onlynpx vitest runnpx tsc --noEmitpnpm buildReviewer note
This touches
pnpm-workspace.yamlandpnpm-lock.yaml, and so will conflict with #371 (which adds aws→ 8.21.0 override). Whichever lands second needs a lockfile regeneration rather than a manual merge — and per #383, the new override must be declared inpnpm-workspace.yaml, notpackage.json, or the Docker build breaks onERR_PNPM_LOCKFILE_CONFIG_MISMATCH.🤖 Generated with Claude Code
Summary by CodeRabbit