CVE-2022-30522 ー Apache httpd「mod_sed」フィルターに関するサービス拒否 (DoS)の脆弱性

Apache DoS Vulnerability CVE-2022-30522

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がどのように使用されるかを示しています。

Example

mod_sedがインストールされ、入力フィルターが設定されているときに2GB(2,147,483,648 byte)以上のデータを投稿されると、ハンドラーのプロセスが OUT_OF_MEMORYのためにutil.cap_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);

(sed1.c:103)

2つのクラッシュフロー:

    1. 2GBのデータを投稿する場合、元のバッファのコピーは成功し、その末尾にNULLターミネータを追加することが要求されます。この場合、バッファのサイズが4GBのallocator_allocの呼び出しは、バッファのサイズを1増やしてNULLのためのスペースを確保しようとした結果になります。これは、sed_finalize_evalで起こります。Example
    2. 2GB以上のデータ、つまり2GB+1byteを投稿する際、対象の保持バッファを再割り当てしようとすると、元のバッファを丸ごとコピーできる前に同じことが起こります。この現象はsed_eval_bufferで発生します。Example

この問題は出力フィルターにも関連してのでご注意ください。また、以下の構成ではサーバーから2GBを超えるファイルを要求した場合、同じ結果になります。

Example

クラッシュの流れは、sed_response_filterの代わりにsed_request_filterのエントリポイントから発生することを除けば同様になります。
Example

CVE-2022-30522の影響を受ける関係者とは?

CVE-2022-30522は、Apache HTTP Serverのバージョン2.4.53で、mod_sedフィルターモジュールがリクエストまたはレスポンスの編集に使用されている場合に影響します。この問題は、バージョン 2.4.54で修正されました。
この場合、攻撃者はsedフィルターを使用するエンドポイントに大量のデータを送信するだけで、リモートから脆弱性を誘発することができますので、最も深刻な影響は mod_sed がリクエストの編集に使用されている場合です。
以下は、上記に示した脆弱性のある設定の例です。

Example
(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ツールは、リサーチチームを通じて新しい脆弱性や脅威を明らかにするだけでなく、自動セキュリティスキャンにより、開発者やセキュリティチームが自社のソフトウェアに関連する最新のセキュリティインサイトへの簡単なアクセスを可能にします。