
HTTP कार्यान्वयन के लिए विभेदक परीक्षण ढांचा
The HTTP Garden, HTTP सर्वरों और प्रॉक्सियों का एक संग्रह है, जिन्हें संयोजनीय (composable) बनाने के लिए कॉन्फ़िगर किया गया है। साथ ही, इसमें उनके साथ इंटरैक्ट करने के लिए स्क्रिप्ट भी शामिल हैं, जिससे कमज़ोरियों को खोजना बहुत बहुत आसान हो जाता है। HTTP Garden के साथ खोजी जा सकने वाली कमज़ोरियों के कुछ शानदार डेमो के लिए, हमारी ShmooCon 2024 वार्ता देखें।
हम इस प्रोजेक्ट को संभव बनाने के लिए Galois, Trail of Bits, Narf Industries, और Dartmouth College में अपने मित्रों को धन्यवाद देना चाहते हैं।
यह सामग्री रक्षा उन्नत अनुसंधान परियोजना एजेंसी (DARPA) द्वारा अनुबंध संख्या HR0011-19-C-0076 के तहत समर्थित कार्य पर आधारित है।
pip के साथ) या अपने सिस्टम पैकेज मैनेजर से प्राप्त कर सकते हैं:docker
pyyaml
tqdm
यदि आप Python पैकेज अपने सिस्टम पैकेज मैनेजर से इंस्टॉल कर रहे हैं, तो ध्यान रखें कि सिस्टम के आधार पर पैकेज नामों के आगे py3-, python3-, या python- उपसर्ग लगाने की आवश्यकता हो सकती है।
./garden.sh start --build gunicorn hyper nginx haproxy
./garden.sh repl
garden> payload 'GET / HTTP/1.1\r\nHOST: a\r\n\r\n' | transduce haproxy | fanout | grid
'GET / HTTP/1.1\r\nHOST: a\r\n\r\n'
⬇️ haproxy
'GET / HTTP/1.1\r\nhost: a\r\n\r\n'
gunicorn: [
HTTPRequest(
method=b'GET', uri=b'/', version=b'1.1',
headers=[
(b'host', b'a'),
],
body=b'',
),
]
hyper: [
HTTPRequest(
method=b'GET', uri=b'/', version=b'1.1',
headers=[
(b'host', b'a'),
],
body=b'',
),
]
nginx: [
HTTPRequest(
method=b'GET', uri=b'/', version=b'1.1',
headers=[
(b'host', b'a'),
(b'content-length', b''),
(b'content-type', b''),
],
body=b'',
),
]
g
u
n
i h n
c y g
o p i
r e n
n r x
+-----
gunicorn|✓ ✓ ✓
hyper | ✓ ✓
nginx | ✓
ऐसा लगता है कि वे सभी सहमत हैं। (ध्यान दें कि भले ही Nginx ने content-length और content-type हेडर जोड़े हों, Garden इस बात से अवगत है और इस महत्वहीन विसंगति को grid आउटपुट में दिखने नहीं देता।)
आइए एक ऐसा payload आज़माएँ जो chunked मैसेज बॉडी में केवल LF लाइन एंडिंग का उपयोग करता है। यह स्पेक में अनुमति नहीं है।
garden> payload 'POST / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: chunked\r\n\r\n0\n\r\n' | fanout | grid
gunicorn: [
HTTPResponse(version=b'1.1', method=b'400', reason=b'Bad Request'),
]
hyper: [
]
nginx: [
HTTPRequest(
method=b'POST', uri=b'/', version=b'1.1',
headers=[
(b'transfer-encoding', b'chunked'),
(b'host', b'a'),
(b'content-length', b'0'),
(b'content-type', b''),
],
body=b'',
),
]
g
u
n
i h n
c y g
o p i
r e n
n r x
+-----
gunicorn|✓ ✓ X
hyper | ✓ X
nginx | ✓
ठीक है, तो Gunicorn ने 400 का जवाब दिया, Hyper ने कोई जवाब नहीं दिया, और Nginx ने अनुरोध स्वीकार कर लिया। यह Nginx के लेखकों द्वारा स्पेक का उल्लंघन है, जिसे वे ठीक करने की परवाह नहीं करते।
आपने शायद यह भी देखा होगा कि भले ही Gunicorn और Hyper का जवाब बिल्कुल एक जैसा नहीं था, फिर भी पहले grid आउटपुट में वे सहमत दिखाई दिए। ऐसा इसलिए है क्योंकि उनकी प्रतिक्रियाएँ मूलतः समतुल्य हैं (संदेश की अस्वीकृति), और Garden इस बात को ध्यान में रखता है।
imagesimages निर्देशिका में Garden के प्रत्येक HTTP सर्वर और ट्रांसड्यूसर के लिए एक उपनिर्देशिका होती है। प्रत्येक लक्ष्य को अपनी स्वयं की Docker इमेज मिलती है। जब संभव हो, सभी प्रोग्राम स्रोत कोड से बनाए जाते हैं। ताकि हम प्रत्येक लक्ष्य के कई संस्करण आसानी से बना सकें, सभी लक्ष्यों को एक रिपॉजिटरी URL (APP_REPO), ब्रांच नाम (APP_BRANCH), और कमिट हैश (APP_VERSION) के साथ पैरामीट्रिज़्ड किया जाता है।
toolstools निर्देशिका में वे स्क्रिप्ट होती हैं जिनका उपयोग सर्वरों के साथ इंटरैक्ट करने के लिए किया जाता है। इसमें आपको मिलेंगे
probe_quirks.py: परीक्षण के तहत सिस्टमों में हानिरहित HTTP पार्सिंग क्वर्क्स को सूचीबद्ध करने के लिए एक स्क्रिप्ट, जिन्हें फ़ज़िंग के दौरान अनदेखा किया जाना है,repl.py: HTTP Garden के लिए प्राथमिक उपयोगकर्ता इंटरफ़ेस,update.py: docker-compose.yml में कमिट हैश अपडेट करने के लिए एक स्क्रिप्ट,|-| | aiohttp | | apache_httpd | | apache_tomcat | | appweb | | aws_c_http | | cpp_httplib | | eclipse_grizzly | | eclipse_jetty | | fasthttp | | go_stdlib | | gunicorn | | h2o | | haproxy_fcgi | | hyper | | hypercorn | | ktor | | libevent | | libmicrohttpd | | libsoup | | lighttpd | | mongoose | | netty | | nginx | | node_stdlib | | openbsd_httpd | | openlitespeed | | openwrt_uhttpd | | protocol_http1 | | puma | | tornado | | twisted | | undertow | | uvicorn | | waitress | | webrick | | yahns |
|-| | apache_httpd_proxy | | apache_traffic_server | | envoy | | go_stdlib_proxy | | h2o_proxy | | haproxy | | lighttpd_proxy | | nghttpx | | nginx_proxy | | openlitespeed_proxy | | pound | | squid | | varnish | | yahns_proxy |
निम्नलिखित Garden से कुछ उल्लेखनीय अपवादों के स्पष्टीकरण हैं:
| नाम | तर्क |
|---|---|
| Microsoft का कोई भी उत्पाद | MSRC ने हमें बताया "HTTP स्मगलिंग को कमज़ोरी नहीं माना जाता," और मुझे Microsoft की मदद करने की कोई विशेष आवश्यकता महसूस नहीं होती। |
| unicorn | yahns के समान HTTP पार्सर का उपयोग करता है। |
| SwiftNIO | HTTP पार्सिंग के लिए llhttp का उपयोग करता है, जिसे पहले से ही node_stdlib द्वारा कवर किया जाता है। |
| Bun | HTTP पार्सिंग के लिए picohttpparser का उपयोग करता है, जिसे पहले से ही h2o द्वारा कवर किया जाता है। |
| Deno | HTTP पार्सिंग के लिए hyper का उपयोग करता है, जो पहले से ही Garden में है। |
| Daphne | HTTP पार्सिंग के लिए twisted का उपयोग करता है, जो पहले से ही Garden में है। |
| pitchfork | yahns के समान पार्सर का उपयोग करता है। |
| nghttpx | HTTP पार्सिंग के लिए lhttp का उपयोग करता है, जिसे पहले से ही node_stdlib द्वारा कवर किया जाता है। |
| Cheroot | हमारी रिपोर्टों को अनदेखा करता है। |
| CherryPy | HTTP पार्सिंग के लिए cheroot का उपयोग करता है। |
| libhttpserver | HTTP पार्सिंग के लिए libmicrohttpd का उपयोग करता है, जो पहले से ही Garden में है। |
| Werkzeug | HTTP पार्सिंग के लिए CPython stdlib का उपयोग करता है, जो पहले से ही Garden में है। |
Garden द्वारा खोजे गए बगों की पूरी सूची के लिए TROPHIES.md देखें।
| Caddy | HTTP पार्सिंग के लिए Go stdlib का उपयोग करता है, जो पहले से ही Garden में है। |
| Tengine | Nginx के HTTP पार्सर का उपयोग करता है। |
| OpenResty | Nginx के HTTP पार्सर का उपयोग करता है। |
| Google Cloud Global External Application Load Balancer | Envoy पर आधारित है। |
| Google Cloud Regional External Application Load Balancer | Envoy पर आधारित है। |
| Phusion Passenger | HTTP पार्सिंग के लिए llhttpd का उपयोग करता है, जिसे पहले से ही node_stdlib द्वारा कवर किया जाता है। |
| passim | HTTP पार्सिंग के लिए libsoup का उपयोग करता है, जो पहले से ही Garden में है। |
| boa | अनुरक्षण नहीं किया जाता। |
| Ulfius | libmicrohttpd का उपयोग करता है, जो पहले से ही Garden में है। |
| Vultr Load Balancer | यह केवल HAProxy है, जो पहले से ही Garden में है। |
| VMWare Avi Load Balancer | यह केवल Nginx है, जो पहले से ही Garden में है। |
| Sanic | httptools का उपयोग करता है, जिसे पहले से ही Uvicorn द्वारा कवर किया जाता है। |
| CPython http.server | प्रोडक्शन उपयोग के लिए अभिप्रेत नहीं है। |
| openjdk_stdlib | कोई सुसंगत कमज़ोरी प्रकटीकरण चैनल प्रदान नहीं करता। |
| dart_stdlib | पिछली रिपोर्टों को अनदेखा किया। |
| eventlet | HTTP लाइब्रेरी CPython stdlib वाली लाइब्रेरी का एक फ़ोर्क मात्र है। |
| uwsgi | चंक्ड मैसेज बॉडी का समर्थन नहीं करता। |