Apache の修正 : CVE-2021-40438 の脆弱性によるサーバー・サイド・リクエスト・フォージェリの防止
背景
特定のモジュール (mod_proxy) が有効な場合、Apache HTTP Server (httpd) バージョン 2.4.48 以前に存在するこの脆弱性をリモートで悪用することで、サーバー・サイド・リクエスト・フォージェリ攻撃が可能になります。
バージョン 2.4.51 ではすでにパッチが利用可能でクラウドにホストされている Apache HTTP Server のインスタンスは安全です (最近アップデートされている場合)。
Fastly の次世代 WAF をご利用のお客様はテンプレートルールにより、この脆弱性から保護されています。
CVE-2021-40438 の脆弱性を悪用することで、Apache HTTP Server バージョン 2.4.48 以前で、サーバー・サイド・リクエスト・フォージェリ (SSRF) 攻撃が可能になります。攻撃者は特別に細工されたリクエストを送信することで、 mod_proxy モジュール (有効な場合) が任意のオリジンサーバーに接続をルーティングするよう強制することができます。これにより、攻撃者はシークレット (インフラストラクチャのメタデータやキーなど) をひそかに抽出したり、外部からのアクセスが可能なサーバーよりもセキュリティが手薄な社内向けサーバーにアクセスすることが可能になります。
影響範囲
この脆弱性は Apache HTTP Server (httpd) のバージョン 2.4.48 以前に存在します。ただし、mod_proxy モジュールが有効でないと、この脆弱性を悪用することはできません。そのため、攻撃者はこの脆弱性の悪用を可能にするこれらの条件を満たすサーバーを探す必要があります。
残念ながら Shodan のデータによると、これらの条件を満たすサーバーが50万以上存在するようです。従って、攻撃者がこの脆弱性を利用して攻撃をしかける機会が十分にあると思われます。
興味深いポイント
SSRF (詳細はこちら) の攻撃はここ数年増えていますが、その理由は効果的で検出が難しい上、脆弱なエンドポイントが増えている (ソフトウェアが世界中で繁殖していることの弊害) という複数の要因が重なった結果と言えるようです。OWASP トップ10 入りし、注目を集めたセキュリティ侵害を引き起こすなど、攻撃者の間で SSRF の評価が高まっています。SSRF は攻撃目的で使用される一種の邪悪なリバースプロキシを可能にするものとして捉えることができます。
また、cPanel を CentOS で実行している多くのユーザーが、Apache HTTP Server で新たに発見された別の脆弱性 CVE-2021-41773 を理由に、インストールしている Apache のバージョンを 2.4.49 や 2.4.50 から旧バージョンの 2.4.48 にダウングレードしていることが確認されています。しかし、このダウングレードによってこれらのユーザーのシステムはこの攻撃に対して脆弱になっています。パストラバーサル攻撃を防ぐために SSRF 攻撃を許すのは得策ではありま せん。
ただし...
この脆弱性は古いバージョンの Apache HTTP Server を使用している組織にとって深刻な問題であり、攻撃者にとって最も有益な攻撃ベクトルはクラウドです (より被害が大きいです)。しかし、Amazon Web Services (AWS) や Microsoft Azure、Google Cloud Platform (GCP) を含むクラウドプロバイダーのサービスにはこの脅威に対する保護がビルトインされています。
従って、この脆弱性の影響は httpd サーバーを自社で運用している組織に限られそうです。組織が Apache HTTP Server インスタンスを自社でホストしていて、(GET リクエストによって) Apache サーバーが何らかのアプリケーションにアクセスできる場合に、この脆弱性による攻撃を受ける可能性があります。
詳細
mod_proxy モジュールは、Apache HTTP Server で接続をリダイレクト するのに使用できるプロキシを実装します。通常このモジュールはアプリケーションサーバーへのゲートウェイとして使用され、一般的なプロキシがもたらすメリット (ロードバランシングなど) を提供します。
この問題の修正に関連するコミットは r1892814 です。パッチが適用された Apache サーバーでは、unix:
ストリングがプロキシの URL (プロキシの宛先) の先頭にある場合にのみ ([proxy:]unix:path|url
のように)、URL を解析するコードがトリガーされます。一方、パッチが適用されていないサーバーの場合、解析関数は、ユーザーが提供した URL の先端のみを確認する代わりに、URL 全体を検索して unix:
を探します。
さらに攻撃者は、関数 ap_runtime_dir_relative にパスされる変数をコントロールすることができ、昔からの C コードの経験からすると、これによりバッファーオーバーフローが引き起こされたり、関数が予期せぬステートに送信される可能性があります。その結果、セキュリティチームと運用チームはクラッシュが発生したり、攻撃者によるコントロールが可能になるというリスクに常に晒されるため、この 動作は望ましくありません。
APR_PATH_MAX を強制することで、字数制限 (7701字) によってエラーコードが返され、この脆弱性を実際に悪用することができます。以下のコマンドを実行すると、サーバーが延長された「AAAAA」を使用するよう強制して無効にすることができます (@_mattata からお借りしました)。
curl "http://localhost/?unix:$(python3 -c 'print("A"*7701, end="")')|http://backend_server1:8080/"
この脆弱性を悪用する細かい手順については、悪用の概念実証コードが提供されているこのブログ記事をご覧ください。
解決策
Apache HTTP Server のバージョン 2.4.48 以前をご使用の場合は、バージョン 2.4.51 に更新してパッチを適用し、mod_proxy パスを無効にするか、パッチを適用するまで同パ スを無効にしてください。
Apache HTTP Server をご利用のお客様は、以下のステップに従って CVE-2021-40438 向けの新しいテンプレートルールを有効にすることで、この脆弱性を悪用する攻撃から保護できます。
Fastly の次世代 WAF をご利用のお客様で、Apache サーバーを AWS で運用していらっしゃる場合は、AWS の SSRF テンプレートルール も有効にすることで、AWS を狙うあらゆるタイプの SSRF 攻撃に対する防御を強化することができます。
Site で Site Rules を選択 -> Templated Rules を選択
CVE-2021-40438 を 探して選択し、設定を選択します。ある IP アドレスからのリクエストをブロックするルールを有効にします。
テンプレートルールのページで、このルールが有効になっていることを確認します。