
HTTP Garden は、組み合わせ可能なように設定された HTTP サーバーとプロキシのコレクションであり、それらと対話して脆弱性の発見をはるかに簡単にするスクリプトも含まれています。HTTP Garden で見つけられる脆弱性のクールなデモについては、私たちの ShmooCon 2024 トーク をご覧ください。
このプロジェクトを可能にしてくれた Galois、Trail of Bits、Narf Industries、Dartmouth College の友人たちに感謝します。
この資料は、契約番号 HR0011-19-C-0076 に基づき、国防高等研究計画局(DARPA)の支援を受けた作業に基づいています。
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 出力に表示されないようにしていることに注意してください。)
チャンク化されたメッセージボディ内で裸の 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 | | | | | | | | | | | | |
|-| | 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 から除外した注目すべき項目の説明です。
Garden が見つけたバグの完全なリストについては、TROPHIES.md を参照してください。
| 名前 | 理由 |
|---|
| 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 標準ライブラリを使用していますが、これは Garden に既に含まれています。 |
| Caddy | HTTP 解析に Go 標準ライブラリを使用していますが、これは 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 標準ライブラリの単なるフォークです。 |
| uwsgi | チャンク化されたメッセージボディをサポートしていません。 |