技術分析
RSS

今年最悪の脆弱性!Oracle WebLogic CVE-2020-14882を深掘り

1.13.2021Sonar Team
Share:

発端

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から見てみましょう。
blog_2101-1.png 図1、POC 攻撃例

WebLogicは、はじめにURLをチェックし、攻撃者がconsoleパス配下のファイルリソースにアクセスを試みると(段階A)、URLとWebLogicの設定ファイル(web.xml)内のWebページのリソースパスが比較され、同URLがいずれかのリソースパスに属している場合、認証なしでリソースにアクセスできるようになります(段階B)。web.xmlのファイルパスは、wlserver/server/lib/consoleapp/webapp/WEB-INF/web.xmlで、下図の通りです。
blog_2101-2.png 図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パラメータをフィルタリングしていたことがわかりました。
blog_2101-3.png 図3、OracleのブラックリストによるCVE-2020-14882の修正

ブラックリストでフィルタリングすることの何が問題なのか

ブラックリストにない%252e%252eを利用すれば、修正パッチを適用したURLのチェックをバイパス(Bypass)できます。
多くのセキュリティ研究者が短時間でこの問題を発見し、Oracleに報告しました。この脆弱性も下図のようにCVE-2020-14750としてコードが付けられています。この間違った脆弱性の修復方法により、CVE-2020-14882も、2020年のPwnie Award Most Epic Failにノミネートされました。
blog_2101-4.png 図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
}
blog_2101-5.png 図5、YARAルールにより、効果的にCVE-2020-14882 exploitを検出できる。

*画像のソース: Pixabay
1.13.2021Sonar Team
Share: