Mitmproxy 11: पूर्ण HTTP/3 सपोर्ट
(mitmproxy.org)- QUIC और HTTP/3 ट्रैफ़िक का हिस्सा बढ़ने के साथ mitmproxy 11 में HTTP/3 डिफ़ॉल्ट रूप से enabled है, जिससे आधुनिक वेब ट्रैफ़िक के विश्लेषण का दायरा बढ़ता है
- transparent proxy और reverse proxy के साथ-साथ WireGuard और local mode में भी HTTP/3 काम करता है, इसलिए इसे अलग-अलग capture environments में इस्तेमाल किया जा सकता है
- Chrome, QUIC में यूज़र द्वारा जोड़ी गई Certificate Authority पर भरोसा नहीं करता, इसलिए public trusted certificate, command-line switch, या HTTP/2 fallback में से एक चुनना पड़ता है
- DNS implementation अब Hickory DNS पर आधारित है और A/AAAA के अलावा queries, HTTPS records, DNS-over-TCP, hosts file control, और ECH key removal को संभालती है
- ECH जैसी privacy features man-in-the-middle proxy के certificate generation flow को कठिन बनाती हैं, लेकिन mitmproxy DNS responses को adjust करके काम करने की क्षमता बनाए रखता है
HTTP/3 सपोर्ट का दायरा
- mitmproxy 11, HTTP/3 को transparent proxy और reverse proxy mode में सपोर्ट करता है
- reverse proxy में एक mitmproxy instance TCP और UDP packets दोनों receive करता है और आगे भेजे जाने वाले HTTP version को संभालता है
- उदाहरण कमांड:
mitmproxy --mode reverse:https://http3.is
- उदाहरण कमांड:
- WireGuard और local mode में भी HTTP/3 इस्तेमाल किया जा सकता है
- उदाहरण कमांड:
mitmproxy --mode wireguard mitmproxy --mode local
- उदाहरण कमांड:
- Firefox, Chrome, कई cURL builds और अन्य clients के साथ test करके compatibility issues कम किए गए हैं
- HTTP/3 support पर काम 2022 में Manuel Meitinger और Maximilian Hils ने शुरू किया था, और mitmproxy 11 में यह डिफ़ॉल्ट रूप से enabled है
Chrome में QUIC certificate constraints
- इस समय ज्ञात मुख्य limitation यह है कि Chrome, QUIC में यूज़र द्वारा जोड़ी गई Certificate Authority पर भरोसा नहीं करता
- Chrome में HTTP/3 ट्रैफ़िक संभालने के लिए इनमें से एक ज़रूरी है
- Let’s Encrypt जैसे publicly trusted certificate उपलब्ध कराना
- Chrome को संबंधित command-line switches के साथ चलाना
- HTTP/2 में fallback होने वाले behavior को स्वीकार करना
- Firefox ऐसा behavior नहीं दिखाता
- HTTP/3 troubleshooting tips #7025 में देखे जा सकते हैं
Hickory DNS आधारित पुनर्निर्माण
- DNS HTTPS records और Encrypted Client Hello(ECH) जैसी privacy features के आने से mitmproxy में DNS handling का महत्व बढ़ गया है
- पुरानी DNS implementation
getaddrinfoका उपयोग करती थी, इसलिए उसकी सीमाएँ थीं- यह केवल IPv4 और IPv6 addresses के लिए A/AAAA queries सपोर्ट करती थी
- यह HTTP/3 support की सूचना देने वाले HTTPS records जैसी queries का जवाब नहीं दे सकती थी
- mitmproxy 11, DNS support को Rust-आधारित DNS library Hickory DNS के ऊपर फिर से implement करता है
- Hickory के जरिए Windows, Linux, और macOS पर operating system के default nameservers प्राप्त किए जाते हैं, और A/AAAA के अलावा queries को उन nameservers पर forward किया जाता है
- नया
dns_name_serversoption forward किए जाने वाले nameservers को निर्धारित कर सकता हैmitmdump --mode dns --set dns_name_servers=8.8.8.8
hosts file control और DNS-over-TCP
- Hickory पर switch के साथ system hosts file को ignore करने का option जोड़ा गया है
- नया
dns_use_hosts_fileoption इस्तेमाल करके Linux के/etc/hostsजैसी hosts files को लागू करना है या नहीं, इसे नियंत्रित किया जा सकता है - mitmproxy की internal DNS resolution को भी Hickory पर ले जाने की योजना है, और उसके बाद एक ही machine पर किसी specific domain को transparent redirect करते समय यह feature उपयोगी होगा
- अभी hosts file को हमेशा consider किया जाता है, इसलिए same-machine redirect setup में mitmproxy recursive रूप से खुद से connect हो सकता है
- उदाहरण behavior:
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 डिफ़ॉल्ट रूप से UDP का उपयोग करता है, लेकिन ऐसे records को संभालने के लिए TCP की ज़रूरत पड़ सकती है जो एक single UDP packet में फिट नहीं होते
- mitmproxy 11, arbitrary query types को सपोर्ट करते हुए message size और TCP handling के महत्व को बढ़ाता है, और DNS-over-TCP भी काम करता है
ECH key removal और certificate generation
- mitmproxy, custom certificate न होने पर TLS ClientHello के Server Name Indication(SNI) का उपयोग करके वैध certificate बनाता है
- अगर SNI न हो, तो ऐसा certificate बनाना संभव नहीं हो सकता जिस पर client भरोसा करे
- Encrypted Client Hello(ECH) एक तरीका है जिसमें client, DNS HTTPS records से ECH key लेने के बाद शुरुआती ClientHello handshake message को उसी key से encrypt करता है
- अगर DNS query और handshake दोनों encrypted हों, तो passive man-in-the-middle target domain नहीं जान सकता और केवल target IP address देख सकता है
- shared hosting और Content Delivery Networks में सिर्फ IP address से target domain तय करना मुश्किल होता है
- यह privacy improvement, mitmproxy के certificate generation तरीके से टकराती है
- mitmproxy 11, HTTPS records से ECH key को हटाकर certificate generation के लिए ज़रूरी domain information हासिल करता है
- client को शुरुआती handshake message को encrypt करने के लिए key नहीं मिलती
- mitmproxy target domain को पहचान सकता है और उससे मेल खाता certificate बना सकता है
- ECH, mitmproxy का उपयोग अधिक कठिन बना सकता है, लेकिन इसे पूरे वेब की privacy बढ़ाने वाले बदलाव के रूप में भी देखा जा सकता है
1 टिप्पणियां
Hacker News की राय
अच्छा लगा कि Mitmproxy अभी भी विकसित हो रहा है। इस टूल ने अप्रत्यक्ष रूप से मेरा करियर बना दिया
2011 में मोबाइल ऐप requests intercept करते हुए API development सीख रहा था, तभी पाया कि Airbnb API Rails mass assignment vulnerability (https://github.com/rails/rails/issues/5228) के लिए exposed था। कुछ harmless attributes बदलकर देखने के बाद कंपनी से संपर्क किया, और उससे interview मिला; उसके बाद की कहानी तो इतिहास है
कभी-कभी docs पढ़ने से ज्यादा आसान होता है कि मौजूदा implementation के साथ mitmproxy जोड़कर देखा जाए
यह हिस्सा दिलचस्प है कि Chrome QUIC में user-added certificate authorities पर भरोसा नहीं करता
linked issue में Chrome team कहती है, “QUIC interception software/hardware की deployment रोकने के लिए हम publicly untrusted certificates को स्पष्ट रूप से allow नहीं करते। वरना long term में QUIC protocol के evolve होने की संभावना को नुकसान पहुंचेगा। जिन use cases में publicly trusted certificates के अलावा certificates पर निर्भरता है, वे QUIC की जगह TLS+TCP इस्तेमाल कर सकते हैं”
मैं protocol evolution को follow नहीं करता, लेकिन custom certificates को रोकना evolvability से कैसे जुड़ता है, यह समझ नहीं आ रहा। किसी को वजह पता है?
Chrome में थोड़ा modified QUIC version डालकर Youtube जैसी जगहों पर support कर सकता है, फिर metrics के आधार पर “real” standard change propose कर सकता है या अपनी services में ही special version चलाता रह सकता है
custom certificates allow करने पर ZScaler ZIA जैसी चीजों से employee traffic को middleman तरीके से inspect करने वाली companies के protocol changes पर टूटने का जोखिम होगा। अगर data stream पूरी तरह encrypted होकर middle equipment के लिए opaque है, तो Google लगभग जो चाहे कर सकता है
संबंधित concept: https://en.wikipedia.org/wiki/Protocol_ossification
extensible protocols में आम तौर पर सिर्फ client और server को upgrade करना होता है, लेकिन middleboxes हों तो संभावित रूप से N devices को भी साथ में update करना पड़ता है। users और service providers के पास नई features adopt करने की motivation होती है, लेकिन middlebox owners के पास शायद न हो। नतीजा यह कि protocol evolve करना कठिन हो जाता है
बहुत सा middleware implementation details पर मजबूती से निर्भर था, इसलिए कुछ छोटा बदलने पर अनजाने में user experience टूटना आसान था। नए version में शायद ऐसी स्थिति से बचने की कोशिश है
सोच रहा हूं कि HTTP/2 या HTTP/3 अगर सिर्फ reverse proxy में supported हों और actual web server में न हों, तब भी फायदा है क्या
JS/Python/Ruby के ज्यादातर mainstream frameworks नए HTTP standards support नहीं करते। तो क्या web server reverse proxy connection का bottleneck नहीं बन जाएगा?
reverse proxy और actual web server के बीच connection आम तौर पर काफी तेज और stable होता है, इसलिए उस हिस्से को HTTP/2 या HTTP/3 पर ले जाने से मिलने वाला फायदा बहुत कम होता है
HTTP इस्तेमाल होने पर भी, reverse proxy actual remote client की तुलना में backend से कहीं तेजी से connection बना सकता है। इसलिए slow segment में HTTP/2 streams इस्तेमाल करना अब भी फायदेमंद है
यह local machine पर चलाकर low-level protocol या web security से जुड़े tests करने का tool है
HTTP/2 और उससे ऊपर में कई concurrent requests को एक ही connection पर handle किया जाता है
अभी भी fingerprinting की समस्या बची है। जब तक यह typical browser के TLS handshake की नकल नहीं कर पाता, web के लगभग 80% हिस्से पर “Just a quick check...” या “Sorry, it looks like you're a bot” जैसे pages दिखेंगे
https://github.com/mitmproxy/mitmproxy/issues/4575
Hickory का जिक्र करने के लिए धन्यवाद। लोग उससे क्या बना रहे हैं, यह देखना हमेशा मजेदार होता है, और काम अच्छी तरह किया गया है
ये चीजें शायद सिर्फ Python से पाना मुश्किल होता
सोच रहा हूं कि Mitmproxy को Privoxy/Proxomitron/Yarip की तरह इस्तेमाल किया जा सकता है क्या
उदाहरण के लिए Ungoogled Chromium में browsing करते समय Mitmproxy को proxy बनाकर, किसी खास site के script tags हटाए जा सकते हैं? performance पर क्या असर होगा?
web page देखते समय छोटी latency सैकड़ों बार जुड़कर महसूस हो सकती है
फिर भी इस तरह के use case में रुचि रखने वालों के लिए यह एक option हो सकता है। technically कोई रोक नहीं है
JavaScript files rewrite करते समय subresource integrity checks से छेड़छाड़ होने का छोटा risk है, लेकिन अगर सच में issue आया तो hashes भी rewrite करके शायद हल किया जा सकता है
क्या mitmproxy Fiddler का alternative हो सकता है?
https://docs.mitmproxy.org/stable/addons-overview/
हम्म: https://github.com/mitmproxy/mitmproxy/issues/4170