Skip to content

chore(release): integrate v1.0.3 security and stability patches - #259

Merged
abruption merged 91 commits into
mainfrom
abruption/release-103-security-integration-20261005
Oct 5, 2026
Merged

abruption merged 91 commits into
mainfrom
abruption/release-103-security-integration-20261005

Conversation

@abruption

@abruption abruption commented Oct 5, 2026 •

Copy link
Copy Markdown
Owner

Summary

Integrate the reviewed v1.0.3 security/stability candidates and release preparation through one protected, exact-tree release gate. Preserve the original head commits of #249–#258 using a merge commit, not squash/rebase, so those PRs are recorded as indirectly merged when their commits reach main.

Closes #228
Closes #229
Closes #230
Closes #231
Closes #233
Closes #234
Closes #235
Closes #236
Closes #237
Closes #239

Type

  • fix
  • docs
  • chore / test

Changes

  • Complete SSH option allowlisting and authenticated pairing principal anchors.
  • Bound Relay admission by trusted source and Control device-code issuance by pending capacity/in-flight reservations.
  • Restrict Control auth API routes/transports and disable unused direct provider-ID-token sign-in.
  • Compose all ten public v1.0.3 fixes, retaining literal-message and safe-output parsers, byte-safe SSH receipts, locked update transactions, wake cleanup, receiver admission and release/dependency-audit gates.
  • Prepare version 1.0.3, regenerated standalone and four-language notes/runbooks.
  • Preserve bearer header stripping AND the device-code reservation finally cleanup; correct the combined positive-path fixture to send actual CLI device-code input.
  • Close receiver-owned channels before fixture server shutdown waits; add an idle authenticated direct-channel regression.

The five security fixes correspond to GHSA-9x52-82cv-4c22, GHSA-4rvw-q2vm-v4x3, GHSA-6xwm-5p7g-8v8q, GHSA-2hjv-35jg-gghm and GHSA-646x-xjw9-mf6x. CVE identifiers remain unassigned; existing requests are retained, without making assignment a release prerequisite. Advisory publication follows verified package publication, not this PR alone.

Checklist

  • Generated standalone matches canonical source.
  • Regression tests and documentation updated.
  • No real credentials, session keys, provider tokens or private evidence included.
  • Exact PR CI and post-merge main CI successful before tagging.
  • Immutable/attested draft artifacts, isolated fresh installations and package audits successful before publication.
  • Required human PyPI environment review and post-publication file/hash/install verification recorded.

The legacy template's cc_peer.py and real-host messaging checks are not applicable to this non-delivery release gate. No live agent messages were submitted for release validation.

Verified against

Local macOS arm64: Python 3.13.7, Node 24.16.0. Before version/docs integration: full extras suite 739 tests / 12 skips; Control 123 tests; actual Python↔Node Control integration 11 tests, all passed. Python 3.9 core/adapter/Codex and distribution/docs scopes passed. Python/Node runtime audits reported no known vulnerabilities. Final candidate CI 37246632730 and exact-main CI 37246912330 passed. An initial Ubuntu/Python3.11 diagnostic-clock test failure was reproduced as fractional boundary rounding; exact 0/59.999/60 clock fixtures now preserve both suppression and renewal assertions without product changes.

Notes

Source fixes do not establish hosted deployment. Relay trusted-proxy headers/secret and edge admission remain operator configuration; Control source rollout is separate. Existing suspicious pairing bindings, sessions, provider credentials and devices are not automatically audited or revoked.

RC4 live-campaign evidence is historical, exact ACK20/21 unchanged; no new live campaign or #161 root-cause resolution is claimed. The fixture shutdown regression is proven separately and does not establish the cause/resolution of historical WebSocket accept warnings or native exit139. Side-session and instant-steering experimental PRs are excluded.

Use normal protected merge only after aggregate release gate success. Do not bypass branch protection or PyPI environment review.

Publication evidence

Protected merge 0d252550ab40c26d1ac4a19193df6ca2f84d830b, immutable stable v1.0.3. Preparation 37247147805 and publish/verify 37247453910 succeeded. Required pypi waiting state was observed, followed by a recorded human approval by abruption. All seven protected-source attestations verified; published wheel and sdist match locked candidates and independent fresh installs passed. Actual public-release downloader/provenance verifier also passed, without changing installed runtimes. Five advisories published with patched version 1.0.3 and no assigned CVE. Private Draft PRs were closed after source inclusion, not directly merged through a protection bypass. No fleet or production service deployment.

Wheel SHA256: 252371d35016385b4ded2ea3347b5836eead1dfc3b4cf3c903376ff9a7a3325c.
Sdist SHA256: 57f17bfbc0e5281d261c1eb5594220eabf8abe360780d5a7c6e9868acff1d953.

Unknown paths and connects without a valid one-use session no longer spend
the global handshake window. /v1/session attempts are also limited per
source (--client-handshake-rate, default 5) so a single source cannot
exhaust the global window. Sources are direct peer addresses, or, behind a
loopback reverse proxy, dedicated headers authorized by
--trusted-proxy-secret-file; X-Forwarded-For is never trusted. IPv6
sources are grouped by /64 and the per-source table is bounded.
Store a source window only for charged or source-rejected attempts, so global rejections leave no empty entries and pruning cannot fail. Treat duplicated proxy identity headers as unidentified. Report the source limit under a separate sourceCapacity field so schema version 1 capacity consumers keep accepting relay metrics, and document the remaining shared-source and distributed-source limits.
Accept only client_id in device-code requests, prune codes that expired more than 15 minutes ago before issuing another, and refuse new codes with 503 device_code_capacity once 500 unexpired codes are pending. Late polls within the retention window still receive expired_token.
Count stored codes and reserve an in-flight slot without an intervening await, immediately before the BetterAuth handler, and release it in finally. Concurrent requests can no longer all pass the cap before the insert. Prune expired codes at most once a minute so refused requests do less database work before the rate limit.
Trust valid matching schema envelopes before login-shell stderr, and report SSH send timeouts as unknown without allowing automatic retry.

Fixes #228
@abruption abruption added this to the v1.0.3 milestone Oct 5, 2026
@abruption
abruption merged commit 0d25255 into main Oct 5, 2026
28 checks passed
@abruption
abruption deleted the abruption/release-103-security-integration-20261005 branch October 5, 2026 00:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment