Skip to content

fix(OMN-16112): bump mcp >=1.28.1 — CVE-2026-59950 - #2085

Merged
jonahgabriel merged 1 commit into
devfrom
jonah/omn-16112-mcp-cve-bump
Aug 17, 2026
Merged

jonahgabriel merged 1 commit into
devfrom
jonah/omn-16112-mcp-cve-bump

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Aug 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Bumps mcp from 1.28.0 to 1.29.0 (satisfies >=1.28.1), fixing CVE-2026-59950 / SFTY-20260716-50488 — Improper Input Validation due to missing Host/related header validation in the MCP Python SDK (affected spec: <1.28.1).

mcp is a transitive dependency (pulled in via omnibase-infra and omninode-memory, both git-pinned) — omnimarket does not declare it directly. uv lock --upgrade-package mcp resolves cleanly to 1.29.0 with a single-package diff (no cascade to any other pin).

Provenance

Surfaced by #2084's (OMN-16001) security-scan.yml pull_request trigger — the first time PR content was ever scanned by this job (previously schedule/push-only). Confirmed pre-existing on dev, not introduced by any in-flight PR: dev tip's own uv.lock pins the same vulnerable mcp==1.28.0, and running the identical safety check command CI runs against dev's own lockfile reproduces the identical finding. Out of scope for #2084 by its own stated boundary (CI-gate-enforcement only) — this is the recommended standalone follow-up.

Verification

  • uv lock --upgrade-package mcp → uv.lock diff is exactly the mcp package block (version, sdist URL/hash, wheel URL/hash) — no other package touched.
  • uv sync → clean install, mcp==1.28.0 -> mcp==1.29.0.
  • Both mcp-consuming packages import cleanly at the new pin: import omnibase_infra, import omnimemory (the omninode-memory package's actual import name).
  • pre-commit run --files uv.lock → all applicable hooks green (Dependency health gate, Validator Requirements Fleet Gate, Pre-commit fail-loud meta-gate, etc.).
  • Governed impacted-test selector (pre-push, OMN-13973) escalated to the FULL local suite (lockfile changes cannot be narrowed) — see push log for pass/fail counts.

Ticket

OMN-16112

dod_evidence: single-package uv.lock diff, clean uv sync, clean downstream imports, pre-commit all-green, full governed pre-push suite green.

Evidence-Ticket: OMN-16112

Evidence-Source: OCC#6589

mcp 1.28.0 (transitive via omnibase-infra, omninode-memory) is
vulnerable to CVE-2026-59950 / SFTY-20260716-50488 (Improper Input
Validation, missing Host header validation), affected spec <1.28.1.

Pre-existing on dev, not introduced by any in-flight PR — confirmed by
reproducing the identical `safety check` finding directly against
dev's own uv.lock/pyproject.toml. Surfaced by omnimarket#2084's
security-scan.yml pull_request trigger (OMN-16001), which is the
first time PR content was ever scanned; out of scope for that PR by
its own stated boundary (CI-gate-enforcement only).

`uv lock --upgrade-package mcp` resolves to 1.29.0 with a
single-package diff (no cascade). Both mcp-consuming packages
(omnibase_infra, omnimemory) import cleanly at the new pin.

Evidence-Ticket: OMN-16112
@jonahgabriel
jonahgabriel enabled auto-merge (squash) August 17, 2026 04:26
@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 02a5a1a0-bea7-42c6-b26a-ad210069a08b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

✅ Architectural Review — PASSED

Errors: 0
Warnings: 0

What this checks

Rule Description
ARCH-TOPIC-001 No hardcoded Kafka topic strings in handler code
ARCH-DI-001 No event_bus=None bypass
ARCH-DI-002 No direct Handler instantiation outside workflow_runner/adapters
ARCH-DI-003 No reinvented DI containers
ARCH-TOPIC-002 contract.yaml topics follow `onex.{cmd

No architectural violations found.

Static architectural lint — no model inference (OMN-14176).

@onexbot-occ-writer

Copy link
Copy Markdown
Contributor

OCC autobind did not mint a companion for this PR: no changed-file candidate could be proven RED against the merge base, and emitting a PR-existence probe instead would be non-falsifiable evidence (OMN-15247). Hand-authored evidence is required.

@github-actions

Copy link
Copy Markdown

✅ Hostile Reviewer — PASSED

Blocking findings (critical/error): 0
Total findings: 0
Models succeeded: qwen3-review,qwen3-review-b


Gate semantics

Verdict Meaning Blocks merge?
passed >=2 models succeeded, no critical/error findings No
blocked CRITICAL or ERROR findings found Yes
degraded Fewer than 2 models succeeded (infra unavailable/timeout) Yes (OMN-15110)

Powered by omniintelligence.review_pairing.cli_review — node-based adversarial review via HandlerLlmCliSubprocess (OMN-8524)

jonahgabriel added a commit to OmniNode-ai/onex_change_control that referenced this pull request Aug 17, 2026
…6589)

* evidence(OMN-16112): author OCC companion for OmniNode-ai/omnimarket#2085

The autobind writer never minted a companion for this product PR (verified
live: no OCC PR, no branch, no contract entry references it) — its diff is a
single-package uv.lock bump (mcp 1.28.0 -> 1.29.0, CVE-2026-59950) with no
RED-derivable source file, which is outside autobind's current derivation
surface. That gap is tracked separately as OMN-16118. Authored by hand on the
occ#6573/OMN-10221 manual-companion precedent per controller authorization.

Adds a net-new contract + two dod_evidence entries and their receipts,
mirroring the #6573 template field-for-field:

  dod-OmniNode-ai-omnimarket-pr-2085      gh pr view 2085 --json number,state
  dod-OmniNode-ai-omnimarket-pr-2085-ci   gh pr view 2085 --json files

Both probes were executed live against omnimarket#2085's real head
(2b4fac8076f5667c1ac44a3e87cdcac0c2efd51f); probe_stdout is the byte-exact
capture, emitted as a literal block scalar so the yamlfmt v0.21.0
folded-scalar rewrite (OMN-15479) cannot touch it. Receipts carry both
contract_sha256 (whole-file) and contract_entry_sha256 (per-entry, OMN-13888)
computed via the canonical validator_receipt_gate hashers after a first
yamlfmt pass stabilized the contract bytes.

runner/verifier are this lane's own handles rather than the writer's
(node_pr_lifecycle_fix_effect / occ-evidence-source-autobind) — this
companion was not machine-minted and must not claim to have been.

Local `validator_occ_merge_eligibility` run against omnimarket#2085's live
title/branch/commit-sha with this commit's on-disk contract+receipts as the
evidence source returns eligible:true.

STILL REQUIRED before this can pass occ-preflight on its own PR: the
occ-self-bind-pr-<N> entry + receipt, which cannot exist until the PR number
does — same two-commit shape as the merged #6573/#903 companions.

Evidence-Ticket: OMN-16112

* evidence(OMN-16112): occ-self-bind-pr-6589

Appends the mandatory self-bind evidence item for OCC companion PR
#6589, per the merged #903/#6492/#6573 pattern (OMN-14650). This item
cannot exist before the PR number does, so it lands as a second commit
after opening #6589.

Uses contract_entry_sha256 (per-entry, OMN-13888) rather than the legacy
whole-file scheme #6573 used: appending this entry left the two existing
receipts' own per-entry hashes byte-identical (verified via the canonical
validator_receipt_gate hashers), so neither needed re-stamping. Only the
whole-file contract_sha256 changed (file grew); both existing receipts
carry contract_entry_sha256, which the gate treats as authoritative over
contract_sha256, so they remain valid unmodified.

Local verification, all green:
- validator_occ_append_only --ticket-id OMN-16112 (in-repo, base = merge-base
  with origin/dev) -> ok:true.
- validator_occ_merge_eligibility run twice: once as onex_change_control's
  own in-tree PR (#6589, its own title/branch/commit) -> eligible:true,
  and once simulating omnimarket#2085's real body with a live
  'Evidence-Source: OCC#6589' line appended -> eligible:true.
- check-receipt-honesty, check-contract-substance-floor,
  check-contract-shape-v1, check-dod-authoring-hygiene,
  check-receipt-hardening all Passed locally.

Evidence-Ticket: OMN-16112

* fix(OMN-16112): replace PR-existence probes with admissible content reads

OCC#6589's own Contract Compliance Check BLOCKed: both PR-scoped
dod_evidence items used bare `gh pr view <n> --json ...`, which the
OMN-15309 evidence-admissibility predicate treats as the paradigm
"PR-existence probe" anti-pattern -- not falsifiable, proves only that
a PR object exists. Bare `gh` is not in the admissible-command
vocabulary (only the compound `gh api` token is), and the module's own
comment names `gh pr view/list/status` as "trivially true via almost
every ticket's own generated self-bind check" -- exactly the shape
both merged precedents this companion was modeled on (occ#6573,
occ#6583) also used. Neither precedent's Contract Compliance Check
ever actually ran on its head (confirmed live: absent entirely from
both PRs' check-runs, ~100 runs each) -- apparently because the job
needs the ci:ready label to fire for real, which this companion has
and the autobind-minted/earlier precedents evidently didn't at
authoring time. So this is the first time this exact companion shape
has been checked for real, and it fails honestly.

Replaced two of the three items with genuinely admissible probes
(EXECUTED, FALSIFIABLE, OUTSIDE ITS OWN DIFF per the predicate):

  dod-OmniNode-ai-omnimarket-pr-2085: reads uv.lock content at #2085's
  pinned head ref via `gh api .../contents/uv.lock?ref=<sha>` and
  asserts mcp==1.29.0 -- proves the CVE-2026-59950 fix actually landed
  in the file, not just that a PR exists. RED-verified against the
  vulnerable 1.28.0 string.

  dod-OmniNode-ai-omnimarket-pr-2085-ci: reads the actual diff via
  `gh api .../pulls/2085/files` (admitted per the module's own
  BLOCK-message guidance -- "/pulls/<n>/files ... returns the actual
  diff") and asserts the file list is exactly ["uv.lock"]. RED-verified
  against a fabricated two-file list.

occ-self-bind-pr-6589 is left unchanged and stays individually
INADMISSIBLE (WARN, not BLOCK) -- self-bind is structurally incapable
of being "outside its own diff" (the predicate's own module comment
acknowledges this class exists), and `_has_effective_check` only
requires ONE admissible item across the contract, not all three, to
avoid the hard BLOCK. Locally verified via
`onex_change_control.validation.evidence_admissibility.classify_evidence`
directly: both new items -> ADMISSIBLE; self-bind -> still
NOT_EXECUTED as expected.

contract_entry_sha256 recomputed for the two changed items via the
canonical validator_receipt_gate hashers; occ-self-bind-pr-6589's own
per-entry hash is byte-identical (unaffected, confirming the
append-immunity property). validator_occ_append_only re-run against
the origin/dev merge-base: ok:true (this ticket still diffs as pure
'A' -- the whole OMN-16112 corpus is net-new to dev). Local
validator_occ_merge_eligibility re-run for omnimarket#2085's real
Evidence-Source binding: eligible:true, unchanged.

Evidence-Ticket: OMN-16112
@jonahgabriel
jonahgabriel merged commit 0b55f22 into dev Aug 17, 2026
203 of 219 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-16112-mcp-cve-bump branch August 17, 2026 12:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant