NFLabs. エンジニアブログ

セキュリティやソフトウェア開発に関する情報を発信する技術者向けのブログです。

【CVE-2021-41773, CVE-2021-42013】Apache HTTP ServerのRCE脆弱性について

こんにちは。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については、RHELDebianUbuntuなど有名なディストリビューションについては使用しておらず影響を受けないことがベンダーより発表されています。 例外的にDebian12のtestingリリースでは脆弱なバージョンが使われていたようですが、テスト用リリースのため利用者は少ないと思われます。

そのため、ディストリビューションが配布しているパッケージを使わずに別のリポジトリを利用したり、Apache 2.4.49, 2.4.50のDockerコンテナを利用したりしている場合のみ影響がある可能性があります。

access.redhat.com

security-tracker.debian.org

ubuntu.com

インターネット上でApache 2.4.49が動作しているサーバー

Shodanを用いて検索を行うと、Apache 2.4.49で動作するサーバーが113,062台存在しました。(2021/10/07時点)

f:id:nfl_n3:20211007110612p:plain

日本国内では、1,441台のサーバーが存在しました。

f:id:nfl_n3:20211007110653p:plain

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サービスの権限で読み取り可能な任意のファイルを読み取れます。

脆弱性の影響

この脆弱性を突く攻撃コードは既にGitHubTwitterで公開されているため、誰でも容易に攻撃可能な状態となっています。

以下はファイル読み取りのPoCを実行した例になります。実行すると、サーバー上にある/etc/passwdを読み取ることが出来ています。 ちなみに、ルートディレクトリにRequire all deniedの設定が入っている場合は403エラーが返ってきて/etc/passwdの内容を読み取ることは出来ません。

f:id:nfl_n3:20211007162028p:plain

脆弱性の詳細

CVE-2021-41773

Apacheのようなオープンソースソフトウェアでは、ソースコードの差分を見ることで脆弱性の原因を知ることができ、影響の分析や攻撃コードの作成に利用することが出来ます。

下の画像は脆弱性が修正されたApache 2.4.50のGitHub上のコミットログになります。

f:id:nfl_n3:20211007115346p:plain

github.com

このうち、最後にソースコードに変更のあったコミットを見ると、server/util.cap_normalize_path関数が修正されていることが分かります。

f:id:nfl_n3:20211007121050p:plain

コメント文を見ると修正前は/xx/../のセグメントを削除と書いてあり、修正後はフラグのAP_NORMALIZE_DECODE_UNRESERVEDがセットされているときは最初のドットしかデコードされないため/xx/.%2e/も削除すると書かれています。

このコメントの内容やコード上の実装から、ディレクトリトラバーサルで使われがちな../のようなパスを無効化するコードがあったが、そのコードだと一定条件下で.%2e/のように後ろのドットをASCIIコードの16進数表記を利用することでバイパス出来るのが今回の脆弱性の根幹であることが分かります。

後は、ap_normalize_pathが呼ばれる箇所やAP_NORMALIZE_DECODE_UNRESERVEDフラグがセットされる条件をソースコード上で追っていくことで脆弱性が発生する条件(今回のような脆弱性はデフォルトで無効となっている機能や設定が有効となっている必要があることが多いです)の発見や攻撃コードの作成に繋げることが出来ます。 (規模の大きいソフトウェアだとこの作業にとても時間がかかりますが...)

github.com

CVE-2021-42013

CVE-2021-42013に対してのパッチでは、次の2つの脆弱性が塞がれました。

  1. 2.4.50でのCVE-2021-41773に対する修正が不十分であった問題の修正
    • 2.4.50ではURLのパーセントエンコーディングのデコード処理が2度呼ばれることを利用して修正をバイパスすることが可能でした。
  2. AP_NORMALIZE_DROP_PARAMETERSという利用されていないフラグが有効な際に、同様のディレクトリトラバーサルが可能になる脆弱性
    • こちらに関しては、AP_NORMALIZE_DROP_PARAMETERSというフラグが有効なときのみ攻撃可能なこと、AP_NORMALIZE_DROP_PARAMETERSを有効にする手段が見つかっていないことから現実的には攻撃不可能な脆弱性になります。

github.com

まとめ

CVE-2021-41773はApache HTTP ServerにRCE脆弱性が見つかったということで大きな話題になりました。 しかしながら、対象となるバージョンが限定されていること、デフォルトとは異なる設定が必要なことから影響は限定的と思われます。

万が一Apache 2.4.49または2.4.50を利用している場合は、攻撃コードも公開されていることや既に攻撃が観測されていることから速やかに2.4.51にアップデートを行うことを推奨します。