TLS 1.3 ยังส่งชื่อเซิร์ฟเวอร์ในข้อความธรรมดา
TLS 1.3 เข้ารหัสการจับมือแต่ไม่ใช่ SNI อ่าน ClientHello ตรวจสอบการยอมรับ ECH ที่แท้จริง และบันทึกว่าผู้สังเกตยังเห็นอะไรได้บ้าง
การอัปเกรด listener เป็น TLS 1.3 เปลี่ยนสิ่งที่ผู้สังเกตสามารถอ่านได้ แต่ไม่มากเท่าที่หมายเลขเวอร์ชันบอกเป็นนัย ClientHello ยังคงเดินทางก่อนที่จะมีการเจรจาการเข้ารหัสใด ๆ และในการเชื่อมต่อปกติชื่อเซิร์ฟเวอร์ที่ร้องขอจะอยู่ที่นั่นในข้อความธรรมดา Encrypted Client Hello คือกลไกที่ซ่อนชื่อนั้นไว้ และเป็นการติดตั้งแยกต่างหากที่มีข้อกำหนดเบื้องต้นของตัวเอง ทำตามสี่ขั้นตอนนี้ก่อนเขียนนโยบายที่สันนิษฐานพฤติกรรมอย่างใดอย่างหนึ่ง
สิ่งที่การจับมือเปิดเผยจริง ๆ
TLS 1.3 เข้ารหัสใบรับรองของเซิร์ฟเวอร์และขั้นตอนการจับมือส่วนใหญ่ที่ตามมาหลัง ServerHello ทุกสิ่งที่ไคลเอนต์ส่งไปก่อนหน้าอยู่นอกการป้องกันนั้น เพราะกุญแจยังไม่มีอยู่จริง การระบุชื่อเซิร์ฟเวอร์เป็นส่วนหนึ่งของการเดินทางครั้งแรกนั้น จึงเป็นเหตุผลที่ผู้สังเกตแบบพาสซีฟยังอ่านมันได้โดยไม่ต้องเจาะอะไรเลย
ข้อกำหนด ECH, RFC 9849, เปลี่ยนสิ่งนี้ด้วยการเข้ารหัส ClientHello ภายในสำหรับเซิร์ฟเวอร์ที่ให้ความร่วมมือ การจับมือภายนอกยังคงอยู่และพาชื่อสาธารณะที่เครือข่ายมองเห็นได้ ดังนั้นการติดตั้งยังต้องมีอัตลักษณ์ภายนอกที่สมเหตุสมผลสำหรับตัวกลาง ชื่อภายนอกนั้นคือส่วนที่ผู้คนมองข้ามเมื่อพวกเขาคาดหวังว่าการเชื่อมต่อจะกลายเป็นนิรนาม มันเป็นชื่อปกปิด ไม่ใช่ชื่อที่ซ่อนไว้ และต้องถูกแปลงและตรวจสอบยืนยันเหมือนชื่ออื่น ๆ
ไม่มีสิ่งใดในนี้ที่ซ่อนเส้นทางการส่งมอบ ที่อยู่ต้นทางและปลายทาง พอร์ต ขนาดแพ็กเก็ต และเวลา ยังคงสังเกตได้ และสิ่งเหล่านี้มักบอกได้มากกว่าชื่อว่าใครกำลังพูดคุย การแปลงชื่อและความสัมพันธ์ในระดับแอปพลิเคชันเป็นอีกชั้นหนึ่ง ซึ่งแต่ละชั้นมีมุมมองของตัวเอง
อ่าน ClientHello แทนการสันนิษฐาน
เวอร์ชันใน ServerHello ไม่ได้บอกคุณว่าไคลเอนต์ส่งอะไรไป ดูการเดินทางครั้งแรกโดยตรง จากตำแหน่งที่แสดงถึงผู้สังเกตที่คุณสนใจ
openssl s_client -connect app.plant.example:443 -servername app.plant.example -tls1_3 </dev/null> 2>/dev/null | head -20 sudo tcpdump -ni eth0 -c 40 'tcp port 443' -w /tmp/tls.pcap tshark -r /tmp/tls.pcap -Y 'tls.handshake.extensions_server_name' -T fields -e tls.handshake.extensions_server_name
คำสั่งแรกทำการจับมือและแสดงพารามิเตอร์ที่เจรจาแล้ว รวมถึงเวอร์ชันโปรโตคอลและชื่อที่คุณร้องขอ คำสั่งที่สองดักจับแพ็กเก็ตแรกของการเชื่อมต่อจริง และคำสั่งที่สามดึงฟิลด์ SNI ออกมาจากการดักจับนั้น หากฟิลด์นั้นมีข้อมูล ผู้สังเกตที่คุณจำลองสามารถอ่านได้
ดักจับแยกกันฝั่งไคลเอนต์และบนเส้นทางเมื่อทั้งสองไม่ตรงกัน เพราะการดักจับในเครื่องอาจแสดงชื่อที่ middlebox เขียนใหม่หรือทิ้งในภายหลัง ดักจับจากโฮสต์ที่ไม่ได้ยุติ TLS เองด้วย เนื่องจากพร็อกซีที่ยุติจะเห็นข้อความธรรมดาตามการออกแบบและไม่ได้พิสูจน์อะไรเกี่ยวกับสิ่งที่เครือข่ายเห็น
ถือว่าส่วนขยาย ECH เป็นข้อกล่าวอ้าง ไม่ใช่หลักฐาน
การเห็นส่วนขยาย ECH ใน ClientHello ไม่ได้หมายความว่าการเชื่อมต่อใช้ ECH ไคลเอนต์ส่ง GREASE ECH เมื่อไม่มีคอนฟิกูเรชันที่ใช้งานได้ ก็เพื่อให้การจับมือของพวกมันดูเหมือนกัน ส่วนขยายมีอยู่ hello ภายในเป็นเหยื่อล่อ และชื่อจริงยังอ่านได้อยู่
dig +short HTTPS app.plant.example openssl s_client -connect app.plant.example:443 -tls1_3 -status </dev/null> 2>/dev/null | grep -i -E 'ech|status_request'
คำสั่งแรกแสดงว่าต้นทางเผยแพร่ระเบียนทรัพยากร HTTPS ที่มีพารามิเตอร์คอนฟิกูเรชัน ECH หรือไม่ และนั่นคือวิธีที่ไคลเอนต์เรียนรู้กุญแจ คำสั่งที่สองค้นหาข้อมูลสถานะของการจับมือ แม้ว่าข้อความสำเร็จของไคลเอนต์จะเป็นหลักฐานที่แข็งแรงกว่า การยอมรับคือสิ่งที่สำคัญ เซิร์ฟเวอร์ที่ไม่มีกุญแจตรงกันไม่สามารถถอดรหัส hello ภายในได้ และการเชื่อมต่อจะถอยกลับ
ตรวจสอบไคลเอนต์ด้วย เพราะการสนับสนุนของเบราว์เซอร์และคอนฟิกูเรชันแตกต่างกันตามเวอร์ชันและแพลตฟอร์ม นโยบายที่สร้างบน „เบราว์เซอร์สมัยใหม่ใช้ ECH“ เป็นการคาดเดาเกี่ยวกับฝูงเครื่อง ไม่ใช่ข้อเท็จจริงเกี่ยวกับฝูงเครื่องของคุณ จัดทำบัญชีเวอร์ชันที่เชื่อมต่อจริง แล้วทดสอบอย่างละหนึ่งเครื่อง หน้าเดียวกันที่ทำงานจากเบราว์เซอร์เดสก์ท็อปปัจจุบันอาจไม่ซ่อนอะไรจากไคลเอนต์ที่เก่ากว่าในเครือข่ายเดียวกัน
เขียนขอบเขตของผู้สังเกตลงในนโยบาย
ระบุว่าผู้สังเกตอยู่ที่ใดและอะไรที่มองเห็นได้ ณ จุดนั้นก่อนตัดสินใจว่าการควบคุมสามารถพึ่งพาอะไรได้ การเชื่อมต่อของเบราว์เซอร์กับเว็บไซต์ การขนส่ง VPN ภายนอก และพร็อกซีที่ยุติ TLS ต่างเผยชุดข้อเท็จจริงที่แตกต่างกัน และกฎที่เขียนสำหรับตำแหน่งหนึ่งแทบจะไม่ถ่ายโอนไปยังอีกตำแหน่งอย่างสะอาด
หากการควบคุมขึ้นอยู่กับการอ่าน SNI ให้ทดสอบว่าไคลเอนต์ที่ติดตั้งไว้ทำงานอย่างไรเมื่อ ECH พร้อมใช้งานและเมื่อไม่พร้อม จากนั้นบันทึกผลสืบเนื่องด้านความเข้ากันได้ เพราะตัวกรองที่หยุดจับคู่อย่างเงียบ ๆ นั้นแย่กว่าตัวที่ไม่เคยถูกติดตั้งเลย
สุดท้าย ให้เก็บความไม่แน่นอนไว้ในบันทึก การแทนที่ข้อกล่าวอ้างสากลแบบเก่าด้วยข้อใหม่กว่าจะทิ้งช่องว่างเดิมไว้ภายใต้ชื่อโปรโตคอลอื่น และผู้ตรวจสอบคนถัดไปจะเชื่อเช่นนั้นอย่างมั่นคงพอกัน