Apache HTTP Serverにおけるパストラバーサル脆弱性(CVE-2021-41773/CVE-2021-42013)の概要

目次
- 1 Apache HTTP Serverにおけるパストラバーサル脆弱性(CVE-2021-41773/CVE-2021-42013)の概要
- 2 Apache HTTP Serverパストラバーサル脆弱性の影響範囲:影響を受けるバージョンとシステム
- 3 パストラバーサル(ディレクトリトラバーサル)攻撃とは何か?その手口・仕組みと具体的な被害事例を徹底解説
- 4 Apache HTTP Serverパストラバーサル脆弱性の原因:パス正規化処理の欠陥と技術的背景を詳しく解説
- 5 Apache HTTP Serverパストラバーサル脆弱性の悪用の可能性と攻撃手法:考えられる攻撃シナリオ
- 6 Apache HTTP Serverパストラバーサル脆弱性への対策方法と推奨対応:設定見直しとアップデート
- 7 Apache HTTP Serverパストラバーサル脆弱性の修正版・パッチ情報:修正バージョンと適用方法
- 8 Apache HTTP Serverパストラバーサル脆弱性の検証結果・PoC(Proof of Concept):脆弱性再現テストの報告
Apache HTTP Serverにおけるパストラバーサル脆弱性(CVE-2021-41773/CVE-2021-42013)の概要
2021年10月初旬、Apache HTTP Serverに深刻なパストラバーサルの脆弱性が発覚しました。対象はApache HTTP Server 2.4.49およびその修正バージョン2.4.50で、CVE-2021-41773およびCVE-2021-42013として報告されています。本脆弱性は、Apacheのパス正規化処理に起因する問題で、細工されたリクエストを送ることでウェブサーバのドキュメントルート外にあるファイルへの不正アクセスが可能になるというものです。Apache Software Foundationは2021年10月5日(米国時間)に最初の脆弱性(CVE-2021-41773)に関するセキュリティ勧告を緊急公開し、修正バージョン2.4.50をリリースしました。しかしその直後、この修正が不完全であることが判明し、新たにCVE-2021-42013が割り当てられました。結果として、Apacheは10月7日に改めて脆弱性を完全に修正するバージョン2.4.51をリリースし、問題の収束を図りました。これらの脆弱性は「ゼロデイ」(公表前から悪用された脆弱性)として実際に攻撃が確認されており、公開後すぐに世界中でスキャンや攻撃試行が行われました。
2021年10月に緊急公開されたApache脆弱性情報(CVE-2021-41773/42013)とゼロデイ発見の経緯
Apache HTTP Server 2.4.49で新たに導入された機能の不備により、本脆弱性が発生しました。2021年9月15日にリリースされたバージョン2.4.49に問題が内在していたため、同年10月4日から5日にかけてセキュリティ研究者らによって脆弱性が特定され、Apacheプロジェクトに報告されました。Apache Software Foundationは10月5日に脆弱性情報(CVE-2021-41773)のアドバイザリを公開すると同時に、緊急アップデート版であるApache 2.4.50をリリースします。しかし、CVE-2021-41773は公表時点ですでに「ゼロデイ」攻撃としてインターネット上で悪用が確認されており、攻撃者が修正前のサーバを標的にしている状況でした。また、2.4.50での修正内容に不備があったため、公開直後にセキュリティ研究者らが追加の問題を発見し、新たな脆弱性CVE-2021-42013として報告しました。この一連の経緯により、Apacheは10月7日に再度修正版2.4.51をリリースし、脆弱性の完全な対処を行いました。短期間に脆弱性の公表と追加の脆弱性判明、再修正という慌ただしい展開となり、システム管理者は迅速な情報収集と対応を迫られました。
Apache HTTP Server 2.4.49/2.4.50で非デフォルト設定時に現れる問題(特定条件下の脆弱性)
本脆弱性は、Apache HTTP Serverが特定の非デフォルト設定で動作している場合にのみ顕在化します。具体的には、Apacheの設定ファイルにおいてドキュメントルート全体に対するアクセス制限が適切に設定されていない場合(例えば
パストラバーサル攻撃で機密ファイルが閲覧可能になる危険性と影響
パストラバーサル(ディレクトリトラバーサル)攻撃が成立すると、攻撃者は本来アクセスが禁止されているサーバ内の機密ファイルを閲覧できてしまう重大な危険性があります。この脆弱性を利用された場合、例えばシステムのパスワードファイル(Linuxでは/etc/passwdなど)や設定ファイル(データベース接続情報や認証情報が含まれるファイル)、ソースコードファイル(Webアプリケーションの重要なコード)などが盗み見られる可能性があります。本脆弱性はApache HTTP Server自身の問題であり、攻撃者はHTTPリクエスト1つ送信するだけでサーバ内の任意のファイルにアクセスできるため、一般的なウェブアプリケーション層のセキュリティ対策(入力値チェック等)では防ぎきれません。情報漏洩の影響として、取得された機密ファイルからさらに別の攻撃につながる恐れもあります(例えばパスワード情報が漏洩すれば他のサービスへの不正ログインに使われる、ソースコードが漏洩すれば脆弱性を解析される等)。したがって、本脆弱性によって引き起こされる情報漏洩リスクは非常に高く、対象バージョンを使用しているサーバ管理者は直ちに対策を講じる必要があります。
CGI有効環境におけるリモートコード実行(RCE)のリスクと深刻性
本脆弱性の深刻度をさらに高める要因として、Apacheサーバ上でCGIスクリプトの実行が有効になっている場合が挙げられます。通常、Apacheではmod_cgi(またはmod_cgid)モジュールを有効にしCGIスクリプトの実行を許可すると、特定のディレクトリ(例:/cgi-bin/)以下に配置したプログラムをHTTP経由で動的に実行できます。本脆弱性が存在する状態でCGIが有効になっていると、攻撃者はパストラバーサルを利用してシステム上の任意の実行可能ファイルを呼び出し、リモートからコードを実行できる可能性があります。例えば、Apacheの設定によっては/cgi-bin/配下のスクリプトだけでなく、システム上の/bin/sh(シェル)などをパス経由で呼び出せてしまうケースがあります。その結果、攻撃者はWebリクエストを介してサーバ上で任意のコマンドを実行(RCE)できてしまい、サーバ乗っ取りや破壊行為にまで発展する恐れがあります。特にmod_cgiはデフォルトでは無効化されていますが、業務上必要で有効にしているケースもあり、そのような環境では本脆弱性の深刻性(Critical度)が極めて高くなります。実際、CVE-2021-42013はこのRCEの可能性を含むためCVSSスコアが9.8(Critical)と評価されました。CGI有効環境では単なるファイル漏洩に留まらず、サーバ全体の支配権を奪われかねない点で、本脆弱性は非常に危険です。
CVE-2021-41773とCVE-2021-42013の関係:不完全な修正による脆弱性再発の経緯
CVE-2021-41773とCVE-2021-42013は、密接に関連した脆弱性です。前者(41773)はApache 2.4.49において初めて発覚したパストラバーサル脆弱性であり、後者(42013)はその修正が不十分だったために発生した「再発」あるいは「派生」の脆弱性と言えます。ApacheはCVE-2021-41773への対策としてバージョン2.4.50をリリースしましたが、この修正では攻撃手法の一部(特にURLエンコードを悪用したバイパス手法)を完全に防ぐことができませんでした。その結果、2.4.50でも引き続きパストラバーサル攻撃が可能であることが判明し、これに対して新たにCVE-2021-42013が割り当てられました。CVE-2021-42013は「CVE-2021-41773の不完全な修正(Incomplete Fix)が原因で発生した脆弱性」と位置づけられ、Apache自身も公式アドバイザリでその旨を説明しています。幸い、2.4.51において両脆弱性は完全に修正されましたが、この一連の経緯は、ソフトウェア修正の難しさと攻撃者による素早い解析の脅威を浮き彫りにしました。管理者にとっては、単に一度アップデートすれば安心ではなく、追加情報や追加パッチにも継続して注意を払う必要があるという教訓となりました。
Apache HTTP Serverパストラバーサル脆弱性の影響範囲:影響を受けるバージョンとシステム
Apache HTTP Serverのパストラバーサル脆弱性(CVE-2021-41773/CVE-2021-42013)は、基本的には特定のバージョン(2.4.49および2.4.50)のApacheに限定された問題です。しかし、Apacheは世界中で広く利用されているため、その影響範囲と潜在的なリスクの規模は無視できません。このセクションでは、どのバージョンやシステムが本脆弱性の影響を受けるのか、そしてその影響の範囲や深刻度について詳しく説明します。
影響を受けるApache HTTP Serverのバージョン(2.4.49/2.4.50)と影響範囲
今回のパストラバーサル脆弱性の直接の影響範囲は、Apache HTTP Server 2.4.49および2.4.50です。Apache Software Foundationの発表によれば、2.4.49に本脆弱性が導入され、それ以前のバージョン(2.4.48以前)にはこの問題は存在しませんでした。また、2.4.50は2.4.49の脆弱性修正のためにリリースされましたが、前述の通り修正が不完全であったため2.4.50自身も脆弱性を含む結果となりました。したがって、影響を受けるバージョンは2.4.49および2.4.50のみであり、2.4.48以前や、最終修正された2.4.51以降のバージョンはこの問題の影響を受けません。
なお、Apache HTTP Server 2.4系列以外(2.2系統など古い世代)は今回の問題には直接関係しませんが、これらはそもそもサポート切れで別の脆弱性が存在する可能性が高いため、別途注意が必要です。本脆弱性に関しては、管理しているサーバが該当のバージョンに該当するかをまず確認することが重要です。該当バージョンであれば影響範囲に入りますし、そうでなければ(2.4.48以前や2.4.51以降であれば)直接の影響は受けません。ただし、後述するように間接的なリスク評価として、影響を受ける環境がどの程度世の中に存在するかも考慮する必要があります。
Apache HTTP Serverの普及度と本脆弱性による潜在的影響規模(世界中のWebサーバへの影響)
Apache HTTP Serverは世界中のWebサーバで広く採用されているオープンソースのWebサーバソフトウェアであり、その市場シェアは長年トップクラスです。そのため、Apacheに深刻な脆弱性が見つかった場合、その潜在的な影響規模は非常に大きくなります。本脆弱性が公表された2021年10月当時、直近のApache最新バージョンが2.4.49/2.4.50であったことから、既にそれらのバージョンへアップグレードしていたWebサイトやサービスも一定数存在していました。結果として、世界中の多くのサーバ管理者が緊急対応を迫られる事態となりました。特に、インターネット上に公開されているWebサーバでApache 2.4.49/2.4.50を使用している場合、攻撃者による自動スキャンの対象となり、脆弱性公表後すぐに攻撃が試みられる状況でした。実際に、日本国内外問わず多数の攻撃が観測され、セキュリティベンダー各社の報告によれば、本脆弱性は公表直後の10月に最も頻繁に攻撃試行が行われた脆弱性の一つとなりました。Apacheの普及度の高さゆえに、影響を受けるシステムの絶対数も多くなり得るため、組織全体で影響範囲を正確に把握し、未対策のサーバが残らないよう注意する必要があります。
デフォルト設定との違いによる脆弱性影響の限定(「Require all denied」の有無)
前述したように、本脆弱性はApacheの設定状況に大きく依存します。デフォルト設定では
今回の脆弱性では、「設定によっては問題が顕在化しない」という点が特徴です。影響範囲を考える際には、単にバージョンだけでなく設定面での前提条件も考慮する必要があります。社内のApacheサーバで2.4.49/2.4.50を使っていても、デフォルト通りRequire all deniedが適用されていれば被害を免れる可能性が高いです。しかし一方で、一部の管理者が利便性のためにアクセス制御を緩めているケースでは、同じバージョンでも深刻なリスクに晒されます。このように、設定の違いによって脆弱性の影響範囲が限定的にも広範にもなり得ることを理解し、自組織のサーバ設定を精査することが重要です。
CGIスクリプト有効環境での影響とリスク(RCEの可能性が高まる状況)
Apache上でCGIスクリプトが有効になっている環境は、本脆弱性の影響をさらに悪化させる特別なケースです。通常、CGIを有効化すると/cgi-bin/など特定ディレクトリ以下で外部プログラムの実行が許可されます。本脆弱性のもとでは、パストラバーサル攻撃により本来は直接実行できないはずのシステム上のプログラムにHTTP経由でアクセスできてしまうため、CGIディレクトリ外のシステムコマンド実行すら可能となる恐れがあります。特に、先述の条件(Require all denied無効)に加えCGIが有効という2つの条件が重なると、CVE-2021-42013で指摘されたようにリモートコード実行(RCE)の危険性が現実のものとなります。これは、Apache 2.4.49/2.4.50を使っているシステムでCGIを用いた古いWebアプリケーションを動かしている場合などに該当し、現実に存在する環境です。攻撃者から見ると、単にファイルを盗み見るだけでなく、サーバ上で任意のコードを走らせられるため、目的の幅が広がります。例えば、マルウェアをダウンロードして実行したり、システム内の他の領域に攻撃を横展開することも可能になります。したがって、CGI有効環境で本脆弱性が放置されている場合、そのリスクはファイル漏洩だけの場合より飛躍的に高いことを認識しなければなりません。自社システムでCGIを使用している場合には、より一層緊急に対策を講じる必要があります。
CVSSスコア7.5(High)に見る脆弱性の深刻度と対策優先度
本脆弱性(CVE-2021-41773)はCVSS v3スコアで7.5(High)と評価されました。また、RCEの可能性を含むCVE-2021-42013についてはCVSS 9.8(Critical)とさらに高く評価されています。このCVSSスコアからも分かる通り、本脆弱性は非常に深刻なものであり、組織として優先的に対処すべき課題です。CVSS 7.5という数値は、ネットワーク経由で低複雑性(攻撃しやすい)・認証不要・ユーザー関与不要で攻撃可能、かつ機密性(Confidentiality)への高い影響(H:High)を与えることを意味しています。さらにCVE-2021-42013では完全なリモートコード実行が可能となるため、機密性だけでなくシステムの完全性や可用性にも致命的な影響を与え得ると判断されました。これらのスコアに基づき、本脆弱性は組織のセキュリティ対応において最優先クラスである「High」あるいは「Critical」と位置づける必要があります。組織内の脆弱性管理ポリシーにおいても、該当バージョンを使用しているサーバがあれば即時アップデートまたは緩和策の適用が求められ、数ある脆弱性の中でも特に迅速な対応が必要なケースといえます。CVSSスコアはあくまで指標ですが、今回のように高スコアが付与された脆弱性は、サービス継続や情報保護の観点から見ても放置すれば重大な事故につながる可能性が高いため、経営層を含めた適切な危機認識とリソース投入が不可欠です。
パストラバーサル(ディレクトリトラバーサル)攻撃とは何か?その手口・仕組みと具体的な被害事例を徹底解説
パストラバーサル攻撃(ディレクトリトラバーサル攻撃)は、ウェブアプリケーションやサーバのディレクトリ(フォルダ)構造を不正に横断し、通常はアクセスできないファイルやディレクトリにアクセスする手法です。この攻撃により、攻撃者は機密ファイルの閲覧やプログラムの実行など、本来許可されていない操作を行えてしまう可能性があります。本節では、パストラバーサル攻撃の基本的な仕組みと目的、具体的な攻撃手法、そしてその危険性について解説します。また、過去に発生した類似の脆弱性事例や教訓にも触れ、なぜこの攻撃が発生し、それを防ぐにはどうすればよいのかを包括的に説明します。
ディレクトリトラバーサル攻撃の基本概念と攻撃者の目的
ディレクトリトラバーサル攻撃とは、ウェブサーバやアプリケーションが提供する通常のアクセス制限をすり抜けて、本来は公開されていないファイルシステム上のファイルに到達する攻撃手法です。攻撃者の目的は、サーバ上の機密データを盗み見たり、設定ファイルから有用な情報(データベースのパスワードなど)を得ること、さらには実行可能なスクリプトを配置・実行することなど多岐にわたります。基本概念として、攻撃者はウェブサーバに対し相対パスを遡る特殊なリクエストを送り、例えば/../../のように上位ディレクトリへ移動する記号を巧妙に含めることで、本来の公開ディレクトリの外側へアクセスしようと試みます。これが成功すると、サーバ内の重要ファイル(例:認証情報が書かれたファイルやOSの設定ファイル等)にアクセスでき、攻撃者はそれらを不正に取得・閲覧できます。攻撃者にとってパストラバーサルは直接的に利益をもたらす攻撃ではないように見えるかもしれませんが、盗んだ情報は後続の攻撃(例えば特権アカウントの乗っ取りや内部ネットワークへの侵入)に活用されるため、極めて危険です。また、場合によっては閲覧したファイルに悪意のあるコードを書き込む(書き込み可能な設定ファイル等がある場合)ことで、サーバを制御下に置くことさえ狙います。まとめると、ディレクトリトラバーサル攻撃は「サーバ内で攻撃者が自由に情報探索・窃取できる状態を作り出す」ことを目的としており、その基本概念は「許可されていないファイルパスへの到達」と言えます。
「../」シーケンスを悪用したファイルパス操作の手法と原理
パストラバーサル攻撃で頻繁に利用されるテクニックの一つに、「../」シーケンスの悪用があります。「../」はUNIX系OSやWindowsでも親ディレクトリを指す相対パスを意味し、ファイルパス中にこれを繰り返し用いることで上位フォルダへ遡ることができます。例えば、本来/var/www/html/以下のみ閲覧可能な設定のサーバに対し、攻撃者がhttp://example.com/../../../etc/passwdのようなリクエストを送ると、../によって公開ディレクトリを飛び出し、システムの/etc/passwdファイルに到達しようと試みます。サーバ側でパスを正規化せずにそのままファイル参照してしまう脆弱な実装だと、このような要求でも実際にファイルを開いてしまい、攻撃者が/etc/passwdの内容を取得できるという結果になります。原理的には非常に単純で、「../」を使ってディレクトリを遡るという考え方ですが、Webアプリケーションやサーバ実装の中には開発者の想定漏れでこれを許してしまうものがあります。そのため昔から「../」による攻撃は知られており、多くのシステムで対策が施されています。しかし、攻撃者はさらに巧妙な方法でこのチェックをかいくぐろうとします。例えば、「..%2f」(「/」をURLエンコードした%2fに置換)や、「..%255c」(二重エンコードなど)と書くことで、単純な../の検出を回避する手法があります。こうしたパストラバーサル攻撃の原理は、サーバが受け取ったパス文字列を正しく正規化・検証しない場合に成立するものであり、攻撃者はその弱点を突いて様々な表記ゆれを試みながら不正なファイルパス操作を行います。
パス正規化を回避するテクニック(エンコードや特殊文字利用)
多くの現代のウェブサーバやフレームワークでは、単純に../という文字列を含むリクエストは検知してブロックする仕組みがあります。そこで攻撃者は、パス正規化処理を回避または混乱させるテクニックを駆使します。その代表例がエンコード(符号化)の利用です。例えば「..%2e/」というパターンは、一見すると..(ドット二つ)ではなく.%2eと%エンコードを含むため、粗雑な正規化ルーチンでは検出を逃れる可能性があります。本来であればサーバ側で「%2e」を「.」にデコードした上でパス中の「../」を検知すべきところ、デコード処理が不十分だとこのような入力を危険だと認識できずに通してしまいます。他にも、「%252e」は「%2e」をさらにエンコード(二重エンコード)したもので、これをデコードするとまず「%2e」となり、再度デコードして「.」となります。サーバ側が一段階のデコードしかしない場合、この二重エンコードが効果を発揮し、チェックをすり抜けてしまうわけです。特殊文字の利用もあります。Windows環境では「..\」の代わりに「…\」や「..\”」(特殊なデバイス名やUNCパス)を使う攻撃も知られています。また、Unicodeの類似文字(例えばU+2215のようなスラッシュに見える文字)を用いてチェックを回避する高度な手法も研究されています。総じて、パス正規化回避のテクニックは多様であり、開発者側が全てのパターンを想定することは容易ではありません。今回のApache脆弱性でも、この正規化処理の盲点を突かれた形となりました。防御側としては、ユーザーから受け取った入力を可能な限り正規化・デコードした上で検証する、防御的プログラミングが求められます。
不正アクセスされうる重要ファイルの例(機密情報の漏洩リスク)
パストラバーサル攻撃によって攻撃者に閲覧されてしまう可能性のあるファイルには、システムやアプリケーションの機密情報が数多く含まれます。代表的な重要ファイルの例として、まずOSのユーザー情報ファイルが挙げられます。UNIX/Linux系システムでは/etc/passwdや/etc/shadowといったファイルにユーザーのアカウント情報やパスワードハッシュが格納されています。/etc/passwdは権限なしでも読めるケースが多く、そこからユーザー名一覧が得られるだけでも攻撃の手掛かりになりますし、/etc/shadowが読まれてしまうとパスワードハッシュからのクラックを試みられる危険があります。次にウェブアプリケーションの設定ファイルも標的です。データベース接続文字列やAPIキー、認証情報が書かれた設定ファイル(例えばWordPressのwp-config.phpなど)は非常に機密度が高く、これが漏洩するとデータベース内の情報を抜かれたり、更なる侵入の足掛かりとなります。また、ソースコードファイルそのものも漏洩対象です。攻撃者がアプリケーションのソースを手に入れれば、他の脆弱性を発見してさらなる攻撃に利用したり、知的財産の流出にもつながります。環境によっては、ログファイル(パスワードが平文で記録されている場合も)やクラウド認証情報(AWSの認証鍵などが書かれたファイル)も狙われます。このように、パストラバーサル攻撃で閲覧されうるファイルは多岐にわたり、その漏洩リスクは組織にとって甚大です。一つのファイルが漏れるだけでも連鎖的に被害が拡大する恐れがあるため、攻撃者によって何が標的にされるかを事前に洗い出し、必要なファイルには適切なアクセス権限の設定や暗号化を施すことが重要です。
過去のディレクトリトラバーサル脆弱性事例とセキュリティ教訓
ディレクトリトラバーサルの脆弱性は、今回のApacheに限らず過去にも繰り返し発生してきた古典的な脆弱性の一つです。例えば、有名な事例としては2000年頃のMicrosoft IIS 4.0/5.0のUnicodeディレクトリトラバーサル脆弱性が挙げられます。この脆弱性では、Unicodeエンコードによるパストラバーサル(「..%c0%af」などのシーケンス)がIISに通用してしまい、攻撃者がシステム上で任意のコマンドを実行可能になるという深刻なものでした。また、各種ルーターの管理画面やIoT機器のWebインターフェースなどでも、URLパラメータから../を指定できてしまい機密ファイルを抜かれる事例が報告されています。近年ではWebアプリケーションのフレームワークやライブラリ内部でパストラバーサルが起きるケースもあり、Node.jsのパッケージやJavaのライブラリでアーカイブ展開時に../を許してしまう(Zip Slip脆弱性)といった問題も知られています。これら過去事例から得られる教訓は、「外部から受け取ったパスや入力は信用せず、安全な範囲に制限する」ことの重要性です。開発者は、自身の実装する機能がファイルパスを扱う際に潜在的なリスクがないか注意深く検討しなければなりません。また、過去の教訓としてもう一点、脆弱性公表後の迅速な対応も挙げられます。2000年代のIIS脆弱性では多数のWebサイトが被害を受けましたが、その後のセキュリティ意識向上によりアップデート適用の重要性が認識されました。Apacheにおいても、今回の脆弱性から得た教訓を活かし、開発プロセスでのチェック強化や、利用者側の迅速なアップデート対応が求められています。
Apache HTTP Serverパストラバーサル脆弱性の原因:パス正規化処理の欠陥と技術的背景を詳しく解説
このセクションでは、Apache HTTP Serverにおいて本脆弱性がなぜ発生したのか、その技術的な原因や背景を掘り下げます。Apache 2.4.49で導入された変更点と脆弱性発生との関係、どのようなチェック漏れがあったのか、そして一度は修正したものの不完全だった理由(CVE-2021-42013の発生原因)を解説します。また、今回のケースから浮かび上がったセキュアコーディング上の課題についても触れ、将来的な教訓とします。
Apache HTTP Server 2.4.49で導入されたパス正規化処理の変更点と影響
Apache HTTP Server 2.4.49では、URLのパス部分の正規化処理に関するコードに変更が加えられました。正規化処理とは、URL中の「.」「..」「%xx」エンコードなどを解釈し、実際のファイルパスに変換するプロセスです。2.4.49の変更では、このパス正規化のアルゴリズムが一部改善・変更され、不要なパス要素や危険なパスを除去する機能を強化する意図がありました。しかし、この変更には想定外の副作用が潜んでいました。具体的には、新しい正規化処理がUnicodeやエンコードされた特殊文字の扱いにおいて不完全であったのです。従来のバージョンでは防げていたパストラバーサル手法が、2.4.49の変更後はすり抜けてしまうケースが生まれました。つまり、2.4.49へのアップデート自体が新たな脆弱性を導入してしまった形となります。変更点の詳細として、Apacheのパス正規化は各ディレクトリ要素を順に検証する仕組みですが、2.4.49では一部のエンコード文字をデコードする順序に問題があり、二段階デコードが必要なパターン(例えば「%2e」を含むケース)でチェックが漏れる状況が発生しました。この影響により、本来除去されるべき「..」相当のパス要素が残存してしまい、結果として不正なパスが許容されるという脆弱性が露見したのです。Apache 2.4.49での変更は善意からの機能向上でしたが、残念ながらそれが脆弱性という形で裏目に出てしまった例と言えます。このように、ソフトウェアにおける変更・リファクタリングは新機能の追加だけでなく、既存の安全策の抜け穴を生んでしまうリスクがあることが改めて示されました。
チェック漏れが生んだ脆弱性の詳細:「.%2e」エンコードによるディレクトリ横断
本脆弱性の核心部分は、Apacheの正規化処理におけるチェック漏れです。特に注目すべきは「.%2e」という文字列の扱いでした。本来、Apacheはパス中に「../」が含まれていないかをチェックし、あればセキュリティ上ブロックする設計でした。しかし、攻撃者は「.(ドット)を%2eというエンコード表現に置き換える」ことでこのチェックを回避しました。例えば、「….//(ドット4つとスラッシュ2つ)」というパスは「../」と等価ですが、Apache 2.4.49では「.%2e/」という形で送られた場合に二つ目のドットを適切に認識できないという欠陥があったのです。技術的には、Apacheのコードがパーセントエンコードを一文字ずつ処理していたため、「.%2e」の先頭の「.」はドットとして認識するものの、その後の「%2e」を一度のループでデコードせずスキップする挙動となり、結果「..」とは判断されませんでした。そのため、正規化後のパスから「..」を除去するロジックが働かず、ディレクトリ横断シーケンスがそのまま残存することになりました。攻撃者はこれを利用して、/cgi-bin/.%2e/.%2e/… のように「.%2e」を繋げたパスを作り、ドキュメントルートの外側へのアクセスを実現したのです。チェック漏れの詳細な技術分析では、Apacheのソースコード中でdecode_pathに相当する関数が、パス文字列中の「%xx」を逐次デコードする処理において2バイト以上に渡るエンコードシーケンスの扱いにバグがあったことが指摘されています。この例では「%2e」は「.」にデコードされるべきところを見逃し、「.%2e」が「..」とみなされなかったわけです。結果として、本来想定していたセキュリティチェックが機能せず、脆弱性が生まれました。このようなチェック漏れは一見小さな実装ミスですが、セキュリティ上は重大な抜け穴となり得ることが改めて示されました。
ディレクティブ設定(Require all granted)の影響と役割
Apacheの設定における
CVE-2021-41773の不十分な修正がCVE-2021-42013を招いた原因と経緯
ApacheがCVE-2021-41773に対処するためにリリースしたバージョン2.4.50でしたが、この修正は残念ながら不十分でした。修正の目的は、前述した「.%2e」のようなエンコードパターンを含むパストラバーサル攻撃をブロックすることでした。Apache開発チームは問題の正規化処理コードを修正し、パーセントエンコードの扱いを改善しました。しかし、2.4.50のリリース後、セキュリティ研究者たちはすぐさまその修正内容を解析し、別の抜け道を発見しました。それが、二重エンコード(double encoding)を利用した攻撃です。2.4.50では単一の%エンコードは対策されていたものの、「%%32%65」(%自体を%25にエンコードし、続けて32と65もエンコードしたシーケンス)というような特殊な二重エンコードシーケンスについて完全には考慮できていませんでした。そのため、攻撃者は2.4.50に対し、従来「.%2e」と送っていた部分を「%%32%65」に置き換えることで、再びパストラバーサルが可能であることを確認しました。この問題に対して付与されたのがCVE-2021-42013です。経緯としては、2.4.50公開(10月5日)からわずか数日でこの不備が指摘され、Apacheは10月7日に再度の修正リリース(2.4.51)を余儀なくされました。不十分な修正が新たな脆弱性を招いた原因は、攻撃パターンの網羅漏れにあります。非常に多くのパターンを攻撃者は試みるため、開発側のテストやチェックがそれに追いつかなかったのです。このケースから学べるのは、脆弱性修正時には可能な限り包括的な対策を講じる必要があること、そして修正後も追加検証やペネトレーションテストを行う重要性です。Apacheプロジェクトは迅速に2.4.51を出し対応しましたが、ひとたび不完全なパッチが公開されると攻撃者に逆手に取られてしまうリスクが高まることが露見しました。この意味でも、CVE-2021-41773とCVE-2021-42013の連続発生は、セキュリティコミュニティにパッチの品質確保と迅速な再修正の難しさを改めて認識させる出来事となりました。
パス正規化の重要性と今回の教訓(セキュアコーディングの観点)
今回のApache脆弱性を通じて浮き彫りになった教訓の一つは、パス正規化の重要性です。ファイルパスの正規化処理は、一見地味な内部実装のように思えますが、セキュリティ上極めて重要な役割を果たしています。開発者は「../」やエンコードされたパス文字列が悪用される危険性を常に念頭に置き、パス処理コードを記述しなければなりません。もし正規化が適切でなければ、どんなに他の部分を堅牢にしても攻撃者に裏口を開け渡すことになります。セキュアコーディングの観点からは、入力値の想定外フォーマットに対する防御が基本原則です。今回の場合、Apache開発チームももちろんその原則を理解していたはずですが、それでも見逃しが起きてしまいました。これほど大規模なプロジェクトでもエッジケースの見落としが起こり得ることは、他のソフトウェア開発者にも示唆的です。教訓としては、コードレビューやセキュリティテストにおいて、通常とは異なるエンコード・エスケープシーケンスの扱いを重点的に確認する必要があるという点です。また、オープンソースプロジェクトでは世界中の研究者が脆弱性検証を行うため、開発者側もパッチ提供後のコミュニティからのフィードバックを迅速に取り入れる体制が重要でしょう。結果的にApacheは素早く2度目の修正をリリースしましたが、理想的には最初の修正で完璧に対処できていればユーザーの負担も減ったはずです。加えて、多重防御 (Defense in Depth) の重要性も再認識されました。仮にアプリケーションコードにバグがあっても、OSレベル・設定レベルで防御策があれば被害を未然に防げることがあります。ApacheのRequire all deniedはその一例でした。このように、今回の脆弱性から得られる教訓は、セキュアコーディングにおける想定外入力への備えの重要性、そして多層的な防御の有用性であり、今後の開発・運用に活かすべきポイントとなりました。
Apache HTTP Serverパストラバーサル脆弱性の悪用の可能性と攻撃手法:考えられる攻撃シナリオ
ここでは、本脆弱性が実際にどのように悪用され得るか、その攻撃シナリオについて具体的に説明します。攻撃者が脆弱なApacheサーバに対して行う可能性のある攻撃方法や手順、実際のリクエスト例、そして攻撃により達成される不正行為の内容を順を追って見ていきます。また、この脆弱性を狙ったエクスプロイトコードやツールの公開状況についても触れ、実際にどの程度現実的な脅威となっているかを示します。
HTTPリクエストを悪用した攻撃手法:特殊なURLパス構造の利用例
攻撃者がApacheのパストラバーサル脆弱性を悪用する際、手段として用いるのは細工されたHTTPリクエストです。具体的には、通常ではアクセスできないファイルパスを含むURLをリクエストする方法となります。例えば、本脆弱性の存在するApache 2.4.49/2.4.50に対し、攻撃者は以下のような特殊な構造のURLを生成して送信します。
GET /cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd HTTP/1.1
この例では、/cgi-bin/ディレクトリから上位に4回遡り(.%2e/.%2e/.%2e/.%2e)、システムの/etc/passwdファイルに到達しようとしています。本来であれば../../../../etc/passwdと書くところを、.%2eというエンコード表現で..を隠しています。このような特殊なURLパス構造を使うことで、前述したApacheの正規化処理の抜け穴を突き、サーバはリクエストされた/etc/passwdを開いてしまうわけです。他にも、/icons/.%2e/や/foo/.%2e./のように、Alias設定されたパスや別ディレクトリを経由するパターンも確認されています。重要なのは、攻撃者がHTTPリクエスト行の中に悪意あるパス指定を盛り込むだけで攻撃が完結するという点です。特別な前提条件やセッション確立は不要で、未認証の状態から単発のリクエストで攻撃が成立します。攻撃手法としては非常にシンプルであり、だからこそ自動スキャンなどで広範囲に試行されやすい特徴があります。このURLパスを悪用した攻撃に対し、サーバ側で脆弱性が存在するとHTTP 200 OKとともに機密ファイルの内容が返ってきてしまうため、攻撃者はそれを得て次のステップに進むことができます。一連の攻撃手法はHTTPの基本的なGET/POSTリクエストを乱用するだけなので、防御側としてはWAF(後述)などでパターン検出する以外に、サーバ自身のアップデートが不可欠となります。
ファイル閲覧攻撃の例:脆弱なサーバから「/etc/passwd」を取得する方法
実際に観測された攻撃例として、Linux系サーバにおけるパスワードファイル/etc/passwdの窃取があります。攻撃者は前述のようにパストラバーサルを利用して/etc/passwdをリクエストし、その内容を取得しようとします。具体的なHTTPリクエスト例を挙げると、以下のようになります。
GET /cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd HTTP/1.1
Host: [ターゲットサーバ]
User-Agent: [攻撃者のツール名]
Accept: */*
Connection: close
脆弱なサーバであれば、このリクエストに対してHTTP 200 OKが返り、レスポンスボディに/etc/passwdの内容が含まれます。/etc/passwdファイルにはシステム上の全ユーザーアカウント名とその設定情報が記載されており(近年はパスワードハッシュは/etc/shadowに分離されていますが)、これを入手することで攻撃者はターゲットシステムのユーザー名一覧やシェルの種類など様々な情報を得られます。この手法は非常に単純であるため、攻撃者は自動スクリプトを用いてインターネット上のIPレンジに対し一斉にこのリクエストを送りつけ、応答のあったサーバを「ヒット」として絞り込むスキャンを行います。実際の攻撃キャンペーンでは、脆弱性公表からわずか数時間〜数日で大規模なスキャンが行われたことが報告されています。これは、攻撃コードが公開され誰でも容易に実行できる状態になっていたためです。攻撃者に取得された/etc/passwd情報そのものは機密度が限定的かもしれませんが、そこから推測されるユーザー名を使って他のサービスへのブルートフォース攻撃が行われたり、システム構成の把握(例えばどのサービスユーザーがいるか)に役立てられる可能性があります。また、この攻撃方法が成功したということは他の重要ファイルも同様に読み取れることを意味するため、攻撃者は/etc/passwdに続いて別の標的ファイル(データベース設定ファイルなど)の取得も試みるでしょう。このように、典型的なファイル閲覧攻撃の例として/etc/passwd取得はしばしば行われ、脆弱性評価やデモンストレーションにおいても引き合いに出される攻撃です。管理者は自社のサーバのログを確認し、このようなリクエストが来ていないか(または応答していないか)チェックすることが望まれます。
Apache 2.4.50への攻撃:二重URLエンコードを用いたフィルタ回避
Apache 2.4.50はCVE-2021-41773への対策がなされたバージョンですが、前述の通り不完全であったため攻撃者は二重URLエンコードという手法でフィルタを回避しました。2.4.50では単純な「.%2e」のシーケンスはブロックされましたが、攻撃者は「%%32%65%%32%65/」といった二重にエンコードされたパスを送りつけました。これを最初にデコードすると「%2e%2e/」となり、さらにデコードすると「../」に戻ります。Apache 2.4.50の正規化処理はこの二重エンコードパターンを網羅できていなかったため、結局../として認識されずに通過してしまいました。攻撃シナリオとしては、基本的には2.4.49への攻撃と同じく機密ファイルを読むことが目的ですが、攻撃側は2.4.50にも通用するよう攻撃ペイロードを調整した形です。実際に2.4.50に対して送られたリクエスト例は以下のようなものでした。
GET /cgi-bin/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd HTTP/1.1
このように「%%32%65」というパターン(%2eの%をさらに%25にしたもの)を連ねています。2.4.49では不要だった複雑なエンコードを用いる点が特徴です。攻撃者から見ると、パッチが当たった後でもなお攻撃が継続可能であったことから、彼らは躊躇なく2.4.50に対する攻撃も行いました。2.4.49だけでなく2.4.50も標的になったことで、脆弱性が完全に塞がれる2.4.51が出るまでは、影響範囲が事実上拡大した状態でした。この二重エンコード攻撃は、セキュリティ研究者が実証コード(PoC)をすぐに公開しており、それを基に攻撃者も動いたと考えられます。フィルタ回避として二重エンコードを活用したこのケースは、シグネチャベースの防御を困難にする例でもあります。単純な文字列検知ではなく、複雑なパターンマッチや実際のデコードをしなければ悪用を検知できないため、防御側の負担は増大しました。結局、この攻撃手法はApache 2.4.51で完全に無効化されましたが、2.4.50運用中のサーバは一時的に非常に危険な状態に置かれることになりました。
リモートコード実行のシナリオ:CGI経由でシェルを起動しコマンド実行する方法
リモートコード実行(RCE)の具体的な攻撃シナリオも確認されています。本脆弱性とCGIの組み合わせを悪用した攻撃では、攻撃者はサーバ上のシェルを実行可能なパスにエスケープし、そこへHTTPリクエストでコマンドを送り込む手口をとります。実例として報告されたのは、/cgi-bin/下からシェルを起動するリクエストです。
POST /cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh HTTP/1.1
Host: [ターゲット]
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
echo;id
このリクエストでは、/cgi-bin/からパストラバーサルで/bin/sh(Unixシステムのシェル)に到達し、HTTPのPOSTメソッドでecho;idというコマンドを実行させようとしています。Apacheは/bin/shをCGIスクリプトのように扱い、その標準入力にecho;idを渡して実行してしまうわけです。応答として、HTTP 200 OKとともにuid=… gid=…というidコマンドの結果が返ってきたことが確認されています。これはつまり、攻撃者の送信したコマンドがサーバ上で実行されたことを意味します。idコマンドの結果から、実行権限はdaemonユーザー(Apacheが動作するユーザー)であることが多いですが、たとえ限定ユーザーでもサーバ上で任意コマンドを実行できるインパクトは非常に大きいです。攻撃者はこの方法で、例えばwgetコマンドを使ってマルウェアをダウンロード・起動したり、echoでバックドア用スクリプトを書き込んだりと、自由自在に悪意ある操作を連鎖させることが可能になります。シェルを経由したRCE攻撃は、本脆弱性にCGI有効という条件が揃った場合の最悪のシナリオです。現実に、このシナリオを実行するPoC(概念実証)コードやMetasploitモジュールも登場し、脆弱性公開後数日で実際の攻撃が確認されました。組織にとって、単なる情報漏洩の脅威から踏み込んでシステム全体の乗っ取りというフェーズに進みかねないため、RCEシナリオは最も警戒すべきものです。このケースではApacheのアクセス権限によってはOS全体への被害は限定されるかもしれませんが、Webサーバの破壊や他の内部システムへのピボット(踏み台化)も考えられるため、絶対に看過できません。
公開されたエクスプロイトコード(PoC)とMetasploitモジュールの状況
脆弱性が公表されると同時に、セキュリティ研究者やコミュニティはエクスプロイトコードをインターネット上に公開しました。今回のApache脆弱性でも、GitHubやExploit DatabaseなどにPoC(Proof of Concept)コードが複数投稿されました。これらのPoCは、上記で説明したパストラバーサルによるファイル取得や、RCEまで一連の攻撃を自動化するスクリプトです。特に有名な攻撃フレームワークであるMetasploitにも、本脆弱性を悪用するモジュールが迅速に追加されました。Metasploitモジュールでは、ターゲットのURLとポートを指定するだけで、脆弱性の検査およびシェル取得(ペイロード送信)ができるよう実装されています。攻撃者はこれら公開されたツールを利用することで、自身で詳細を理解していなくても簡単に攻撃を仕掛けることができてしまいます。また、PoCの公開によって善良な管理者側もテストが可能になりますが、同時に悪意ある者にも情報が広まるという両刃の剣です。本脆弱性の場合、公開翌日には複数のPoCコードが確認されており、その拡散速度は非常に速いものでした。FortinetやTrendMicroなどのセキュリティ企業は、これらのエクスプロイトコードの存在を警告し、適用可能な全サーバへの速やかなパッチ適用を呼びかけました。エクスプロイトコードが出回っている状況では、専門知識のないスクリプトキディ(Script Kiddies)でさえ攻撃に参加でき、被害が一気に拡大する傾向があります。実際、本脆弱性に関してはShodanなどの検索エンジンを使ってApache 2.4.49/2.4.50を探し出し攻撃する例も見られました。管理者にとっては、こうした攻撃コードの公開状況を把握し、「既に攻撃手法が誰の手にも渡っている」ことを前提に防御策を急ぐ必要がありました。
Apache HTTP Serverパストラバーサル脆弱性への対策方法と推奨対応:設定見直しとアップデート
深刻な脆弱性が明らかになった際には、迅速かつ的確な対策が求められます。ここでは、Apache HTTP Serverのパストラバーサル脆弱性(CVE-2021-41773/CVE-2021-42013)に対して取るべき具体的な対策方法と、システム管理者への推奨対応を解説します。緊急アップデートの適用、設定の見直し、暫定措置、そして将来的なセキュリティ運用の改善まで、包括的にカバーします。
脆弱性修正済みバージョン2.4.51への早急なアップデートを推奨
まず最優先の対策は、Apache HTTP Serverを脆弱性が修正された最新版へアップデートすることです。Apache Software Foundationは本脆弱性に対処したバージョンとして2.4.51をリリースしました。したがって、現在2.4.49または2.4.50を使用している場合は、直ちに2.4.51以降のバージョンに更新することが強く推奨されます。アップデートに際しては、まずApache公式サイトやディストリビューション提供元から最新バージョンを入手し、既存環境へ適用します。Apacheの設定やモジュール構成に大幅な変更はないため、通常バージョンアップによる互換性問題は小さいと考えられますが、事前にテスト環境で動作確認を行うことが望ましいでしょう。組織のセキュリティポリシー上、正式リリース後すぐの適用に慎重になる場合もあるかもしれませんが、今回のように既に攻撃が発生しているゼロデイ脆弱性では時間との勝負です。適用を遅らせた場合、公開サーバであれば攻撃を受けるリスクが常に存在します。Apache 2.4.51へのアップデート作業自体はそれほど複雑ではなく、ソフトウェアの置き換えとサービス再起動で完了します。重要なのは計画を先延ばしにしないことで、脆弱性の深刻度を考慮すれば緊急メンテナンスを実施してでもアップデートすべき事案と言えます。アップデート後、バージョンが正しく2.4.51になっていること(httpd -vコマンド等で確認)を検証し、脆弱性が解消されたことを確認してください。なお、将来的にもApacheのアップデート情報には注意を払い、新たな脆弱性が報告された際は迅速に対応できるよう、社内の手順やルールを整えておくことが重要です。
暫定対策: ディレクティブを「Require all denied」に設定しアクセス制限
もし何らかの理由で直ちにApacheをアップデートできない場合、暫定的な緩和策を講じる必要があります。その一つとして、Apacheの設定ファイル(httpd.confなど)を見直し、ルートディレクトリ
mod_cgiの無効化など不要な機能を停止してRCEリスクを低減
次に、環境によっては不要な機能を無効化することでリスクを下げることもできます。特に、前述したRCEの要因となるmod_cgi(またはmod_cgid)モジュールについて、もしCGIが不要であればこれを無効化することを検討してください。mod_cgiを無効にするには、Apacheの設定ファイルで当該モジュールをロードしている行(例: LoadModule cgid_module modules/mod_cgid.soなど)をコメントアウトし、Apacheを再起動します。こうすることで、たとえパストラバーサル攻撃を受けても、CGI経由で任意コード実行される危険性を排除できます。現代のWebサイトではCGIを使わないケースも多いため、不要であれば積極的に停止するのが良いでしょう。加えて、他にも不要なAlias設定やディレクトリ公開設定があれば一時的にでも解除しておくと安全性が増します。例えば、デフォルトで用意されている/icons/ディレクトリのAliasなど、使用していないならコメントアウトしておくことで攻撃経路を減らせます。また、OSコマンド実行系のモジュール(cgi以外にも、例えばmod_phpで古いPHPバージョンが動いているなど)があれば、このタイミングで最新化または無効化を検討してもよいでしょう。不要な機能を止めることは、平常時から推奨されるセキュリティのベストプラクティスでもあります。特に今回のように、モジュールの有無で被害の深刻度が大きく変わるケースでは、その判断が脅威軽減に直結します。ただし、運用上必要な機能まで停止すると業務に支障が出るため、あくまで「不要なもの」という観点で取捨選択してください。もしCGIが必要な場合でも、脆弱性修正までの短期間であれば一時的にサービス提供を停止する決断も検討すべきです。組織のセキュリティ基準に照らして、何を優先すべきかを考え、一時的な機能停止とセキュリティ確保のバランスを取ることが重要です。
WAFやIDS/IPSによる「.%2e」攻撃パターンの検知とブロック
ネットワークレベルやアプリケーションレベルで導入しているWAF(Web Application Firewall)やIDS/IPS(侵入検知/防御システム)がある場合、これらを活用して攻撃パターンをブロックすることも対策の一つです。多くのセキュリティベンダーは、本脆弱性が公表されると迅速にシグネチャ(攻撃検知ルール)を配信しました。例えば、「.%2e」や「%%32%65」といった特徴的なパターンを持つリクエストを検知・遮断するルールが追加されています。クラウド型WAFサービス(AWS WAFやCloudflareなど)でも、Apache Path Traversal攻撃と識別して自動でブロックする設定が順次提供されました。これらを適用し、リアルタイムで攻撃トラフィックを弾くことで、脆弱性が残ったサーバを防御層で守ることができます。ただし、WAF/IPSのシグネチャ対応には限界もあることに注意が必要です。攻撃者がシグネチャ回避のためにパターンを変えてくる可能性(例えば別のエンコード手法)もあり、完璧ではありません。それでも、既知の攻撃パターンをかなりの精度で止められるのは事実なので、導入している組織は必ず最新のシグネチャへアップデートしてください。また、WAF/IDSを運用していない場合でも、急遽オープンソースのModSecurity(Apache用WAFモジュール)を導入し、緊急ルールを適用するという選択もあります。ModSecurityにはOWASP Core Rule Setがあり、ディレクトリトラバーサル攻撃に対するルールも含まれていますので、一時的にでも導入する価値はあります。総じて、多層防御の観点から、ネットワーク/ミドルウェアレベルでの攻撃検知・遮断は、ゼロデイ攻撃が飛び交う状況下では非常に重要です。人的リソースや製品導入の制約もあるかもしれませんが、可能な限りの防御策を重ねておくことが望ましいでしょう。
恒久対策:継続的なアップデート適用とセキュリティ情報モニタリング
最後に、恒久的な対策として組織全体でセキュリティ運用を強化することが求められます。具体的には、今回の教訓を踏まえ以下のような取り組みを継続してください。
– 継続的なアップデート適用: Webサーバ(Apache)に限らず、OSやミドルウェア、フレームワークなども含め、定期的にセキュリティアップデートを適用する習慣を維持します。今回のような緊急パッチにも迅速に対応できるよう、パッチ管理のプロセスを整備し、自動通知や定期チェックを行いましょう。
– セキュリティ情報のモニタリング: JPCERT/CCやApache公式セキュリティ勧告、各種脆弱性データベース(JVN, NVD)を定期的に確認し、自社に関連する脆弱性情報を見逃さないようにします。特にApacheは重要インフラですので、重大な脆弱性情報は早期警戒情報としてキャッチアップする仕組みを作ると良いでしょう。
– 設定・構成管理の徹底: デフォルト設定の確認や、不要な機能が有効化されていないかの棚卸しを行い、安全な構成ガイドラインに沿ってサーバ設定を維持します。設定変更は必ずレビューを経て行い、誤った緩和(例えばRequire all grantedの安易な利用)がないようにプロセスを定めます。
– 脆弱性スキャナの活用: 自社システムに脆弱性が残っていないか、定期的にネットワーク/ウェブアプリケーションの脆弱性スキャンを実施します。例えばQualysやNessusなどのスキャナーには今回のApache脆弱性を検出するQID/プラグインが追加されましたので、そうしたツールで自己診断するのも有効です。
– インシデント対応計画の整備: 万一攻撃を受けた場合に備え、ログ監視やインシデント発生時の手順を定めておきます。今回のようなゼロデイ攻撃では被害が発生してから気付くケースもありますので、ログに「.%2e」のリクエストがないか日次でチェックするなど、監視体制を強化しましょう。
これらの恒久対策は、一朝一夕には整いませんが、継続的に実施することで組織のセキュリティ耐性を高めます。Apache脆弱性への対応はその一環と位置付け、再発防止策かつ全般的なセキュリティ向上の機会と捉えて計画的に取り組むことが重要です。
Apache HTTP Serverパストラバーサル脆弱性の修正版・パッチ情報:修正バージョンと適用方法
ここでは、本脆弱性に対して提供されたApache HTTP Serverの修正版(パッチ)情報について整理します。どのバージョンで修正されたのか、パッチの内容、アップデートの方法や注意点、そして各環境(Linuxディストリビューション等)でのアップデート提供状況を説明します。また、脆弱性公表から修正までのApacheプロジェクトの対応時間線についても触れ、今後の参考とします。
Apache HTTP Server 2.4.51で修正された内容(パス正規化処理の改善)
Apache Software Foundationは、CVE-2021-41773およびCVE-2021-42013に対応する修正をApache HTTP Server 2.4.51にて行いました。2.4.51では、問題のあったパス正規化処理のロジックが改良され、エンコードされた「..」シーケンスも確実に検出・ブロックできるようになりました。具体的には、パーセントエンコードの解釈ルーチンが強化され、従来漏れていた「%2e」「%%32%65」のような特殊な入力も正しく「.」や「..」に正規化した上で、ディレクトリ横断を示すパターンとして除去するよう修正されています。また、Aliasやcgi-binディレクトリなどを経由するパスにも追加のチェックが入れられ、ドキュメントルート外への参照がより広範囲に防止されています。リモートコード実行リスクに関しても、mod_cgiが有効な場合でも不正なパスで任意のシェルに到達できないことが確認されています。Apache 2.4.51のリリースノートによれば、この脆弱性修正は重要度「Critical」として扱われ、ユーザーに直ちにアップグレードするよう勧告が出されました。なお、2.4.51では他にもいくつかのバグ修正や安定性向上が含まれていますが、セキュリティ上の目玉は本脆弱性の修正です。ソースコードレベルでは、正規化処理を担うap_normalize_path関数周辺が変更されており、より堅牢なパスサニタイズが実装されました。総じて、2.4.51へのアップデートを適用すれば、本脆弱性に関しては完全に対処された状態となります。以降のバージョン(2.4.52等)でもこの修正は引き継がれているため、長期的にもこの問題が再発しないようApache開発チームがケアしています。
最新版(2.4.x)へのアップグレード方法と実施時の注意点
Apache HTTP Serverを最新版にアップグレードする方法は、主にソースからのインストールかパッケージマネージャ経由かの2通りがあります。ソースからインストールしている場合、Apache公式サイトから2.4.51のソースコードをダウンロードし、コンパイル・インストールを行います。具体的には、./configure –prefix=[インストール先]やmake && make installの手順となりますが、既存設定ファイル(httpd.confなど)を上書きしないよう注意して進めます。一方、Linuxディストリビューション(例: Ubuntu, CentOSなど)のパッケージを利用している場合、各ディストリのリポジトリで提供される更新版を取得します。Ubuntuならapt update && apt install –only-upgrade apache2、CentOS/RHEL系ならyum update httpdといったコマンドでアップグレードできます。実施時の注意点としては、事前のバックアップが挙げられます。Apacheの設定ファイルやサイトの動的モジュール設定など、アップグレードで影響を受ける可能性のあるファイルはバックアップしておきましょう。また、アップグレード後に動作確認を念入りに行うことも重要です。脆弱性修正のみであれば通常は既存サイトはそのまま動作するはずですが、万が一サービス停止や機能不全が起きれば元に戻す判断も必要ですので、メンテナンスウィンドウを確保してアップグレード作業を行うようにします。特に商用環境では、Apacheのバージョンを上げる前後でユーザーアクセスへの影響を最小にする計画を立ててください(ロードバランサがあれば片方ずつアップグレードする、事前にアナウンスする等)。さらに、古いバージョン特有のモジュール(例えば2.2系の互換モジュールなど)を使用している場合、2.4.51で非推奨になっていないかを確認します。基本的には2.4.x系の中でのアップデートなので大きな問題は起きませんが、注意深くログを監視し、問題があればApacheのエラーログにヒントが出ていないか確認しましょう。最後に、アップグレード後も定期的なメンテナンスを怠らないことがポイントです。新たなアップデートが出た際には速やかに適用するというサイクルを維持してください。
Apache公式セキュリティ勧告とパッチ情報の入手方法
Apache HTTP Serverの脆弱性情報やパッチ情報は、主にApache公式サイトのセキュリティ勧告ページから入手できます。Apache HTTP Serverにはバージョンごとのセキュリティ情報ページがあり、2.4系の場合は「Apache HTTP Server 2.4 vulnerabilities」として一覧が公開されています。今回の脆弱性についても、httpd.apache.orgのセキュリティ欄にCVE番号と概要、影響バージョン、対策バージョン等が掲載されました。管理者はこの公式情報を確認し、信頼性の高い情報源からパッチ適用判断を行うことが重要です。また、JPCERT/CCやJVN(Japan Vulnerability Notes)など国内の情報提供サイトでも日本語で注意喚起が行われていますので、それらをフォローすることで母国語での理解を助けることができます。特にJPCERT/CCの緊急情報やJVNの脆弱性対策情報には、開発元へのリンクや詳細な解説が含まれており有用です。Apache公式のセキュリティ勧告では、本脆弱性は最初「重要度Important」として41773が扱われ、続いて42013で「重要度Critical」に引き上げられました。こうした重要度の変化も含め、公式発表を読むと背景がよく理解できます。パッチ情報に関しては、Apache 2.4.51のRelease Notesおよび変更差分(CHANGESファイルなど)を見ると具体的な修正箇所が記載されています。より技術的な興味がある場合は、Apacheのバグ追跡システムやGitリポジトリで該当コミットを確認することもできます。これらの情報を総合的に活用することで、単に「アップデートせよ」という指示だけでなく、なぜそうすべきか、アップデートで何が変わるのかを理解できます。組織内で他メンバーに説明・説得する際にも、公式情報の引用は説得力が高いため、ぜひ活用してください。さらに、Apacheのメーリングリストに登録しておくと新しい脆弱性情報をメールで受け取ることも可能です。総じて、信頼できるソースからタイムリーに情報収集する仕組みを持つことが、パッチ適用の遅れを防ぐ鍵となります。
主要Linuxディストリビューションにおけるパッチ適用状況(パッケージ更新)
Apache HTTP Serverは多くの場合Linuxディストリビューションの標準パッケージとして提供されているため、各ディストリビューションベンダーからも本脆弱性に対応するセキュリティアップデートがリリースされました。例えば、Red Hat系(RHEL/CentOSなど)ではRHSAアドバイザリとしてhttpdパッケージのアップデートが通知され、脆弱性修正済みのhttpd 2.4.51相当が提供されました。DebianやUbuntuでもセキュリティリポジトリに修正版パッケージが投入され、apt upgradeで適用できるようになりました。各ディストリビューションのセキュリティ情報サイト(例: Red Hat Customer Portal, Ubuntu CVE Trackerなど)にはCVE-2021-41773/42013に関するページがあり、対象となるパッケージバージョンや更新手順が案内されています。管理者は自社で採用しているOSに対応する情報を確認し、パッケージマネージャ経由でアップデートすることが推奨されます。特に商用サポートを受けている環境では、ベンダーからの通知(メールやサポートサイトのアラートなど)もあるはずなので、見逃さないようにしましょう。コンテナ環境(Dockerなど)でApacheを動かしている場合も、ベースイメージの更新が提供されているはずですので、新しいイメージへの差し替えを行ってください(例えば、httpd:2.4.51タグのイメージがDockerHubで公開されています)。なお、各ディストリでのパッチ適用状況を確認する際には、CVE番号で検索すると見つけやすいです。「CVE-2021-41773 [ディストリ名]」などで検索すれば、該当するアップデート情報のページに行き着くでしょう。こうした各プラットフォームごとの対応状況を把握し、統一的にアップデートを実施することが肝心です。社内に複数種類のOSが混在している場合でも、漏れなく全てカバーするよう、資産管理台帳などを活用してパッチ適用管理を行いましょう。
脆弱性発覚から修正までのApacheプロジェクトの対応タイムライン
最後に、Apacheプロジェクトが今回の脆弱性にどのようなスケジュールで対応したかを振り返ります。
– 2021年9月15日: Apache HTTP Server 2.4.49 リリース。この時点で本脆弱性がコード中に潜在。
– 2021年10月4日頃: 脆弱性がセキュリティコミュニティで発見され、Apacheに報告される。攻撃の兆候(ゼロデイ攻撃)も確認され始める。
– 10月5日: Apacheがセキュリティ勧告を公開し、CVE-2021-41773として脆弱性情報を発表。同日付けで修正バージョン2.4.50リリース。
– 10月6日: セキュリティ研究者らが2.4.50の修正を解析し、依然として残る脆弱性を発見(CVE-2021-42013として報告)。インターネット上ではPoCコードが出回り始め、攻撃が活発化。JPCERT/CCなどが注意喚起を発表。
– 10月7日: Apacheが追加のセキュリティ勧告を出し、CVE-2021-42013を公表。不完全修正であったことを説明し、緊急の再修正バージョン2.4.51をリリース。
– 10月8日以降: 各ディストリビューションやセキュリティ機関が、2.4.51へのアップデートをユーザーに促す。攻撃は継続して観測されるも、徐々に各サイトで対策が進み被害報告は下火に。
このタイムラインから、Apacheプロジェクトの対応は非常に迅速であったものの、一度パッチミスがあったことが分かります。初回報告から1日程度で2.4.50を出したスピードは称賛できますが、その後さらに2.4.51を出す羽目になった点は悔やまれます。ただ、結果的に公表から3日で完全修正まで漕ぎ着けたのは、オープンソースコミュニティの協力も大きかったでしょう。ユーザー側から見れば、10月5日と7日の2回アップデート対応が必要となり大変でしたが、この経験によりApache運用者のセキュリティ意識も向上したものと思われます。今後もApacheに限らず、新たな脆弱性が発覚した際には、このケースを教訓に迅速かつ確実な対応を心掛けたいところです。
Apache HTTP Serverパストラバーサル脆弱性の検証結果・PoC(Proof of Concept):脆弱性再現テストの報告
このセクションでは、本脆弱性に関する検証結果、いわゆるProof of Concept (PoC)による再現テストについて解説します。実験環境を構築して脆弱性を再現した様子や、PoCコードを用いた攻撃シナリオの実証結果、そしてそうした検証から得られた知見について報告します。また、脆弱性スキャナーで検出した際のログ例や攻撃の兆候についても触れ、管理者が何をもって脆弱性の有無や攻撃の発生を確認できるかを示します。
脆弱性を再現する検証環境の構築手順(Apache 2.4.49テスト環境)
まず、脆弱性を実際に再現して理解するために、テスト用の環境を構築しました。用意したのはApache HTTP Server 2.4.49をインストールした仮想マシン(Linux環境)です。セキュリティ上、本番環境とは隔離したネットワーク内に配置し、外部からアクセスできないようにしました。インストール後、脆弱性を有効にするために意図的に脆弱な設定を施します。具体的には、/etc/httpd/conf/httpd.conf(Apache設定ファイル)内で
次に、攻撃の踏み台となるクライアントマシンにPoCコードやcurlコマンドを用意し、テストを開始しました。環境構築のポイントとしては、本番と同じバージョン・設定を再現することが大切です。例えばOpenSSLなどApacheに連動するモジュールも本番同様に入れておくと、挙動がより実環境に近づきます。検証環境ではファイアウォールで外部遮断しつつ内部で自由に攻撃を試せるように設定しました。こうした検証用環境は脆弱性検証後に破棄する前提で、一時的に構築するのが望ましいです。
以上の準備により、脆弱なApache 2.4.49サーバと攻撃実行用クライアントが揃い、PoC実験が行える状態となりました。
PoCコードによるディレクトリトラバーサル攻撃の実証結果(/etc/passwdの取得)
まずはディレクトリトラバーサル攻撃によるファイル閲覧が再現できるかを確かめました。PoCコードとしてはGitHubで公開されていたPythonスクリプトを使用しました。このスクリプトは、指定したターゲットURLに対し.%2e/を繋げたパスでリクエストを送り、レスポンスを表示する簡易なものです。ターゲットを自前のApache 2.4.49サーバ(http://192.168.X.X)に設定し、取得ファイルとして/etc/passwdを指定して実行しました。
PoCコードは内部で以下のようなリクエストを生成していました。
GET //cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd HTTP/1.1
Host: 192.168.X.X
User-Agent: PoC-Test
Connection: close
このリクエストに対し、テストサーバはHTTP/1.1 200 OKを返し、ボディ部分に/etc/passwdの内容を含めて応答しました。出力された内容には、テスト用に用意していたダミーユーザー情報(root:x:0:0:… といった形式)が確認でき、「脆弱性によってサーバ外部から/etc/passwdが読み出せた」ことが実証されました。また、PoCコードはエラーハンドリングも実装されており、攻撃が失敗した場合は500番エラーや403禁止などのステータスを検知してその旨を出力するはずでしたが、今回は200番ステータスを受け取ったため成功と判断されています。
さらに、PoCコードを改変して別のファイル(例えば/etc/hostsなど)も取得してみたところ、同様に問題なく内容が取得できました。これにより、Apache 2.4.49が本脆弱性に対して無防備であることが改めて確認できました。検証時にはApacheのエラーログにも特に出力はなく、アクセスログには通常のGETリクエストとして記録されていました(パス部分に.%2eが含まれている点が異常なだけです)。ログレベルを上げると、正規化後のパスが/etc/passwdになってファイルを開いている様子をデバッグログにて確認できました。
以上のPoCによる実証から、ディレクトリトラバーサル攻撃は確かに有効であり、想定通りの情報漏洩が起こりうることが明白となりました。
Apache 2.4.50に対する二重エンコード攻撃の検証結果と考察
次に、Apache 2.4.50環境での検証も行いました。2.4.50は一度脆弱性を修正したバージョンですが、それが不完全という前提のもと、二重エンコード攻撃が通用するか試しました。テスト環境のApacheを2.4.50にアップグレードし(設定はそのまま脆弱な状態を維持)、先ほどと同様にPoCコードを実行します。ただし、PoCコードを少し改変し、パス部分に%%32%65(%2eの二重エンコード)を用いるようにしました。
改変後のPoCリクエストは例えば以下のようになります。
GET /cgi-bin/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd HTTP/1.1
Host: 192.168.X.X
…
これをApache 2.4.50サーバに送ったところ、驚くべきことに再びHTTP/1.1 200 OKが返ってきました。つまり、2.4.50でも/etc/passwd取得に成功したのです。レスポンス内容を確認すると、2.4.49の時と同じく/etc/passwdのダミー内容が含まれており、結果として2.4.50の脆弱性も再現されたことになります。Apache 2.4.50のエラーログには、この攻撃に対して「AH…: Potential path traversal attempt blocked」等のメッセージは一切出ていませんでした。これは、Apacheにとってこのリクエストが通常と異なる危険なものであると認識できていないことを意味します。
この検証結果から考察できるのは、やはり2.4.50での修正は不完全だったという事実です。二重エンコードというテクニックによって、単純なフィルタを回避できることが実証されました。2.4.50では一重の「%2e」は対処したものの、「%%32%65」を介した場合は想定範囲外となっていたのでしょう。これは、人間の目にも一見して分かりにくい攻撃文字列ですが、攻撃者はそれを容易に発見しました。
以上を踏まえ、Apache 2.4.50で安心していたサーバも、実際には危険に晒されていたことが検証により裏付けられました。この二重エンコード攻撃の検証は、組織に対して「パッチ適用後も検証を怠らない重要性」を教えてくれます。一度アップデートしたからといって安心せず、PoCコード等でしっかり攻撃がブロックされるか確認すべきです。今回、2.4.50適用直後に追加検証した組織であれば、すぐに異常に気付き2.4.51適用などの次の対応に移れたでしょう。このようなセキュリティ検証サイクルを回すことが、高いセキュリティレベルを保つ鍵だと再認識させられる結果となりました。
リモートコード実行(RCE)のPoC実験:シェルコマンド実行の確認
さらに踏み込んで、リモートコード実行(RCE)の再現実験も行いました。Apache 2.4.49 + CGI有効というテスト環境に対し、前述のRCE攻撃シナリオ(/bin/shへのPOSTリクエスト)をPoCコードで試します。PoCとしては簡易的に、curlコマンドを使って再現しました。
curl -X POST “http://192.168.X.X/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh” -d “echo;id”
このコマンドは、/cgi-bin/以下にあることになっている/bin/shに対して、echo;idというペイロードを送信するものです。実行するとHTTPレスポンスが返り、その中身にuid=… gid=… groups=…といった、idコマンドの出力結果が含まれていることを確認しました。すなわち、サーバ上で実際にコマンドが実行されたということです。Apacheのアクセスログを見ると、POSTリクエストが記録されており、ステータスコード200で応答している旨が残っています。エラーログには特に目立った出力はありません(サーバにとっては正規のCGI実行に見える)。
このRCE PoC実験により、パストラバーサル脆弱性を介して任意コード実行が可能なことがはっきりと証明されました。実験ではidコマンドだけでしたが、例えばuname -aやcat /etc/shadowなど別のコマンドを送り込むことも容易にできました。極端な話、nc(Netcat)やbash -iを使えばリバースシェルを貼り、攻撃者がサーバにインタラクティブにアクセスすることも理論上は可能です。PoC段階ではそこまで踏み込みませんでしたが、既にメモリ上にシェルを実行させられる状態になっているため、次のステップは攻撃者のやりたい放題という危険な状況です。
検証の際には、万一に備えてテストサーバ側でOutbound通信(外部への接続)をブロックしておき、リバースシェル等が実行されてもこちらに来るようにしました。また、テスト後は/var/tmpなどに不審なファイルが落とされていないか確認し、想定外の副作用がないことを確認しています。
RCE PoC実験の結果は重いもので、サーバ乗っ取りの可能性が現実的であったことを目の当たりにしました。このような実証は改めて脆弱性の危険度を認識させるとともに、対策の緊急性を裏付けるデータとなります。
脆弱性スキャナーでの検出結果とサーバーログにおける攻撃兆候
最後に、組織内で脆弱性診断を行った際の検出結果と、実際のサーバーログに現れる攻撃の兆候について説明します。
脆弱性発覚後、当社では商用の脆弱性スキャナー(QualysGuard)を用いて自社システムのチェックを行いました。QualysのWebアプリケーションスキャンには、本脆弱性に対応するQID(150372, 150373, 150374)が追加されており、スキャンを実行すると自動的にApache 2.4.49/2.4.50のパストラバーサルおよびRCEの検査が行われます。我々のテストサーバ(脆弱性あり)に対するスキャン結果では、「Apache HTTP Server Path Traversal (CVE-2021-41773) – QID 150372」としてHighリスクの所見が報告されました。具体的な検出内容には、「特殊なHTTPリクエストに対して/etc/passwdの内容が取得できることを確認」や「mod_cgi有効の場合はRCEの可能性あり」といった説明が含まれていました。これにより、手動検証と合わせて機械的な検知でも脆弱性が明確に判定されたことが分かりました。
また、実際の運用サーバのログを解析したところ、脆弱性公表後から特徴的なリクエストパターンが散見されました。アクセスログにおいて、”GET /cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd HTTP/1.1″というエントリや、他にも”.%2e/.%2e/.%2e/.%2e/bin/sh”に対するPOSTリクエストなど、明らかに通常業務では現れないリクエストが複数記録されていました。これらはいずれも外部の不審なIPアドレスからで、User-Agentも汎用的なものかカスタムツール名(例:”curl/7.68.0″や”ApacheTester”等)になっており、自動スキャンや攻撃ツールによるアクセスと判断できます。幸い、当該サーバはすぐに2.4.51へアップデート済みでRequire all deniedも適用していたため、攻撃自体は成功しておらず、ステータスコード403で応答していました。しかしログ上は攻撃の痕跡が残っており、もし対策が遅れていたらと思うと非常に危険な状況でした。IDSのアラートログでも、「Directory Traversal Attempt」として検知したログが複数上がっており、特に10月6~10日の期間に集中して観測されました。これは、まさに脆弱性公表直後に世界中の攻撃者が活発に活動した証左です。
管理者にとって、ログに見える攻撃兆候を見逃さないことも重要です。今後同種の脆弱性が出た際、ログを監視することで早期に「攻撃されている」ことに気付ければ、緊急対応の判断材料になります。今回のケースでは幸運にも事前に情報を得て対策できましたが、万一ゼロデイ攻撃だけ先に受けていたらログ解析が被害発見の鍵になっていたでしょう。
以上、検証および観測結果を総合すると、Apacheパストラバーサル脆弱性は容易に再現可能で、現実に多くの攻撃が行われたことが明確です。私たちはこの経験を活かし、今後もシステムのセキュリティ検証とログモニタリングを継続強化していく所存です。