Mitmproxy 11: Tam HTTP/3 desteği
(mitmproxy.org)- QUIC ve HTTP/3 trafiğinin payı büyürken, mitmproxy 11 HTTP/3’ü varsayılan olarak etkinleştirerek modern web trafiği analizinin kapsamını genişletiyor
- HTTP/3, yalnızca şeffaf proxy ve reverse proxy’de değil, WireGuard ve local mode içinde de çalışıyor; bu da farklı yakalama ortamlarında kullanılabilmesini sağlıyor
- Chrome, QUIC üzerinde kullanıcının eklediği Certificate Authority’lere güvenmediği için, herkese açık güvenilir bir sertifika, komut satırı anahtarı ya da HTTP/2’ye geri dönüş seçeneklerinden biri gerekiyor
- DNS uygulaması Hickory DNS tabanına taşınıyor; A/AAAA dışı sorgular, HTTPS records, DNS-over-TCP, hosts dosyası kontrolü ve ECH anahtarlarının kaldırılması ele alınıyor
- ECH gibi gizlilik özellikleri, ortadaki adam proxy’sinin sertifika üretim akışını zorlaştırsa da mitmproxy, DNS yanıtlarını ayarlayarak çalışabilirliğini koruyor
HTTP/3 destek kapsamı
- mitmproxy 11, HTTP/3’ü şeffaf proxy ve reverse proxy modlarında destekliyor
- Reverse proxy’de tek bir mitmproxy örneği hem TCP hem UDP paketlerini alıyor ve iletilen HTTP sürümünü işliyor
- Örnek komut:
mitmproxy --mode reverse:https://http3.is
- Örnek komut:
- WireGuard ve local mode içinde de HTTP/3 kullanılabiliyor
- Örnek komut:
mitmproxy --mode wireguard mitmproxy --mode local
- Örnek komut:
- Uyumluluk sorunlarını azaltmak için Firefox, Chrome, çeşitli cURL derlemeleri ve diğer istemcilerle test edildi
- HTTP/3 desteği çalışması 2022’de Manuel Meitinger ve Maximilian Hils tarafından başlatıldı ve mitmproxy 11’de varsayılan olarak etkinleştirildi
Chrome’un QUIC sertifika kısıtı
- Şu anda bilinen başlıca kısıt, Chrome’un QUIC üzerinde kullanıcının eklediği Certificate Authority’lere güvenmemesi
- Chrome’da HTTP/3 trafiğini işlemek için aşağıdakilerden biri gerekiyor
- Let’s Encrypt gibi herkese açık şekilde güvenilen bir sertifika sağlamak
- Chrome’u ilgili komut satırı anahtarları ile çalıştırmak
- HTTP/2’ye geri dönüş davranışını kabul etmek
- Firefox böyle bir davranış göstermiyor
- HTTP/3 sorun giderme ipuçlarına #7025 üzerinden ulaşılabilir
Hickory DNS tabanlı yeniden uygulama
- DNS HTTPS records ve Encrypted Client Hello(ECH) gibi gizlilik özellikleri ortaya çıktıkça, mitmproxy’nin DNS işleme katmanının önemi arttı
- Mevcut DNS uygulaması
getaddrinfokullandığı için sınırlamalara sahipti- Yalnızca IPv4 ve IPv6 adresleri için A/AAAA sorgularını destekliyordu
- HTTP/3 desteğini bildiren HTTPS records gibi sorgulara yanıt veremiyordu
- mitmproxy 11, DNS desteğini Rust tabanlı DNS kütüphanesi Hickory DNS üzerinde yeniden uyguluyor
- Hickory sayesinde Windows, Linux ve macOS’ta işletim sisteminin varsayılan ad sunucuları alınabiliyor ve A/AAAA dışındaki sorgular bu ad sunucularına iletiliyor
- Yeni
dns_name_serversseçeneği ile iletilecek ad sunucuları belirtilebiliyormitmdump --mode dns --set dns_name_servers=8.8.8.8
hosts dosyası kontrolü ve DNS-over-TCP
- Hickory geçişiyle birlikte sistem hosts dosyasını yok sayma seçeneği eklendi
- Yeni
dns_use_hosts_fileseçeneği ile Linux’ta/etc/hostsgibi hosts dosyalarının dikkate alınıp alınmayacağı kontrol edilebiliyor - mitmproxy’nin dahili DNS çözümlemesinin de Hickory’ye taşınması planlanıyor; sonrasında bu özellik, aynı makinede belirli alan adlarını şeffaf biçimde yeniden yönlendirirken faydalı olacak
- Şu anda hosts dosyası her zaman dikkate alındığı için, aynı makinedeki yeniden yönlendirme kurulumlarında mitmproxy kendi kendine özyineli bağlantı kurabilir
- Örnek davranış:
echo "192.0.2.1 mitmproxy.org" >> /etc/hosts mitmdump --mode dns dig @127.0.0.1 +short mitmproxy.org 192.0.2.1 mitmdump --mode dns --set dns_use_hosts_file=false dig @127.0.0.1 +short mitmproxy.org 3.161.82.13 - DNS varsayılan olarak UDP kullanır, ancak tek bir UDP paketine sığmayan kayıtları işlerken TCP gerekebilir
- mitmproxy 11, rastgele sorgu tiplerini destekledikçe mesaj boyutu ve TCP işlemenin önemi arttı; DNS-over-TCP de çalışıyor
ECH anahtarlarının kaldırılması ve sertifika üretimi
- mitmproxy, özel bir sertifika olmadığında geçerli bir sertifika oluşturmak için TLS ClientHello içindeki Server Name Indication(SNI) bilgisini kullanıyor
- SNI yoksa istemcinin güveneceği bir sertifika üretilemeyebilir
- Encrypted Client Hello(ECH), istemcinin DNS HTTPS records üzerinden ECH anahtarlarını aldıktan sonra ilk ClientHello el sıkışma mesajını bu anahtarlarla şifrelemesi yöntemidir
- DNS sorgusu ve el sıkışma birlikte şifrelenirse, pasif olmayan bir ortadaki adam hedef alan adını bilemez ve yalnızca hedef IP adresini görebilir
- Paylaşımlı barındırma ve Content Delivery Network ortamlarında yalnızca IP adresinden hedef alan adını kesin olarak belirlemek zordur
- Bu gizlilik iyileştirmesi, mitmproxy’nin sertifika üretim yöntemiyle çakışıyor
- mitmproxy 11, sertifika üretimi için gerekli alan adı bilgisini elde etmek amacıyla HTTPS records içinden ECH anahtarlarını kaldırıyor
- İstemci, ilk el sıkışma mesajını şifrelemek için gereken anahtarları elde edemiyor
- mitmproxy, hedef alan adını tespit edip buna uygun bir sertifika oluşturabiliyor
- ECH, mitmproxy kullanımını daha zor hale getirebilir; ancak web genelinde gizliliği artıran bir değişim olarak görülebilir
1 yorum
Hacker News görüşleri
Mitmproxy'nin hâlâ geliştiriliyor olduğunu görmek sevindirici. Bu araç dolaylı olarak kariyerimi şekillendirdi
2011'de mobil uygulama isteklerini yakalayıp API geliştirmeyi öğrenirken, Airbnb API'sinin Rails toplu atama açığına (https://github.com/rails/rails/issues/5228) maruz kaldığını fark ettim. Zararsız birkaç niteliği değiştirdikten sonra şirkete ulaştım; bu bir mülakata dönüştü ve sonrası kelimenin tam anlamıyla tarih oldu
Bazen mevcut bir uygulamaya mitmproxy bağlamak, dokümantasyonu okumaktan daha kolay oluyor
Chrome'un QUIC için kullanıcı tarafından eklenen sertifika otoritelerine güvenmemesi ilginç
Bağlantılı issue'da Chrome ekibi, “QUIC'i yakalayan yazılım/donanımın dağıtımını önlemek için herkese açık olarak güvenilmeyen sertifikaları açıkça izinli saymıyoruz. Aksi halde bu, uzun vadede QUIC protokolünün evrim geçirebilme yeteneğine zarar verir. Herkese açık güven zincirine sahip olmayan sertifikalara dayanan kullanım senaryoları QUIC yerine TLS+TCP kullanabilir” diyor
Protokol evrimini çok yakından takip etmiyorum ama özel sertifikaları engellemenin evrim geçirilebilirlik ile nasıl bağlantılı olduğunu pek anlamadım. Bunun nedenini bilen var mı merak ediyorum
Chrome'a hafif değiştirilmiş bir QUIC sürümü koyup bunu Youtube gibi yerlerde destekleyebilir, sonra da elde ettiği metriklerle “gerçek” standart değişikliklerini önerebilir ya da yalnızca kendi servislerinde özel sürümü çalıştırmaya devam edebilir
Özel sertifikalara izin verilirse, ZScaler ZIA gibi çözümlerle çalışan trafiğini ortadaki adam yöntemiyle inceleyen şirketler protokol değiştiğinde bozulma riski taşır. Veri akışı tamamen şifreli olup ara cihazlara kapalıysa Google neredeyse istediğini yapabilir
İlgili kavram: https://en.wikipedia.org/wiki/Protocol_ossification
Genişletilebilir protokollerde normalde yalnızca istemci ve sunucunun güncellenmesi yeterlidir; ama ara cihazlar varsa potansiyel olarak N tane cihazın da birlikte güncellenmesi gerekir. Kullanıcılar ve servis sağlayıcılar yeni özellikleri benimsemek için motive olabilir ama ara cihaz sahipleri olmayabilir. Sonuç olarak protokolün evrim geçirmesi zorlaşır
Uygulama ayrıntılarına sıkı sıkıya bağlı çok sayıda middleware vardı; bu yüzden küçük bir şeyi bile değiştirmek istemeden kullanıcı deneyimini bozabiliyordu. Görünüşe göre yeni sürümlerde benzer bir durumdan kaçınmak istiyorlar
HTTP/2 ya da HTTP/3 yalnızca ters proxy üzerinde desteklenip gerçek web sunucusunda desteklenmese bile fayda sağlar mı diye merak ediyorum
JS/Python/Ruby dünyasındaki ana akım framework'lerin çoğu yeni HTTP standartlarını desteklemiyor. O zaman web sunucusu, ters proxy bağlantısında darboğaz olmaz mı?
Ters proxy ile gerçek web sunucusu arasındaki bağlantı genelde çok daha hızlı ve kararlıdır; bu yüzden o kısmı HTTP/2 ya da HTTP/3'e yükseltmenin getirisi çok daha küçüktür
HTTP kullanıldığında bile ters proxy, backend'e gerçek uzak istemciden çok daha hızlı bağlanabilir. Bu yüzden yavaş kısımda HTTP/2 akışlarını kullanmak yine de avantajlıdır
Yerel makinede çalıştırılan, düşük seviye protokoller veya web güvenliğiyle ilgili testler yapmak için kullanılan bir araçtır
HTTP/2 ve sonrasında birden çok eşzamanlı istek tek bir bağlantı üzerinden işlenir
Hâlâ parmak izi sorunu var. Genel bir tarayıcının TLS el sıkışmasını taklit edebilene kadar, web'in yaklaşık %80'inde “Just a quick check...” ya da “Sorry, it looks like you're a bot” gibi sayfalar göreceksiniz
https://github.com/mitmproxy/mitmproxy/issues/4575
Hickory'den bahsettikleri için teşekkürler. İnsanların onunla neler yaptığını görmek her zaman eğlenceli ve iyi iş çıkarmışlar
Bunları yalnızca Python ile elde etmek normalde zor olurdu
Mitmproxy'nin Privoxy/Proxomitron/Yarip gibi kullanılıp kullanılamayacağını merak ediyorum
Örneğin Ungoogled Chromium ile gezinirken Mitmproxy'yi proxy olarak kullanıp belirli sitelerdeki script etiketlerini kaldırabilir miyim? Performansa etkisi ne olur?
Bir web sayfasını görüntülerken küçük gecikmeler yüzlerce kez birikirse hissedilebilir hâle gelebilir
Yine de bu kullanım senaryosuyla ilgilenenler için bir seçenek olabilir. Teknik olarak engelleyen bir şey yok
JavaScript dosyalarını yeniden yazarken alt kaynak bütünlüğü denetimlerini bozma riski küçük de olsa var; ama gerçekten sorun olursa hash'i de yeniden yazarak çözülebilir gibi görünüyor
mitmproxy, Fiddler'a alternatif olabilir mi?
https://docs.mitmproxy.org/stable/addons-overview/
Hm: https://github.com/mitmproxy/mitmproxy/issues/4170