Skip to content

🤖 ci: establish a jointly green security baseline #100

Closed

Description

@ThomasK33

Observed blocker

PR #92's focused MCP update removes four native govulncheck advisory sections without adding findings. Its test, build, vendor, lint and docs checks pass locally. The CI-equivalent vulnerability scan still fails on both baseline and candidate:

  • Baseline: b1d48e3a64b42a23cb0cfaee8c30f3f21b761424, 55 symbol-result advisory sections.
  • Candidate: fc52a605d202286b59794449e34c9dc8738186d9, 51 sections.
  • Go 1.25.7, govulncheck 1.1.4; both native scan commands exit 3.

These are static-analysis findings, not a claim that every advisory is exploitable in a deployment. Frozen-database Trivy filesystem/image comparison is still pending. A successful make lint does not include the separate vulnerability-scanning step run by CI.

Decision

Accept a bounded, non-publishing compatibility experiment to identify the smallest supported toolchain/dependency set that passes the required security gates together. Advisory fix versions are lower bounds, not a tested solution or automatic upgrade targets.

A pure toolchain prerequisite would still fail on vulnerable dependencies. A dependency prerequisite excluding the MCP fixes would still fail on MCP findings. Do not create an unmergeable stack or waive inherited failures just to preserve artificial PR boundaries.

Experiment boundaries

  1. Verify current supported Go and Coder release channels from primary sources. Select exact versions deliberately; do not choose the numerically newest release by default.
  2. Use isolated source snapshots and scanner databases. Retain source/tool/database identities, commands, native exits, dependency inventories, and baseline/candidate differences. Reuse the ongoing Trivy baseline rather than duplicate it.
  3. Try at most three deliberate candidate dependency graphs. Private toolchain/dependency edits and strictly necessary compatibility fixes are allowed. No experimental pushes, new PRs, release/image publishing, CI suppressions, branch-rule changes, or unrelated cleanup.
  4. Run actual CI-equivalent security analysis plus test/build/vendor/lint/docs gates. A scanner loading failure, incomplete analysis, or reduced finding count is not a pass. Hands-on verification must include screenshots and video, accurately labeled.
  5. Keep publishing configuration under issue 🤖 ci: diagnose and restore verified main image publishing #98's owner. Share the proposed toolchain before any delivery integration; rerun its non-publishing main/release checks with an adopted toolchain.
  6. Return a tested set and delivery boundaries, or a specific blocker when the candidate budget is exhausted. Substantial API redesign requires a new scope decision.

Delivery decision after the experiment

Split only if each proposed PR can independently satisfy the existing gates. Otherwise, explicitly reopen #92's scope for the smallest tested, jointly green security remediation, with understandable commit boundaries and updated acceptance criteria. This issue does not yet authorize that expansion or experimental publication.

Keep existing dependency PRs open. No review-counter resets, replacement PRs, premature review requests, or automatic merges. Repository policy still reserves merging to the user. Maintainer owns the scope decision and post-merge verification.


Generated with xum • Model: coder:openai/gpt-6-astra • Thinking: xhigh

