発端
WebLogicはアメリカOracle社の主要製品で、ビジネス市場で主要となっているJava(J2EE)アプリケーションサーバのソフトウェア(application server)の一つです。2020年にハイリスクの脆弱性「CVE-2020-14882」と「CVE-2020-14883」が明らかになり、その内「CVE-2020-14882」のCVSS 3.1スコアは9.8に達し、緊急(Critical)レベルになりました。
脆弱性を利用したコマンドインジェクションにより、許可されていないリクエストがWebLogicのバックエンドへのログインなどの制限を通り抜け、最終的にRCE(Remote Code Execution, リモートコード実行)が可能になるため、攻撃者はこの脆弱性を利用して簡単に攻撃できるようになります。
テクニカル分析
はじめに、下図の脆弱性のPOCから見てみましょう。
図1、POC 攻撃例
WebLogicは、はじめにURLをチェックし、攻撃者がconsoleパス配下のファイルリソースにアクセスを試みると(段階A)、URLとWebLogicの設定ファイル(web.xml)内のWebページのリソースパスが比較され、同URLがいずれかのリソースパスに属している場合、認証なしでリソースにアクセスできるようになります(段階B)。web.xmlのファイルパスは、wlserver/server/lib/consoleapp/webapp/WEB-INF/web.xmlで、下図の通りです。
図2、web.xmlの内容
次に、
http://127.0.0.1:7001/console/images/%252E%252E%252Fconsole.portal
のURLデコードにより、%25が%に変更され、URLがhttp://127.0.0.1:7001/console/images/%2E%2E%2Fconsole.portal
になります(段階C)。ただし、UIServletInternal.getTree関数において、WebLogicは再度URLデコードを行い、%2E%2E%2Fが../、に変更され、URLが
http://127.0.0.1:7001/console/images/../console.portal
になります。また、その後の操作でWebLogicはパスの権限をチェックしないため、ディレクトリトラバーサル(Directory Traversal)の脆弱性が発生します。WebLogic Serverは、コンソール(console)のリクエストを処理する際、BreadcrumbBacking().init関数を呼び出して処理します(段階D)。URLにhandleパラメータが含まれている場合、handleをclassとargumentに分解します。POCを例にすると、classは
com.tangosol.coherence.mvel2.sh.ShellSession()
(段階E)になり、argumentは"java.lang.Runtime.getRuntime().exec(%27whoami%27);"
になります(段階F)。続いて、argumentがclassのconstructorに送信され、ShellSession関数が再度argumentをMVELInterpretedRuntime関数に送信します。最後にリフレクションを使用してargument内の悪意のあるコマンドを実行します。POCの例ではwhoamiとなります。
修正パッチのエピソード
しかし、ディレクトリトラバーサル、Unauthorized RCEなどの問題だけで、なぜ「今年最悪の脆弱性(Most Epic Fail)」と呼ばれるのでしょうか。
Oracleは2020年10月に修正パッチを公開しましたが、修正方法の詳細を確認したところ、Oracleは下図のようにブラックリストでURLパラメータをフィルタリングしていたことがわかりました。
図3、OracleのブラックリストによるCVE-2020-14882の修正
ブラックリストでフィルタリングすることの何が問題なのか
ブラックリストにない%252e%252eを利用すれば、修正パッチを適用したURLのチェックをバイパス(Bypass)できます。
多くのセキュリティ研究者が短時間でこの問題を発見し、Oracleに報告しました。この脆弱性も下図のようにCVE-2020-14750としてコードが付けられています。この間違った脆弱性の修復方法により、CVE-2020-14882も、2020年のPwnie Award Most Epic Failにノミネートされました。
図4、多くの研究員がCVE-2020-14750を報告
脆弱性の修復は奥の深い学問です。CVE-2020-14882を例にすると、ファイルパスのアクセス制御の不確実性、パスに対する2回のURLデコード、コンソールによるコードの実行などが原因となっています。しかし、当初Oracleは2回のURLデコードの問題のみを修正し、その修正方法もまたブラックリストによる制限でした。脆弱性の修復の不確実性はさらに多くの脆弱性を発生させるため、慎重に行わなければなりません。
影響について
攻撃者がこの脆弱性を組み合わせて利用することで、ログインせずにRCEが可能になり、認証情報のダンプ(Credential Dump)やラテラル・ムーブメント(Lateral Movement)といった攻撃が可能となります。
- 影響を受けた製品:WebLogic Server
- 影響を受けたバージョン:10.3.6.0.0、12.1.3.0.0、12.2.1.3.0、12.2.1.4.0、14.1.1.0.0
保護についてのアドバイス
- Oracle公式の最新の修正パッチを適用します: patch。
- 悪意のあるpayloadをチェックします。例:console.portalとpayloadに、
handle=...
パラメータが存在していないかチェックします。または直接console.portalとpayloadのhandle機能をオフにします。 - 以下のYARAルールをインポートし、脆弱性を利用したマルウェアが存在していないことを確認します。
rule CVE_2020_14882 {
meta:
author = "TeamT5"
description = "CVE-2020-14882 exploit"
strings:
$resource1 = "console/bea-helpsets/"
$resource2 = "console/framework/skins/wlsconsole/images/"
$resource3 = "console/framework/skins/wlsconsole/css/"
$resource4 = "console/framework/skins/wlsconsole/js/"
$resource5 = "console/framework/skeletons/wlsconsole/css/"
$resource6 = "console/framework/skeletons/wlsconsole/js/"
$resource7 = "console/css/"
$resource8 = "console/common/"
$resource9 = "console/images/"
$console1 = "console.portal"
$console2 = "consolejndi.portal"
$handle = "handle="
condition:
any of ($resource*) and 1 of ($console*) and $handle
}
図5、YARAルールにより、効果的にCVE-2020-14882 exploitを検出できる。
*画像のソース: Pixabay
Related Post
技術分析
2020.06.10
BlackHatでのトーク:SamsungのRoot of Trustを破壊 - Samsungのセキュアブートへの悪用
vulnerability research , D39, Black Hat, cyber threat intelligence, threat hunting
技術分析
2022.03.01
Mikrotik 脆弱性の開示と届出(CVE-2021-41987)
vulnerability research