Fabric Connect: seal proxied operations end-to-end with the cluster secrets key (`encrypted_operation`), starting with the token mint (blocked on harper#3288)
Maintainer thường phản hồi trong vòng 2 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 25/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- typescript
- Lĩnh vực
- authentication, backend-api-design, security
Hướng nghiên cứu
Start with src/config/getInstanceClient.ts and trace the proxy client setup, then read src/lib/crypto/envSecret.ts, src/integrations/api/instance/secrets/secrets.ts, and authStore.establishFabricConnectAuth. The issue depends on Harper's encrypted_operation support and the control-plane relay, so confirm those interfaces before implementation. Done means the listed acceptance criteria pass, including interceptor tests, retry and fallback behavior, badge state, and logging redaction.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Studio leg of end-to-end encrypted Fabric Connect operations. Blocked on HarperFast/harper#3288 (encrypted_operation in core) and on the control-plane leg that relays it opaquely (linked as a dependency on this issue).
Context
When a cluster or instance is reached through Fabric Connect, getInstanceClient points the axios client at the proxy URL (src/config/getInstanceClient.ts:58-77) and every operation, request and response, crosses the proxy in plaintext. The first one in every session is createInstanceAuthenticationTokens (src/integrations/api/instance/auth/createInstanceAuthenticationTokens.ts, called from authStore.establishFabricConnectAuth), whose response is the operation token and refresh token the rest of the session uses; sessions whose direct connection fails (studio#1635 measured network-level direct failures across 11 organizations in a day) keep using the proxy for everything.
Studio already seals values to a cluster's secrets public key for set_secret: src/lib/crypto/envSecret.ts (encryptEnvelope, WebCrypto RSA-OAEP + AES-GCM, enc:v1 output) and secretsPublicKeyQueryOptions({ managedClusterId }) in src/integrations/api/instance/secrets/secrets.ts, which fetches the key from the control plane for managed clusters. harper#3288 lets the same envelope carry a whole operation and answers with a response sealed under a per-request key.
Changes
- Transparent sealing on the proxy client. In
getInstanceClient, whenfabricConnectis true and the target supports it, install a request interceptor that replaces the body with{ operation: 'encrypted_operation', envelope }whereenvelope = encryptEnvelope(JSON.stringify({ v: 1, op: body, rk, nonce, ts: Date.now(), actor }), publicKey, fingerprint)with fresh randomrk(32 bytes) andnonce(16 bytes); and a response interceptor that decryptsencrypted_responsewith WebCrypto AES-GCM underrk, AAD"harper.encrypted_operation.response:" + nonce, then resolves with the innerbodyor rejects with anAxiosErrorwhoseresponse.status/dataare the inner ones. Existing callers and react-query hooks see the same shapes as today.connectsThroughProxy(id)stays the single switch. - Self-heal paths. On a plaintext
409withcustody_fingerprint, invalidate the public-key query and retry once (same pattern as theKID_MISMATCH_ERROR_PHRASEhandling insecrets.ts). On a staleness error carryingserver_time, retry once with the clock offset applied. - Capability gate.
MIN_ENCRYPTED_OPERATION_VERSIONchecked withwasAReleasedBeforeBagainstgetRegistrationInfoQueryOptions' version, the pattern inuseSupportsDeploymentSSE.ts; the constant is set when the core release is cut. - No custody key. Self-hosted clusters (the control plane answers 400 for the key), clusters below the minimum version, or a node answering 503 "custody is not initialized": fall back to plaintext proxying and show a persistent indicator on the Fabric Connect badge ("not end-to-end encrypted; operations are visible to the control plane"). A "require encrypted proxying" preference is a follow-up, not this issue.
- Mode policy. harper#3288 has two modes: whole-body
sealed, andfields(keys in the clear, values sealed, inner status visible) so the control plane can audit what was attempted. Proposed default:fields, sealing every leaf exceptoperationand the structural keysdatabase,schema,table, with whole-bodysealedas a per-call override for operations whose structure is sensitive. Infieldsmode the interceptor serializesopto JSON text, puts its SHA-256 in the sealed header asoph, and binds each sealed leaf to its JSON Pointer; the helper lives besideenvSecret.ts. Both modes must be selectable per call; the default is left open until the core issue has had feedback (Devin, 2026-10-19). - First consumer is the token mint over the proxy; the proxy-fallback mode in
resolveFabricConnectAuthis covered by the same interceptor. - Never log the sealed request,
rk, or the unsealed response; the existing rule of logging onlyerror.message(axios configs carry bearer tokens) applies.
Acceptance criteria
-
With a capable managed cluster, every operation sent through the proxy leaves the browser as
encrypted_operationwith anenc:v1envelope sealed to the cluster key the secrets page uses, and the caller receives the inner response or error with unchanged shape (unit tests on the interceptors with a mocked proxy; one test proves the plaintext operation name never appears in the request body). -
The token mint over the proxy is sealed; the minted token is unsealed in the browser only.
-
Key-mismatch and clock-skew answers self-heal with one retry; a second failure surfaces as the inner error.
-
Without a key or below the minimum version, operations still work in plaintext and the badge shows the plaintext state; the secrets page's "no custody" copy mentions that proxied operations are affected too.
-
No sealed material or key bytes reach
console, Datadog RUM actions, or error tracking (assert on the RUM wrapper's redaction as existing tests do). -
In
fieldsmode the request body showsoperationand the structural keys in plaintext and every other leaf as{ $sealed }; a test provesophmatches the sentopbytes and that a sealed leaf moved to another path is rejected by the node.
Links
- Core: HarperFast/harper#3288 (mechanism, threat model). Related: studio#1635 (direct-connect reachability), studio#1974 (sign-out through the proxy).
🤖 Generated by Anthropic Claude (Mythos 5.1) as devain; posted via @Devin-Holland.
- Ngôn ngữ chính
- TypeScript
- Star
- 5
- Fork
- 4
- Merge trung bình
- 1 ngày 20 giờ
- Pull request đã merge (30 ngày)
- 140
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của HarperFast/studio
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
HarperFast/studio#2070 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
HarperFast/studio#2067 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
HarperFast/studio#2053 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
HarperFast/studio#2026 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 77/100
HarperFast/studio#2021 ·
Maintainer thường phản hồi trong vòng 2 ngày
Tất cả issue của HarperFast/studio
Issue tương tự
-
Absenderzeile über dem Anschriftfeld wird bei Angeboten und Rechnungen am Ende abgeschnittenĐang mởfehler
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Azure/azure-functions-nodejs-extensions#180 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug good first issue help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
laaielichter/Threesmith#28 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
Maintainer thường phản hồi trong vòng 2 ngày
-
iso-bmff: add IsoBoxReadView.readUint64 and IsoBoxWriteView.writeUint64 for exact 64-bit fieldsĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
streaming-video-technology-alliance/common-media-library#611 ·
Maintainer thường phản hồi trong vòng 1 ngày