Activity

  1. ThomasK33 commented on Sep 18, 2026

    @ThomasK33
    MemberAuthor

    Scope decision: adopt graph 2 for combined delivery in PR #92

    The private experiment used two of its three allowed candidates. Graph 2 passed all requested local repository and native security gates on tree e1a059e4988c6f00db898f6457abe04dd7a15871, based on PR #92 head fc52a605d202286b59794449e34c9dc8738186d9.

    PR #92 will be explicitly expanded to a cohesive security-baseline and CI-compatibility repair. It is not ready to merge. This is a deliberate scope change, not an unexplained dependency expansion.

    Why one delivery unit

    The merge queue forces the full Go, workflow and Terraform checks. A toolchain-only fix, dependency-only fix excluding MCP, scanner-only fix, or scripts-only helper fix would leave other required gates failing. Separate red prerequisite PRs would not be independently landable. Keep the work reviewable as distinct logical commits inside the existing PR; do not create a replacement PR or reset review counts.

    Authorized scope

    1. Preserve the focused MCP SDK 1.4.1 remediation, regression tests, and deployment-limit documentation already in 🤖 fix: restore the supported security baseline and CI compatibility #92.
    2. Integrate the tested Go 1.26.8 / Coder 2.35.8 Security Support graph. Explicit security corrections are gRPC 1.83.2, x/crypto 0.55.0 and x/mod 0.40.0, with the necessary transitive resolution. No application compatibility fixes were needed. Update directly affected toolchain documentation/pins; do not modernize unrelated dependencies.
    3. Repair Trivy installation by explicitly selecting the available current 0.74.0 release at all five scan invocations, retaining the pinned action commit and existing enforcement. Prove installation and filesystem, image and Terraform-config scan compatibility before publishing this change; the old scanner's green results are not a substitute.
    4. Correct the Codex-comments helper so it recognizes actual summary metadata and the exact clean security-review reply as non-findings. Keep real comments, unresolved threads, malformed/lookalike metadata, and quoted-marker findings blocking. Metadata must never count as review approval. Add offline regression tests.

    Size and evidence

    The tested graph changes 374 modules relative to the scoped #92 candidate: 152 additions, 14 removals and 208 version changes. Its generated dependency patch changes 2,320 files, with 305,522 additions and 210,083 deletions; only go.mod and go.sum change outside vendor/. This is substantial dependency churn, not a small ordinary source diff. Preserve the full inventory and explain consequential direct/transitive changes in the PR.

    Against the same frozen databases, native main→graph-2 results were govulncheck 55→0, Trivy filesystem 41→0, and Trivy image 60→0 gated findings. Six non-called govulncheck advisories remain outside its failing symbol-level gate. These results do not establish deployment exploitability or production readiness.

    Remaining delivery gates and exclusions

    • Validate the complete unchanged integrated tree: tests/race, build, vendor, lint, docs, actionlint, native security scans, and the helper regression suite.
    • Run actual hosted and merge-queue checks, including real Kind/CNPG/template E2E and Terraform scans. No suppressions, weakened checks, altered branch rules, or substitute status claims.
    • Coordinate with issue 🤖 ci: diagnose and restore verified main image publishing #98's owner for non-publishing main/release packaging on Go 1.26.8 and the adopted graph. Do not change the GoReleaser publishing repair or push images/releases.
    • Preserve PR 🤖 ci: repair main-channel GoReleaser preparation #99 at 8aa69887a61ccca0d21964eebc98d552c0a764bc where possible. Its four historical assessments count; review capacity and a valid fresh-check route must be reconciled before any head change.
    • 🤖 fix: restore the supported security baseline and CI compatibility #92 currently has zero completed/pending assessments. Request separately attributed normal/security reviews only after the combined candidate and checks stabilize; reserve the independent final assessment within six lifetime assessments. Automatic assessments count too.
    • Existing dependency PRs remain open. No merging, enqueuing, auto-merge, cloud deployment, unrelated cleanup, broad API redesign, or new authentication subsystem is authorized.

    The scoped PR #92 workspace owns integration and CI/review readiness. The maintainer owns this scope decision; the user retains the repository's merge step. Issue #100 remains open until the security/CI baseline is verified after an authorized landing.


    Generated with xum • Model: coder:openai/gpt-6-astra • Thinking: xhigh

  2. ThomasK33 commented on Sep 21, 2026

    @ThomasK33
    MemberAuthor

    Backlog disposition: retain one dependency delivery path

    The maintainer is retiring the redundant dependency proposals #91, #93, #94, #95, and #96 in favor of #92 at 97b940310f7e2dddcc11dc288254ad61bd3da1dd. Their changes are confined to module files and vendor data; #92 meets or exceeds each requested version.

    Proposal Requested In #92
    #91 — gRPC 1.79.3 1.83.2
    #93 — go-jose/v4 4.1.4 4.1.4
    #94 — OpenTelemetry SDK 1.43.0 1.44.0
    #95 — OpenTelemetry 1.41.0 1.44.0
    #96 — Coder SDK 2.30.8 2.35.8

    Superseded does not mean fixed. This issue stays open. #92 has not landed; its security review and independent final assessment remain outstanding. The maintainer owns reconsideration of the retired proposals if #92 is abandoned or its scope drops any of these updates.

    Delivery order: finish #92's review and verify the security/CI baseline after landing; then refresh #99's CI and complete publishing recovery tracked in #98; then reassess the distinct installer work in #89. Issue #97 remains a separate accepted external-database-Secret enhancement awaiting implementation. No issue is being closed merely because a candidate PR exists.


    Generated with xum • Model: coder:bedrock-mantle-us-west-2/openai.gpt-6-astra • Thinking: xhigh

  3. ThomasK33 commented on Sep 21, 2026

    @ThomasK33
    MemberAuthor

    Baseline repair complete; advisory follow-up remains

    The original delivery goal is complete: #92 landed the tested dependency/toolchain and CI repairs; #99 restored normal main publishing. Both passed full merge-queue CI. The final publisher run 35605551335 succeeded, and both platform image revisions were independently verified against cd378781a116dac8c68f908bdc74d8425413677f (details in #98).

    This issue stays open only for the recorded advisory follow-up, not because CI or publishing is still broken. The accepted September 18 native scanner evidence recorded these six advisories without a called-symbol finding:

    Advisory Module
    GO-2026-5841 github.com/klauspost/compress
    GO-2026-5932 golang.org/x/crypto (openpgp)
    GO-2026-6354 golang.org/x/crypto (ssh)
    GO-2026-6355 golang.org/x/crypto (ssh)
    GO-2026-6094 github.com/google/cel-go
    GO-2026-6107 go.etcd.io/etcd/client/pkg/v3

    “Not called” describes the scanner evidence; it does not mean fixed or not exploitable. No gate was suppressed. Owner: the standing maintainer desk. Reassess on the next relevant dependency update, a change to the application's call paths, or a changed upstream advisory. Record current versions, available fixes and fresh reachability evidence before deciding each disposition. Close this follow-up only when every entry has an evidence-backed resolution or a separately tracked owner.

    The superseded proposals #91/#93/#94/#95/#96 now have their dependency coverage landed through #92; they need no reopening. No new PR is being created for unrelated hygiene.


    Generated with xum • Model: coder:bedrock-mantle-us-west-2/openai.gpt-6-astra • Thinking: xhigh

  4. ThomasK33 commented on Sep 21, 2026

    @ThomasK33
    MemberAuthor

    Correction: proposed CEL version does not resolve the observed behavior

    The upstream repository advisory lists v0.22.0–v0.29.2 as vulnerable and v0.30.0 as patched. Its metadata conflicts with the global/Dependabot advisory, which identifies v0.29.0 as fixed.

    A private, identical scratch probe against current main (cel-go v0.26.0) and PR101 combined with main (v0.29.0) observed both versions registering a json:"-" field and returning its sentinel value through escaped field access (x. followed by the backtick-quoted - identifier, with identifier escaping enabled). The public-field control also succeeded. This probe reports observations; its successful process exit does not mean the security property passed. The advisory's exact dynamic-indexing expression remains to be tested separately.

    No affected deployment path has been demonstrated in this project. This is a library-behavior reproduction, not a claim of project exploitation. A metadata-driven alert closure would not establish remediation.

    Maintainer decision: do not deliver v0.29.0 as the advisory fix. Expand the existing #101 version scope narrowly to a private v0.30.0 validation candidate, with explicit red/green nondisclosure assertions, both access forms and public-field controls, Kubernetes CEL compatibility checks, full repository/security gates, and recorded runtime testing of the current-main combination. No application redesign, unrelated upgrades, or new PR. If v0.30.0 fails these gates, stop with that blocker.

    Owner: maintainer desk. Formal assessments consumed on #101: zero. The public branch is unchanged; the corrected candidate has not been published. This also corrects the CEL follow-up assumptions recorded under #100.


    Generated with xum • Model: coder:bedrock-mantle-us-west-2/openai.gpt-6-astra • Thinking: xhigh

  5. ThomasK33 commented on Sep 21, 2026

    @ThomasK33
    MemberAuthor

    CEL follow-up disposition: resolved by #101

    The CEL dependency correction landed as cfdd89749111d542e3fc7632ea1b8fa1fae1b49b, using v0.30.0, the fixed release identified by the upstream repository advisory. v0.29.0 still disclosed the excluded field in the reproduced library probe despite conflicting global advisory metadata.

    The identical assertion-based probe failed on v0.26.0/v0.29.0 and passed on v0.30.0. Public-field controls passed. Final-SHA local/security checks, the actual merge-queue E2E, and normal main publishing passed. Alert #46 is fixed. The open Dependabot alert inventory is now empty, but that does not erase other recorded advisories or establish non-exploitability.

    This issue remains open for the other five baseline advisory follow-ups:

    • GO-2026-5841 — klauspost/compress/s2.
    • GO-2026-5932 — x/crypto/openpgp.
    • GO-2026-6354 and GO-2026-6355 — x/crypto/ssh.
    • GO-2026-6107 — etcd client TLS-handshake goroutines.

    These were recorded as non-called in the baseline scan, not proven unexploitable. No new reachability finding or resolution is claimed for them here. Owner: maintainer desk; reassess when the dependency, relevant usage, or advisory information changes. The CEL item GO-2026-6094 is resolved for the tested library disclosure routes; no JSON-conversion or nested-type coverage claim is made.


    Generated with xum • Model: coder:bedrock-mantle-us-west-2/openai.gpt-6-astra • Thinking: xhigh

  6. ThomasK33 commented on Sep 23, 2026

    @ThomasK33
    MemberAuthor

    Advisory refresh on main (c58c8514)

    Five advisories from the original baseline remain open. None of the changes merged since the last scan adds use of the affected packages. The earlier "not called" result came from a scan of a specific build and does not mean these are fixed or unexploitable.

    Advisory Module (pinned) Fixed release
    GO-2026-5841 github.com/klauspost/compress v1.18.6 v1.18.7
    GO-2026-5932 golang.org/x/crypto/openpgp v0.55.0 none (package is unmaintained)
    GO-2026-6354 golang.org/x/crypto/ssh v0.55.0 v0.56.0
    GO-2026-6355 golang.org/x/crypto/ssh v0.55.0 v0.56.0
    GO-2026-6107 go.etcd.io/etcd/client/pkg/v3 v3.6.5 v3.6.14

    Fixed versions are from the Go vulnerability database. All three affected modules are indirect dependencies.

    Next step: one narrow dependency update to klauspost/compress v1.18.7, golang.org/x/crypto v0.56.0 and go.etcd.io/etcd/client/pkg/v3 v3.6.14. It will include only the transitive changes Go's module resolution requires, with vendoring refreshed and the full CI and merge-queue E2E. GO-2026-5932 stays open here until the dependency that pulls in openpgp drops it.


    Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: xhigh

  7. ThomasK33 commented on Sep 23, 2026

    @ThomasK33
    MemberAuthor

    Four advisories cleared by #118

    #118 landed as 92ff1f1aaf366c484bac13ccd69e6ec546fbbb85. It raised github.com/klauspost/compress to v1.18.7, golang.org/x/crypto to v0.56.0 and go.etcd.io/etcd/client/pkg/v3 to v3.6.14, with no other module changes.

    Advisory Status
    GO-2026-5841 (compress s2) cleared
    GO-2026-6107 (etcd transport) cleared
    GO-2026-6354 (x/crypto ssh) cleared
    GO-2026-6355 (x/crypto ssh) cleared
    GO-2026-5932 (x/crypto openpgp) still open: no fixed release exists
    • Scan: govulncheck before and after the change, with the same tool (v1.1.4) and database snapshot (2026-09-16), shows only GO-2026-5932 remaining, at module level. No new advisories appeared, and neither scan found calls to affected functions.
    • Merge: the merged tree is identical to the reviewed head. The full Kind E2E ran on the merged commit in the merge queue and passed all 12 cases.
    • Publishing: ghcr.io/coder/coder-k8s:main was published from 92ff1f1a. Its linux/amd64 and linux/arm64 images both carry that revision.

    GO-2026-5932: the openpgp package is not compiled into our builds. It does not appear in vendor/modules.txt; the finding is module-level because other x/crypto packages are required. This corrects my earlier comment, which said a dependency pulls it in. With no fixed release, this issue stays open to track it. The next step is triggered by an upstream fix or withdrawal of the advisory.


    Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: xhigh • Cost: $1416.26

  8. ThomasK33 commented on Sep 24, 2026

    @ThomasK33
    MemberAuthor

    Closing: required security gates are green on main

    This issue's goal was a tested dependency set that passes the required security gates together. On main (116e2ecf), the merge-queue run passed govulncheck (in the lint job), the Trivy filesystem scan and the Trivy image scan. There are no open Dependabot or code-scanning alerts.

    Baseline advisory follow-ups:

    Residual ownership: the maintainer desk checks GO-2026-5932 on its regular monitoring runs. It will open a new issue if any of these happens:

    • a fixed release appears;
    • the advisory is withdrawn or changes scope;
    • golang.org/x/crypto/openpgp appears in vendor/modules.txt, meaning a dependency started building it.

    Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: xhigh

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is not working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions