CivetWebのHTTP/2に脆弱性、修正版は未確認
組み込み用Webサーバー「CivetWeb」の1.16以前でHTTP/2を有効にしていると、認証なしの遠隔からアクセス制御の判定を狂わされたり、サーバーを落とされたりするおそれがあります。該当するかを確認し、HTTP/2を使っていなければ無効にしてください。
急ぎ度: 早めに
CVSS v3は8.1、v4は9.2で認証なしにネットワークから狙えますが、影響はHTTP/2を有効にしたビルドと設定に限られ、修正版も示されていないため、まず該当確認と無効化を急ぐ段階です。
関係があるか
CivetWebをHTTP/2対応でビルドし、設定でも有効にしている環境が対象です。単体のWebサーバーとして動かしている場合のほか、自社アプリや機器に組み込んで外部に公開している場合も含みます。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| CivetWeb | 1.16以前。USE_HTTP2を付けてビルドし、enable_http2をonにしている場合 | 修正版の版番号は示されていません |
確かめ方
- 1使っているCivetWebの版が1.16以前かを、ビルド元のソースやリリースの記録で確認します。
- 2ビルド時にUSE_HTTP2が指定されているかを、Makefileやビルドスクリプトで確認します。
- 3設定ファイルや起動オプションで、enable_http2がonになっているかを確認します。
- 4製品に組み込まれている場合は、ベンダーにCivetWebの利用有無と、HTTP/2を有効にしているかを問い合わせます。
何が起きたか
HTTP/2を有効にしたCivetWebに、すでに解放されたメモリを参照し続けてしまう脆弱性が見つかりました。悪用されると、アクセス制御が見るリクエストのメソッドやパスが本来の内容と食い違ったり、サーバーが異常終了したりします。
原因はhandle_http2()が、解放済みの:methodと:pathのポインターを保持したままにしていることです。種類はCWE-416のuse-after-freeにあたります。後続のHEADERSフレームでこれらの疑似ヘッダーが省かれたとき、古い状態が使われてしまいます。
報告者としてPuH4ck3rXとLee Keon-Hyeongの名前が挙がっており、プロジェクトのGitHubではIssue #1379で扱われています。
攻撃の流れ
-
1
HTTP/2で接続
HTTP/2が有効なCivetWebに、ネットワーク越しに接続します。
-
2
最初の要求を処理
サーバーがメソッドとパスのポインターを保持します。
-
3
古い状態が残る
解放済みのメモリを指すポインターが、そのまま使える状態で残ります。
-
4
後続の要求で参照
疑似ヘッダーを省いたHEADERSフレームを受けると、古い値を参照します。
-
5
判定の混乱か停止
アクセス規則の判定が狂うか、サーバーが異常終了します。
どう悪用されるか
認証は要りません。ネットワークから到達できる位置にあるHTTP/2対応のCivetWebに、細工したHEADERSフレームを送るだけで狙えます。利用者の操作も不要です。CVSSの攻撃条件は「高」と評価されており、いつでも確実に成功するわけではありません。
被害は2通りです。アクセス規則が見るメソッドやパスに影響が出ると、本来拒否されるはずの要求が通るおそれがあります。サーバーが落ちれば、サービスが止まります。CVSSは機密性、完全性、可用性の3つをいずれも「高」と評価しています。
今すぐやること
-
1
HTTP/2を使っているか調べる
CivetWebの版、USE_HTTP2でのビルドの有無、enable_http2の設定を確認します。組み込み製品は、ベンダーにも問い合わせます。
grep -rn "enable_http2" /path/to/civetweb/config -
2
HTTP/2が不要なら無効にする
業務でHTTP/2を使っていないなら、先に無効化して攻撃の入口をふさぎます。手順は回避策のとおりです。
-
3
修正版の公開を確認して更新する
プロジェクトのGitHubで、Issue #1379とリリースの案内を確認します。修正版が出ていれば更新し、組み込み製品はベンダーの更新を待って適用します。
-
4
アクセス制御を一か所に頼らない
CivetWebのアクセス規則だけでメソッドやパスを制限している場合は、前段のリバースプロキシやファイアウォールでも同じ制限をかけます。
-
5
異常終了の記録を調べる
CivetWebのプロセスが理由なく落ちた記録がないか、再起動の履歴やログを確認します。心当たりがあれば、アクセスログと突き合わせます。
修正版がないあいだのつなぎ
設定でenable_http2をoffにし、HTTP/2を使わない構成にします。ビルドから管理している場合は、USE_HTTP2を付けずに作り直す方法もあります。どちらも、クライアントとはHTTP/2以外の方式で通信することになるため、変更前に動作を確認してください。
背景
CivetWebは、C/C++のアプリケーションに組み込めるWebサーバーです。ソースが単一ファイルで取り込め、MITライセンスで配布されているため、管理画面や状態表示のために機器や自社製品の中へ入れて使われます。スタンドアロンのWebサーバーとしても動かせます。2013年にMongooseから分かれたプロジェクトです。
HTTP/2への対応は、プロジェクトの説明で実験的(Experimental)とされています。今回の脆弱性は、その機能を有効にしたときだけ現れます。組み込み製品では、利用者が中のCivetWebの版やHTTP/2の設定を見られないことが多く、自社で調べる前に、製品ベンダーの案内で該当するかを確かめることになりそうです。
よくある質問
Q.HTTP/2を使っていなければ、影響はありませんか。
Q.CVSSがv3で8.1、v4で9.2と開きがあるのはなぜですか。
まだ分かっていないこと
- 修正版の版番号と公開時期は示されていません。
- 実際の攻撃で悪用されたかどうかは公表されていません。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 修正版 |
|---|---|---|---|
| civetweb | civetweb |
1.16 以前 |
— |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
CivetWeb through 1.16, when built with USE_HTTP2 and enable_http2 on, contains a use-after-free vulnerability in handle_http2() that retains freed :method and :path pointers. Unauthenticated remote attackers can send a later HEADERS frame omitting these pseudo-headers to influence request method or path seen by access rules, or crash the server.
出典: CVE.org (CVE Program・cvelistV5) NVD