
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 |