サーバーの遅い読み取りの脆弱性

ご挨拶。

Qualysでのフリータイムに私が手を出したことをお伝えしたいと思います。 英語圏のインターネットは、Slow Read DoS攻撃に関して驚くほど多くのノイズを持っているので、ここで多くの有用な批判と実践的な提案を得ると確信しています。



2011年8月、彼はプログラムslowhttptestを作成しました 。このプログラムは、slowlorisやslow HTTP Postなどの遅いHTTPリクエストの処理に関連する脆弱性についてWebサーバーをテストします。 目標は、開発者の作業を促進し、概念実証のエクスプロイトの大部分が記述されているPythonを選ぶのではなく、効果的な防御の作成に集中できるようにする構成可能なツールを作成することです。



そして、HTTP応答のクライアントによる遅い読み取りに対するサーバーの反応を試すことにしました。 驚くべきことに、彼らは不十分に反応します。 デフォルトのApache、nginx、lightpd、IISは強打でサービスを拒否しました。



そして本質はこれです:



サーバープログラムがリソースを送信する接続にカーネルが割り当てた送信バッファーよりも大きいWebサーバー上のリソースを見つけた場合、何らかの方法でカーネルがすべてのデータを受け入れないようにすると、サーバーは残りのデータを送信しようとします接続キューのサイズ、プロセッサ時間、メモリ、およびシステム管理者の空き時間。 このような接続がキュー全体(サーバー)を詰まらせると、それに応じて高速クライアントへのサービスを拒否し始めます。



カーネルをこのように動作させるのは非常に簡単で、2008年にSockstressメソッドのOutpost24から説明されました。たとえば、TCPパケットでウィンドウサイズ0を送信します。 クライアントにはデータを受信する場所がありません。 TCP設計は、遅い接続とデッド接続を制御するために、カーネルではなくアプリケーションが必要であることを正しく暗示しています。 しかし、4年間、誰も指を持ち上げませんでした。



Sockstressは手動でパケットを作成し、次の確認をいつ送信するかを計算します。そのため、サーバー上の永続タイマーをリセットしないように、要するに困難です。

私の学生は私の方法を実践することさえできます:

たとえば、ソケットを作成し、クライアントで比較的小さな受信バッファーサイズを設定し、完全に一貫した通常のHTTP要求を100Kbの画像に送信します。 サーバーはメモリから写真を撮影し、ネットワークに転送するカーネルを提供します。 サーバーは写真の一部を取り、それを送信し、クライアントは最初の1000バイトを受信し、停止します、場所がないと言います。 サーバーはソケットをポーリングし、いつ記録の準備ができるかを理解しようとしますが、準備ができていません! 1分に1回、クライアント受信バッファーから数バイトを読み取り、TCPスタックがゼロ以外のものを送信することにより、ファイアウォールとIDSのライブ接続の外観を作成します。



以上です。 ロシア語での最初のテクニカルポストである、あまりキックしないようお願いしますが、私はそれが好きで、私はholdしませんでした。 詳細な説明はここにあります

PS前のバージョンについては、slowhttptestはロシア語でwikiを書きました。少なくとも1人の魂が興味を持っているなら、私は新しいバージョンに翻訳します。



更新:

ModSecurityは警告し、保護する方法を詳細に示します。

今週のModSecurity高度なトピック:「スローリード」サービス拒否攻撃の軽減

アップデート2:

Semyは、BSDでのビルドエラーを指摘しました。 SVNで修正されました。



All Articles