REALITY.5: server-flight (ServerHello) fidelity for the authed path #76
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
femboy/yip#76
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
REALITY.3 makes the relay's authenticated TLS branch present a certificate forged from the real
destsite, but the ServerHello it emits is generated by the relay's own BoringSSL stack — notdest's stack (nginx/Cloudflare/etc.). In TLS 1.3 the ServerHello is cleartext (only the Certificate onward is encrypted), so its chosen cipher suite, chosen key-share group, extension set/order, GREASE placement, and cert-compression advertisement need not matchdest's. A passive DPI box holding a per-destServerHello template could therefore distinguish an authenticated REALITY session from a genuine browser↔destsession.This is the REALITY.5 milestone, spun out during REALITY.3's adversarial + cross-model review and recorded in the milestone spec. Filing as a tracked issue.
Scope of the gap (and what REALITY.3 does/doesn't claim)
dest's own bytes forwarded verbatim).dest, byte-identical) is unaffected; this is strictly about a passive observer of authed traffic with a per-dest fingerprint template.Possible approaches
dest's observed template (cipher preference order, extension set/order, GREASE, cert-compression), captured at pre-warm time alongside the leaf.dest's ServerHello is not viable — the ServerHello carriesdest's ephemeral key-share, which must correspond to keys we actually hold; the fields must be reproduced by our stack, not replayed.References
docs/superpowers/specs/2026-07-15-reality-tls-milestone-design.md("REALITY.3 advisor review — follow-up spun out")docs/superpowers/specs/2026-07-15-reality-3-server-cert-steal-design.mdDone — merged to
main(tip8bfbd0c)REALITY.5 is complete: the authed REALITY path now serves a byte/length-faithful, hand-rolled TLS 1.3 server flight instead of BoringSSL's, closing the passive-DPI gap this issue tracked. An authed session is now indistinguishable from a genuine browser↔
destsession end to end (cleartext ServerHello and encrypted-flight framing).Shipped across a stacked PR chain (all merged):
capture_dest_flight→ServerFlightTemplateper SNI)emit_server_hello+ server key schedule (X25519MLKEM768/4588 + X25519/29), round-trip provenemit_server_flight(EE/Certificate/CertificateVerify/Finished) framed todest'srecord_lengths, + role-agnostic server streamemit_server_hello+serve), BoringSSLSslAcceptorremoved; splice-pre-write / drop-post-write fail-safeError::MessageTooLarge+u24_len, pre-write signing-key hoist, partial-record-stall splice, group-29 e2e test)The core ask — ServerHello cipher/group/extension-order/GREASE fidelity to
dest— is 5b; the deferred cert-flight size gap is 5c. Verified by 5b/5c byte-match tests, a client↔server round-trip, and a live netns money test (a realverify=onclient tunnels through the hand-rolled relay; wrong-key fails closed).Deferred (own issue): P256/P384 server KEX + HelloRetryRequest → #84 (a
destselecting those currently → splice, safe/no-fidelity).