CVE-2022-30522 ー Apache httpd「mod_sed」フィルターに関するサービス拒否 (DoS)の脆弱性
Apache HTTP Server内のmod_sedフィルターモジュールの脆弱性(CVE-2022-23943)について、バッファのサイズ計算を誤ることでサービス拒否(以下、DoS)が引き起こされる可能性があるという分析を今年3月に発表しました。
このApache httpdの脆弱性とそのパッチを分析したところ、修正によって問題は解決されたものの、新たな問題を引き起こす挙動が発生しているのではないかという疑いが浮上しました。その疑いは的中し、DoSを引き起こす別の要因があることが判明しました。 Apacheはこの脆弱性の深刻度を「低」と評価しましたが、NVDのCVSSスコアでは7.5(高)となりました。この CVE の深刻度に対する私たちの評価は「中」です。DoS の影響が大きい一方で、mod_sed
のインストールベースは稀であるためです。
Apacheのmod_sed
フィルターモジュールは、 サーバが受け取ったリクエストやその応答の入出力ストリームを操作する機能を提供し、基本的には GNU のストリームエディタツールである sedと同じ機能を提供します。入力フィルターとして HTTP POSTリクエストのボディに活用することができ、 出力フィルターとしてクライアントに送られる前にサーバーの応答の修正が可能です。
このブログ記事では、Apache HTTP Server CVE-2022-30522 の脆弱性の概要と修正方法に関するガイダンス、およびこの脆弱性に関する調査の一環として発見した緩和策について説明します。
Apache httpdの脆弱性 CVE-2022-30522とは?
CVE-2022-30522は、Apache HTTP Serverの mod_sed
モジュールに存在するDoSの脆弱性です。この脆弱性は、Apache httpd 2.4.53 のみで(CVE-2022-23943 の不完全なパッチに起因するため)、リクエストまたはレスポンスの編集にmod_sed
のフィルターを使用している場合に影響を及ぼします。
この Apache httpdの脆弱性は、ストリームバッファの処理中にメモリ割り当てを最適化しようとすることに起因しています。バッファが一定のサイズに達すると、メモリ割り当て関数を多数回呼び出すことを避けるために、バッファは倍増されていきます。大量のデータを送信する場合には、Apacheのメモリ制限を超えるため、プロセスが異常終了し、事実上DoSを引き起こします。
CVE-2022-30522の技術概要
Apache httpd mod_sed
フィルターモジュールは、オリジナルのGNUストリームエディタのように、 入力と出力のストリームを修正するための正規表現パターンを使用することを可能にします。このモジュールを使用するには、Apache httpdの設定ファイルを修正して、必要なフィルタを目的のルートやディレクトリに追加する必要があります。
以下の例は、リクエストのボディの各文字をZという文字に置き換えるパターンを使って、htmlファイルへのすべてのリクエストメソッドを編集するためにmod_sed
がどのように使用されるかを示しています。
mod_sed
がインストールされ、入力フィルターが設定されているときに2GB(2,147,483,648 byte)以上のデータを投稿されると、ハンドラーのプロセスが OUT_OF_MEMORY
のためにutil.c
でap_abort_on_oom()
を呼び出すという結果になりました。これはallocator_alloc
の失敗により発生し、要求されたアロケーションサイズがAPR_UINT32_MAX
より大きいため、NULLが返されます。その後、abort_on_oom
が呼び出されます。サーバーに2GB(またはそれ以上)のデータを要求した場合にも、以下に示すように同じ事象の連鎖が発生します。
この結果、DoSエラーが発生します。このタイプの POSTリクエストの後、処理プロセスは中止されます。単一のプロセスはウォッチドッグによって再起動されますが、複数のリクエストを送るとすべてのハンドラプロセスがクラッシュしてしまい、その結果完全なDoSとなり、サーバはリクエストを処理できなくなります。
これはgrow_buffer
が再割り当ての回数を避けるためにバッファのサイズを倍増させ、 その後apr_pcalloc
が要求されたバッファサイズ 4GBで呼ばれたために起こりました。
/* Avoid number of times realloc is called. It could cause huge memory
* requirement if line size is huge e.g 2 MB */
if (newsize < *cursize * 2) {
newsize = *cursize * 2;
}
/* Align it to 4 KB boundary */
newsize = (newsize + ((1 << 12) - 1)) & ~((1 << 12) - 1);
newbuffer = apr_pcalloc(pool, newsize);
2つのクラッシュフロー:
-
- 2GBのデータを投稿する場合、元のバッファのコピーは成功し、その末尾にNULLターミネータを追加することが要求されます。この場合、バッファのサイズが4GBの
allocator_alloc
の呼び出しは、バッファのサイズを1増やしてNULLのためのスペースを確保しようとした結果になります。これは、sed_finalize_eval
で起こります。 - 2GB以上のデータ、つまり2GB+1byteを投稿する際、対象の保持バッファを再割り当てしようとすると、元のバッファを丸ごとコピーできる前に同じことが起こります。この現象は
sed_eval_buffer
で発生します。
- 2GBのデータを投稿する場合、元のバッファのコピーは成功し、その末尾にNULLターミネータを追加することが要求されます。この場合、バッファのサイズが4GBの
この問題は出力フィルターにも関連してのでご注意ください。また、以下の構成ではサーバーから2GBを超えるファイルを要求した場合、同じ結果になります。
クラッシュの流れは、sed_response_filter
の代わりにsed_request_filter
のエントリポイントから発生することを除けば同様になります。
CVE-2022-30522の影響を受ける関係者とは?
CVE-2022-30522は、Apache HTTP Serverのバージョン2.4.53で、mod_sed
フィルターモジュールがリクエストまたはレスポンスの編集に使用されている場合に影響します。この問題は、バージョン 2.4.54で修正されました。
この場合、攻撃者はsedフィルターを使用するエンドポイントに大量のデータを送信するだけで、リモートから脆弱性を誘発することができますので、最も深刻な影響は mod_sed
がリクエストの編集に使用されている場合です。
以下は、上記に示した脆弱性のある設定の例です。
(InputSed
で定義されている実際のsedパターンは重要ではなく、空でないことが必要です)
CVE-2022-30522の影響とは?
この脆弱性を悪用するには、リクエストのボディに大量のデータ(2GB以上)を送信し、mod_sed
がそのデータを処理するように設定されていることが必要です。これにより、HTTPサーバーの1つのプロセスがDoSとなり、短時間のダウンタイムが発生します。サーバーへの複数のリクエストを長時間かけて行う攻撃は、サーバーの全プロセスが繰り返し停止し、あらゆるウェブページにアクセスできなくなるため、完全なDoSを引き起こす可能性があります。
CVE-2022-30522の修正方法とは?
この脆弱性を修正するためには、Apache httpdを最新版(現在2.4.54)にアップグレードすることが推奨されます。アップグレードが不可能な場合は、mod_sed
フィルターモジュールの本脆弱性を修正するパッチを適用することを強く推奨します。
CVE-2022-30522 に対する緩和策とは?
Apache HTTP Serverを最新版にアップグレードしたり、パッチを適用したりできない場合は、POSTメソッドのボディサイズを制限して、本脆弱性を誘発させないようにすることをお勧めします。そのためには、Apache httpdの設定ファイルで LimitRequestBody
ディレクティブを使用する必要があります。
このディレクティブは、0から始まり、最大2GBまでのデータのリクエストサイズに制限を設定するために使用されます。このように、1GBを超えるデータのPOSTリクエストボディを防ぐために、次のような制限を設定することが推奨されます。
LimitRequestBody 1073741824
ご注意:この緩和策は、クライアントからのリクエストによって引き起こされるDoSからの保護のみを提供し、mod_sed
がレスポンスを修正するために使用され、2GB以上のレスポンスがクライアントに送信された場合、サーバーがDoSに対して脆弱なままであることに注意してください。
JFrogセキュリティ・リサーチの最新情報
JFrogセキュリティ・リサーチチームからの最新の情報は、セキュリティ・リサーチのブログ記事やTwitter @JFrogSecurityからご覧ください。
JFrog Xrayで脆弱性のあるバージョンを探す
JFrog Xray SCAツールは、リサーチチームを通じて新しい脆弱性や脅威を明らかにするだけでなく、自動セキュリティスキャンにより、開発者やセキュリティチームが自社のソフトウェアに関連する最新のセキュリティインサイトへの簡単なアクセスを可能にします。