From 8cdf7bf9c7f09cb9814bf08c3eb877f68b85fba8 Mon Sep 17 00:00:00 2001 From: RPRX <63339210+RPRX@users.noreply.github.com> Date: Tue, 8 Sep 2026 06:21:03 +0000 Subject: [PATCH] REALITY protocol: Reject outdated/strange Client Hello that doesn't have X25519MLKEM768 before optional X25519 https://github.com/XTLS/Xray-core/issues/6714#issuecomment-5575338614 --- tls.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/tls.go b/tls.go index 3e94c80..b33301e 100644 --- a/tls.go +++ b/tls.go @@ -211,20 +211,30 @@ func Server(ctx context.Context, conn net.Conn, config *Config) (*Conn, error) { if copying || err != nil || hs.c.vers != VersionTLS13 || !config.ServerNames[hs.clientHello.serverName] { break } - var peerPub []byte + var peerPub, peerPub2 []byte for _, keyShare := range hs.clientHello.keyShares { + if keyShare.group == X25519MLKEM768 && len(keyShare.data) == mlkem.EncapsulationKeySize768+32 { + if peerPub2 != nil { + peerPub2 = nil // ensure fail + break // ensure once + } + peerPub2 = keyShare.data[mlkem.EncapsulationKeySize768:] + continue // fast continue + } if keyShare.group == X25519 && len(keyShare.data) == 32 { + if peerPub != nil { + peerPub2 = nil // ensure fail + break // ensure once + } peerPub = keyShare.data - break + break // ensure order } } + if peerPub2 == nil { + break // reject outdated/strange Client Hello that doesn't have X25519MLKEM768 before optional X25519 + } if peerPub == nil { - for _, keyShare := range hs.clientHello.keyShares { - if keyShare.group == X25519MLKEM768 && len(keyShare.data) == mlkem.EncapsulationKeySize768+32 { - peerPub = keyShare.data[mlkem.EncapsulationKeySize768:] - break - } - } + peerPub = peerPub2 // secondary choice: X25519 in X25519MLKEM768 } for peerPub != nil { if hs.c.AuthKey, err = curve25519.X25519(config.PrivateKey, peerPub); err != nil {