こんにちは。NFLabs. Offensive Teamの阿部です。
10/5 (火) に、特定の設定がなされているApache HTTP Server (以後Apache) 2.4.49の環境においてリモートからコード実行 (RCE) が可能な脆弱性(CVE-2021-41773)が発見されました。 さらに、この脆弱性を塞ぐために2.4.50がリリースされましたが、修正が不十分でバイパス出来ることが判明した(CVE-2021-42013)ため再度修正されたバージョン2.4.51がリリースされています。 今回の脆弱性は本質的にはディレクトリトラバーサルの脆弱性ですが、設定次第ではRCE可能となっています。 Apacheは非常に多くの環境で利用されていますが、RCE可能な脆弱性が見つかることは近年では無かったため話題になっています。
今回はこれらの脆弱性の影響や原因について紹介します。
脆弱なバージョン
今回の脆弱性は、Apache 2.4.49および2.4.50を利用している場合のみ脆弱性の影響を受けます。
多くのLinuxディストリビューションでは、互換性を維持することを目的に古いバージョンにセキュリティパッチのみを適用して配布しています。
Apache 2.4.49, 2.4.50については、RHEL、Debian、Ubuntuなど有名なディストリビューションについては使用しておらず影響を受けないことがベンダーより発表されています。 例外的にDebian12のtestingリリースでは脆弱なバージョンが使われていたようですが、テスト用リリースのため利用者は少ないと思われます。
そのため、ディストリビューションが配布しているパッケージを使わずに別のリポジトリを利用したり、Apache 2.4.49, 2.4.50のDockerコンテナを利用したりしている場合のみ影響がある可能性があります。
インターネット上でApache 2.4.49が動作しているサーバー
Shodanを用いて検索を行うと、Apache 2.4.49で動作するサーバーが113,062台存在しました。(2021/10/07時点)
日本国内では、1,441台のサーバーが存在しました。
ShodanではApacheのバージョン判定をHTTPのレスポンスヘッダに含まれるServer
ヘッダの情報を用いて行っています。
この情報は、Apacheの設定を変更することで隠すことが出来るため、実際にはこれより多くのサーバーが脆弱なまま公開されていることが推測されます。
脆弱になる設定
今回の脆弱性を突くためには、フォルダーのアクセス権限の設定がデフォルトよりも緩くなっている必要があります。
Apacheの設定ファイル(apache2.confやhttpd.conf)にて次のようにルートディレクトリに対してアクセスを拒否する設定が入っている場合は脆弱性の影響をほぼ受けません。(ただし、本来想定していたURLパスとは異なるパスで公開しているファイルへのアクセスが可能になります。) この設定は多くの環境においてデフォルト設定として入っているため、Apache 2.4.49, 2.4.50を利用しても影響を受けないサーバーが多いかと思います。
<Directory /> Require all denied </Directory>
この設定が入っていない場合、今回の脆弱性の影響を受けます。
また、Apacheが読み込んでいるモジュールによってRCE可能かどうかが変わります。
具体的には、mod_cgi
が設定で読み込まれている場合はディレクトリトラバーサルによって/bin
などに存在しているプログラムを実行することが出来、RCE可能となります。
これが読み込まれていない場合は、ディレクトリトラバーサルでApacheサービスの権限で読み取り可能な任意のファイルを読み取れます。
脆弱性の影響
この脆弱性を突く攻撃コードは既にGitHubやTwitterで公開されているため、誰でも容易に攻撃可能な状態となっています。
以下はファイル読み取りのPoCを実行した例になります。実行すると、サーバー上にある/etc/passwd
を読み取ることが出来ています。
ちなみに、ルートディレクトリにRequire all denied
の設定が入っている場合は403エラーが返ってきて/etc/passwd
の内容を読み取ることは出来ません。
脆弱性の詳細
CVE-2021-41773
Apacheのようなオープンソースソフトウェアでは、ソースコードの差分を見ることで脆弱性の原因を知ることができ、影響の分析や攻撃コードの作成に利用することが出来ます。
下の画像は脆弱性が修正されたApache 2.4.50のGitHub上のコミットログになります。
このうち、最後にソースコードに変更のあったコミットを見ると、server/util.c
のap_normalize_path
関数が修正されていることが分かります。
コメント文を見ると修正前は/xx/../のセグメントを削除
と書いてあり、修正後はフラグのAP_NORMALIZE_DECODE_UNRESERVEDがセットされているときは最初のドットしかデコードされないため/xx/.%2e/も削除する
と書かれています。
このコメントの内容やコード上の実装から、ディレクトリトラバーサルで使われがちな../
のようなパスを無効化するコードがあったが、そのコードだと一定条件下で.%2e/
のように後ろのドットをASCIIコードの16進数表記を利用することでバイパス出来るのが今回の脆弱性の根幹であることが分かります。
後は、ap_normalize_path
が呼ばれる箇所やAP_NORMALIZE_DECODE_UNRESERVED
フラグがセットされる条件をソースコード上で追っていくことで脆弱性が発生する条件(今回のような脆弱性はデフォルトで無効となっている機能や設定が有効となっている必要があることが多いです)の発見や攻撃コードの作成に繋げることが出来ます。
(規模の大きいソフトウェアだとこの作業にとても時間がかかりますが...)
CVE-2021-42013
CVE-2021-42013に対してのパッチでは、次の2つの脆弱性が塞がれました。
- 2.4.50でのCVE-2021-41773に対する修正が不十分であった問題の修正
- 2.4.50ではURLのパーセントエンコーディングのデコード処理が2度呼ばれることを利用して修正をバイパスすることが可能でした。
AP_NORMALIZE_DROP_PARAMETERS
という利用されていないフラグが有効な際に、同様のディレクトリトラバーサルが可能になる脆弱性- こちらに関しては、
AP_NORMALIZE_DROP_PARAMETERS
というフラグが有効なときのみ攻撃可能なこと、AP_NORMALIZE_DROP_PARAMETERS
を有効にする手段が見つかっていないことから現実的には攻撃不可能な脆弱性になります。
- こちらに関しては、
まとめ
CVE-2021-41773はApache HTTP ServerにRCE脆弱性が見つかったということで大きな話題になりました。 しかしながら、対象となるバージョンが限定されていること、デフォルトとは異なる設定が必要なことから影響は限定的と思われます。
万が一Apache 2.4.49または2.4.50を利用している場合は、攻撃コードも公開されていることや既に攻撃が観測されていることから速やかに2.4.51にアップデートを行うことを推奨します。
🚨 Active scanning of Apache HTTP Server CVE-2021-41773 & CVE-2021-42013 is ongoing and expected to accelerate, likely leading to exploitation. Please patch immediately if you haven’t already—this cannot wait until after the weekend. Read more: https://t.co/4Ljk730wz4 pic.twitter.com/TYPiXhOluf
— US-CERT (@USCERT_gov) 2021年10月7日