TLS 1.3 sunucu adını hâlâ düz metin olarak gönderiyor
TLS 1.3 el sıkışmayı şifreler ama SNI’yı değil. ClientHello’yu okuyun, gerçek bir ECH kabulünü denetleyin ve bir gözlemcinin hâlâ neler görebildiğini kaydedin.
Bir dinleyiciyi TLS 1.3’e yükseltmek, bir gözlemcinin okuyabileceğini değiştirir, ama sürüm numarasının ima ettiği kadar değil. ClientHello hâlâ herhangi bir şifreleme üzerinde anlaşılmadan önce yola çıkar ve sıradan bir bağlantıda istenen sunucu adı orada düz metin olarak durur. Encrypted Client Hello bunu gizleyen mekanizmadır ve kendi ön koşulları olan ayrı bir dağıtımdır. İki davranıştan birini varsayan bir ilke yazmadan önce bu dört adımı uygulayın.
El sıkışma gerçekte neyi açığa çıkarır
TLS 1.3, sunucunun sertifikasını ve ServerHello’dan sonra gelen el sıkışmanın büyük bölümünü şifreler. İstemcinin ilk gönderdiği her şey bu korumanın dışındadır, çünkü anahtarlar henüz yoktur. Sunucu adı göstergesi bu ilk uçuşun parçasıdır, bu yüzden pasif bir gözlemci hiçbir şeyi kırmadan onu hâlâ okuyabilir.
ECH spesifikasyonu, RFC 9849, bunu işbirlikçi bir sunucu için iç bir ClientHello’yu şifreleyerek değiştirir. Dış el sıkışma kalır ve ağın görebileceği bir genel ad taşır, bu yüzden dağıtım hâlâ aracılar için anlamlı olan bir dış kimliğe ihtiyaç duyar. O dış ad, insanların bağlantının anonim olmasını beklerken kaçırdığı kısımdır. Bu bir örtü adıdır, gizli bir ad değil, ve herhangi biri gibi çözümlenip kimliği doğrulanmalıdır.
Bunların hiçbiri teslimat yolunu gizlemez. Kaynak ve hedef adresleri, bağlantı noktaları, paket boyutları ve zamanlama gözlemlenebilir kalır ve bunlar genellikle kimin konuştuğu hakkında addan daha fazlasını söyler. Ad çözümlemesi ve uygulama düzeyindeki ilişkiler bir başka katmandır, her biri kendi görünürlüğüne sahiptir.
Varsaymak yerine bir ClientHello okuyun
ServerHello’daki sürüm, istemcinin ne gönderdiğini size söylemez. İlk uçuşa doğrudan bakın, önemsediğiniz gözlemciyi temsil eden bir konumdan.
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
İlk komut bir el sıkışma yapar ve anlaşılan parametreleri gösterir; buna protokol sürümü ve istediğiniz ad dahildir. İkincisi gerçek bir bağlantının ilk paketlerini yakalar, üçüncüsü bu yakalamadan SNI alanını çıkarır. Alan doluysa, taklit ettiğiniz gözlemci onu okuyabilir.
İkisi uyuşmadığında istemci tarafında ve yolda ayrı ayrı yakalayın, çünkü yerel bir yakalama, bir middlebox’ın sonradan yeniden yazdığı veya düşürdüğü bir adı gösterebilir. TLS’i kendisi sonlandırmayan bir ana bilgisayardan da yakalayın, çünkü sonlandıran bir vekil düz metni tasarımı gereği görür ve ağın ne gördüğüne dair hiçbir şey kanıtlamaz.
Bir ECH uzantısını iddia olarak görün, kanıt olarak değil
Bir ClientHello’da ECH uzantısı görmek, bağlantının ECH kullandığı anlamına gelmez. İstemciler kullanılabilir bir yapılandırmaları olmadığında GREASE ECH gönderir, tam da el sıkışmaları aynı görünsün diye. Uzantı vardır, iç hello bir yemdir ve gerçek ad hâlâ okunabilir.
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'
İlk komut, kaynağın ECH yapılandırma parametresi olan bir HTTPS kaynak kaydı yayımlayıp yayımlamadığını gösterir ve istemciler anahtarı böyle öğrenir. İkincisi el sıkışma durum bilgisini arar, gerçi bir istemcinin başarı iletisi daha güçlü kanıttır. Kabul önemlidir: eşleşen anahtara sahip olmayan bir sunucu iç helloyu şifresini çözemez ve bağlantı geri düşer.
İstemciyi de denetleyin, çünkü tarayıcı desteği ve yapılandırma sürüme ve platforma göre değişir. „Modern tarayıcılar ECH kullanır“ üzerine kurulu bir ilke, bir filo hakkında tahmindir, sizin filonuz hakkında gerçek değildir. Gerçekten bağlanan sürümleri envanterleyin, sonra her birinden bir tane test edin. Güncel bir masaüstü tarayıcısından çalışan aynı sayfa, aynı ağdaki daha eski bir istemciden hiçbir şey gizlemeyebilir.
Gözlemcinin kapsamını ilkeye yazın
Bir denetimin neye güvenebileceğine karar vermeden önce gözlemcinin nerede oturduğunu ve o noktada neyin görünür olduğunu belirtin. Bir tarayıcının bir siteye bağlantısı, bir dış VPN taşıması ve TLS’i sonlandıran bir vekil her biri farklı bir olgu kümesi açığa çıkarır ve bir konum için yazılmış bir kural nadiren bir diğerine temiz aktarılır.
Bir denetim SNI okumaya bağlıysa, dağıtılan istemcilerin ECH mevcut olduğunda ve olmadığında nasıl davrandığını test edin. Sonra uyumluluk sonucunu kaydedin, çünkü sessizce eşleşmeyi bırakan bir filtre hiç dağıtılmamış olandan daha kötüdür.
Son olarak, belirsizliği kayıtta tutun. Eski bir evrensel iddiayı daha yeni biriyle değiştirmek, aynı boşluğu başka bir protokol adı altında bırakır ve bir sonraki gözden geçiren ona aynı derecede sıkı inanır.