攻撃ベクトルを理解する
HashMapsのしくみ
ブログのコメントフォームがパラメータ(first_name、last_name、comment)を投稿パラメータとして受け入れると言います。内部的には、TomcatはこれらのパラメーターをHashMapとして格納します。
このHashMapの論理構造は次のようになります-
"first_name" --> "Sripathi"
"last_name" --> "Krishnan"
"comment" ---> "DoS using poor Hashes"
しかし、物理的な構造は異なります。キーは最初にhashCodeに変換され、次にhashCodeが配列インデックスに変換されます。
したがって、理想的な物理的構造は次のようになります。
0 --> "Sripathi"
1 --> "Krishnan"
2 --> "DoS using poor Hashes"
しかし、可能なキーは無限です。したがって、ある時点で、2つのキーが同じハッシュコードを持つようになります。これはハッシュ衝突になります。
衝突があると、物理的構造は次のようになります。
0 --> "Sripathi", "Krishnan"
1 --> Empty
2 --> "DoS using poor hashes"
ハッシュ衝突とパフォーマンスへの影響
ハッシュの衝突がある場合、新しいエントリを挿入するということは、単一のハッシュ「バケット」内のすべての要素を順番に繰り返して、マップにすでに存在するかどうかを確認することを意味します。すべての要素が同じ値にハッシュされる場合、1つの要素を挿入するとO(n)の複雑さに近づく可能性があります。この最悪の場合にn個の要素を挿入すると、O(n * n)の複雑さになります。
つまり、同じhashCodeを持つ数千のキーを挿入すると、サーバーは多くのCPUサイクルを必要とします。
同じハッシュでどのようにキーを生成しますか?
Javaでは、「Aa」と「BB」のハッシュコードは同じです。
「EquivalentSubstrings」というプロパティがあるため、これら2つの文字列から始めるだけで、同じハッシュコードで他のいくつかの文字列を生成できます。
最初の反復:「AAAA」、「AABb」、「BbAA」、「BbBb」は同じハッシュコードを持ちます
これで、同じハッシュコードを持つ4つの文字列ができました。それらを並べ替えて、同じハッシュコードを持つ16個の文字列を生成できます。例えば :
"AaAaAaAa", "AaAaBBBB", "AaAaAaBB", "AaAaBBAa",
"BBBBAaAa", "BBBBBBBB", "BBBBAaBB", "BBBBBBAa",
"AaBBAaAa", "AaBBBBBB", "AaBBAaBB", "AaBBBBAa",
"BBAaAaAa", "BBAaBBBB", "BBAaAaBB", "BBAaBBAa",
これらの16個の文字列はすべて同じハッシュコードを持っています。
これで、これらの16個の文字列を取得して、同じハッシュコードを持つ256個の文字列を生成できます。
つまり、正確なハッシュコードを持つ文字列の大規模なセットを生成するのは非常に簡単です。
サーバーをどのように攻撃しますか?
- 同じハッシュコードを持つ何千もの文字列を作成します(上記を参照)
- 次のようなPOSTリクエストを作成します-AaAa=&AaBB =&BBAa =&BBBB=...。
- フォームを送信する
- ループで繰り返し、すべてのサーバーリソースが使い果たされるように、いくつかのスレッドを作成します
これは単なるPOSTリクエストであるため、攻撃者は無実のブラウザを使用してサーバーを攻撃することもできます。クロスサイトスクリプティングの脆弱性があるWebサイトを見つけ、POSTリクエストを行うためのコードを埋め込んでから、ソーシャルエンジニアリングを使用してリンクをできるだけ多くのユーザーに広めます。
防止
一般に、基盤となるプラットフォームはこれを修正できません。これは、アプリケーションフレームワークの問題と見なされます。つまり、TomcatはOracle / Sunではなく、これを修正する必要があります。
考えられる修正は次のとおりです。
POSTパラメータの数を制限する-Tomcat6.0.35+には新しいパラメータmaxParameterCountがあります。デフォルト値は10,000です。機能を損なわない限り、低いほど良いです。
POSTリクエストのサイズを制限する-攻撃が機能するためには、ペイロードが巨大である必要があります。Tomcatで許可されるデフォルトのPOSTは2MBです。これを200KBに減らすと、この攻撃の効果が低下します。tomcatのパラメータはmaxPostSizeです
Webアプリケーションファイアウォール-Webアプリケーションファイアウォールがある場合は、疑わしいと思われるリクエストをブロックするように設定できます。これは事後対応策ですが、上記の解決策のいずれかを使用できない場合に備えておくと便利です。
参考までに-Tomcatのドキュメントはこちら-http://tomcat.apache.org/tomcat-6.0-doc/config/http.html