エクスプロイト&脆弱性
脆弱性「CVE-2023-50164」の解明:Apache Strutsのファイルアップロード機能が不正利用されるリスク
Apache Struts 2に重大な影響を与え、パストラバーサル攻撃を誘発する脆弱性「CVE-2023-50164」について、技術的な視点を含めて解説します。
最近に入り、Webアプリケーション開発フレームワーク「Apache Struts 2」の脆弱性「CVE-2023-50164」に関する勧告が、Apacheから発表されました。この脆弱性のCVSSスコアは9.8であり、重大なリスクをはらんでいると考えられます。本脆弱性は、企業や組織が用いるApache Strutsのアーキテクチャや、そのファイルアップロード機能に深く絡んでいます。これが攻撃者に突かれた場合、パストラバーサル(本来アクセスできない領域にアクセスする)が行われ、不正なファイルのアップロード、リモートコード実行(RCE:Remote Code Execution)に繋がる可能性があります。一方、脆弱性「CVE-2017-5638」に比べると、スキャンの手法や不正利用できる機能に制限があります。そのため、攻撃者側から見ると、大規模な活動に利用する際の敷居は比較的高いものとなります。Apacheからは、Strutsのバージョンを2.5.33、6.3.0.2、またはそれ以上にアップデートするように推奨されています。
Apache Strutsはさまざまなシステム内に幅広く導入されていたこともあり、2017年に悪名高い「Equifax情報漏えい事件」が発生した際には、強い関心を集めました。この事件では1億4500万を超える人々が影響を受け、消費者信用調査機関が支払った和解金は7億米ドルに達しました。本事件で特に目を引く点は、わずか一度のスウィーピング(Sweeping)攻撃で200,000件に及ぶクレジットカード情報がEquifaxのハッカーに盗み取られたことです。
影響を受けたバージョン
本脆弱性の影響を受けるStrutsのバージョンは、2.5.0から2.5.32、および6.0.0から6.3.0までとなります。
- Struts 2.0.0 - Struts 2.3.37 (EOL)
- Struts 2.5.0 - Struts 2.5.32
- Struts 6.0.0 - Struts 6.3.0
脆弱性を解析
本脆弱性により、攻撃者はファイルアップロードのパラメータを操作し、パストラバーサルを行えるようになります。これにより、不正なファイルのアップロードやリモートコード実行にまで至る可能性があります。現状のシナリオでは、脆弱性のあるエンドポイントとして「/upload.action」が利用されます。
脆弱性の要因は、パラメータ中の大文字と小文字の区別に関して、考慮漏れがあったことです。修正前の脆弱なバージョンでは、HTTPパラメータの大文字と小文字を厳格に区別するため、「param1="value1"」と「Param1="Value1"」がそれぞれ別のものと見なされます。これに対し、Apacheチームが最近コミットした修正後のバージョンでは、HTTPパラメータの大文字と小文字を区別しないように、変更が入っています(図1)。
Apache Strutsの脆弱性を突く攻撃は、パラメータ汚染によって始まります。本シナリオにおいて、攻撃者はリクエストの初期パラメータを変更し、さらにもう1つのパラメータを「小文字」で追加します。この小文字のパラメータが引き金となり、システムが内部で使用するファイル名の変数が上書きされます。以上により、システム侵害が引き起こされます。
クラス「ActionSupport」がHTTPリクエストのパラメータを処理する際、ファイル名がパストラバーサルを含む内容に操作されていたとしても、それを拒否するような制御はされていません。本バグにより、図2のように以下に示されたメソッドがすり抜けられます。
AbstractMultiPartRequest.java
メソッド:getCanonicalName
そして、パストラバーサルを含む内容が以下の最終的なファイル名として残り続けます。
filename(getOriginalName())
Apacheチームによるコミット履歴からは、一時ファイルの削除に関する修正が確認されました。本修正に先立ち、ファイルのアップロードがあった際には、メソッド「getSaveDir」によって一時ファイルを一時ディレクトリ内に作成し、指定のパスを返却する処理がありました。しかし、ファイルの容量が一定以上の場合には、一時ファイルを削除しないパターンが存在します。これはセキュリティリスクを生み出すものであり、対象システム内で永続化する手段として、攻撃者に利用される可能性があります(図4)。一時ファイルの名前を攻撃者側で操作できる場合は、特にそのことが言えるでしょう。
Apacheチームによる修正内容を確認したところ、「アップロード後に一時ファイルを必ず削除する」ように変更されていました。本稿とは別の報告によると、ファイルサイズが一定の閾値を越えた場合には以下のメッセージのエラーが発生します。
struts.messages.upload.error.parameter.too.long
続いて、以下のメソッドが実行されます。
prepare.cleanupWrappedRequest(request)
しかし、ファイルの生成処理中、「Item.add」の操作が行われるタイミングで、当該ファイルが2つに分割されます。ファイルサイズが制限を超えた場合には、例外ハンドラの初期化が行われます。
攻撃用リクエストのサンプル
図5に、攻撃用リクエストの例を示します。パラメータ名として、大文字と小文字の双方を含む「Upload」が使用されています。
まとめ
脆弱性「CVE-2023-50164」は、今後も不正な活動の手段としてさまざまな攻撃者に利用され続け、世界各地の企業や組織に大きなセキュリティリスクをもたらすと考えられます。これを踏まえ、Apache Strutsをご利用の方は、早急に本脆弱性の修正パッチをサーバに適用し、攻撃に絡むリスクの軽減策を実施することを推奨します。また、本稿で挙げたような攻撃や脅威から企業や組織のシステムを保護する上では、「Trend Vision One™」のようなセキュリティソリューションが特に有効です。
Trend Vision One™ - Endpoint Securityは、下記のディープパケットインスペクション・ルールにより、今回の脆弱性を突いた攻撃からシステムを保護します。
- 1011933 - Apache Struts2 Remote Code Execution Vulnerability (CVE-2023-50164):Apache Struts2のリモートコード実行に繋がる脆弱性
TippingPointでは、本脆弱性に対応したCSW(Customer Shield Writer)ファイルを開示しました。ご利用のお客様は、当該ファイルをTMCからダウンロードいただけます。対応するルールは下記の通りです。
- 43563: HTTP: Apache Struts 2 Code Execution Vulnerability:Apache Struts 2のコード実行に繋がる脆弱性
参考記事:
Decoding CVE-2023-50164: Unveiling the Apache Struts File Upload Exploit
By: Jagir Shastri
翻訳:清水 浩平(Core Technology Marketing, Trend Micro™ Research)