capa v4: より広い .NET のキャスト

Figure 1: Hello World in C# and CIL news

.NET 実行可能ファイルの分析をサポートする capa のバージョン 4.0 を発表できることを嬉しく思います。このオープンソース ツールは、拡張可能なルール セットを使用して、プログラムの機能を自動的に識別します。このツールは、マルウェアのトリアージと詳細なリバース エンジニアリングの両方をサポートしています。 Capa について聞いたことがない場合、または復習が必要な場合は、 最初のブログ記事をご覧ください。 プロジェクトのリリース ページから capa v4.0 スタンドアロン バイナリをダウンロードし、GitHub でソース コードをチェックアウトできます。

capa 4.0 は、プログラムに関する分析と推論の能力を拡張する主要な新機能を追加します。このブログ投稿では、capa 4.0 に含まれる次の改善点について説明します。

  • .NET 実行可能ファイルをサポートする新しい分析バックエンドで、 Dark Crystal RATや JUNKMAIL/DoubleZero などのマルウェア ファミリを分析できます。

  • 新しい分析範囲は、ルールの評価を個々の命令に制限し、ルールの作成者がプログラム全体で使用される特定のニーモニックとオペランドの組み合わせを検査できるようにします。

  • 古いバージョンの capa を実行している場合でも簡単に更新できるように、ルールのメジャー バージョンのタグ付けを含む、ルール セットのリリース プロセスの明確化。

  • capa の実行を高速化し、より多くの種類の結果を表現できるようにする重大な変更のコレクション。

.NET サポート

capa v4.0 は、.NET 実行可能ファイルの分析をサポートする最初のバージョンです。この新機能により、.NET ファイルの機能をキャプチャするために、49 の既存のルールが更新され、22 の新しいルールが追加されました。読み進めて、.NET サポートでキャパを拡張した方法を理解してください。

オープンソースへの貢献

capa に .NET サポートを追加したことで、FLARE チームはオープンソースの .NET 分析プロジェクトに貢献する機会を得ました。 .NET 実行可能ファイルで見つかったメタデータを解析する Python ライブラリであるdnfileに新機能と更新をマージしました。また、Common Intermediate Language (CIL) 命令を逆アセンブルする Python ライブラリであるdncilもリリースしました。 dncil は、マネージ メソッド ヘッダー、CIL 命令、および例外ハンドラーを解析し、オブジェクト指向 API を介してデータを公開して、ライブラリを使用して CIL 分析ツールをすばやく構築するのに役立ちます。

.NET 特徴抽出

.NET は、 共通言語ランタイム (CLR)によって実行されるマネージド アプリケーションを構築するためのプラットフォームです。これらのアプリケーションは、C#、VB.NET、F# などの高水準言語で記述でき、低水準 CIL 命令にコンパイルされます。これらの CIL 命令は、それらを実行するために CLR によって使用されるメタデータと共に .NET ファイルに含まれています。図 1 は、C# から CIL にコンパイルされた「Hello World」メソッドの例を示しています。

Figure 1: Hello World in C# and CIL
図 1: C# と CIL の Hello World

capa は、.NET 実行可能ファイルに格納されているメタデータと CIL 命令から機能を解析します。たとえば、capa は dnfile を使用して、.NET ファイルで定義されたすべてのマネージ メソッドを記述する .NET MethodDefメタデータ テーブルを解析します。各テーブル エントリには、CIL 命令を含むメソッド本体のオフセットが含まれます。次に、capa は dncil を使用して各メソッド本体を逆アセンブルし、CIL 命令から機能を抽出します。図 2 は、例の「Hello World」メソッドからキャパが抽出した機能の内訳を示しています。

図 2: Hello World プログラムから抽出された .NET 機能
図 2: Hello World プログラムから抽出された .NET 機能

capa は、メソッド トークンと命令オフセットtoken(0x6000001)+0x6を使用して .NET 機能に対応します。これにより、リバース エンジニアはdnSpyなどの .NET 分析ツールを使用して、興味深いメソッドをすばやくナビゲートして調査できます。

図 3 は、 DOTWRAPとして追跡される .NET マルウェア Mandiant から逆コンパイルされた C# コードを示しています。このコードは、コンソール ウィンドウを隠し、 config.txtという名前のファイルからデータを読み取ります。

図 3: 逆コンパイルされた DOTWRAP .NET マルウェア サンプル
図 3: 逆コンパイルされた DOTWRAP .NET マルウェア サンプル

図 4 は、上記のサンプル コードからキャパが抽出した機能を示しています (この出力は、 scripts/show-features.pyヘルパー スクリプトを介して取得できます)。熱心な読者は、 namespaceclassapistring 、およびnumber機能を認識する場合があります。

図 4: DOTWRAP マルウェア サンプルから抽出された .NET 機能
図 4: DOTWRAP マルウェア サンプルから抽出された .NET 機能

System.IO.File::ReadAllLines API 呼び出しを既存のルールに追加するだけで、capa は DOTWRAP マルウェア サンプルのread file on Windowsを検出できるようになりました (図 5 を参照)。

図 5: DOTWRAP マルウェア サンプルの Windows ルール マッチでファイルを読み取る
図 5: DOTWRAP マルウェア サンプルの Windows ルール マッチでファイルを読み取る

図 5 に示すように、capa はkernel32.GetConsoleWindowuser32.ShowWindowの 2 つの API 呼び出しも抽出します。これらは、 Platform Invoke (P/Invoke)と呼ばれるテクノロジを使用して、バックドアのマネージ コードから呼び出されるネイティブの Windows API 関数です。 .NET ImplMapメタデータ テーブルには、P/Invoke を使用してマネージ コードから呼び出すことができるネイティブ関数が記述されています。各テーブル エントリは、マネージ メソッド ( MemberForwarded ) をネイティブ関数にマップします。ネイティブ関数は、 MemberForwardedメソッドを呼び出すことで実行でき、P/Invoke が詳細を処理します。

capa はImplMapテーブルを読み取り、 MemberForwardedメソッドをネイティブ関数にチェーンします。これにより、マネージ コードに実装されているネイティブ機能を検出できます。したがって、ここでは既存のルールを利用して、ネイティブの Windows 関数を介してウィンドウの非表示を検出できます。図 6 は、サンプル コードのキャパ マッチを示しています。

図 6: DOTWRAP サンプルでグラフィカル ウィンドウ ルールの一致を非表示にする
図 6: DOTWRAP サンプルでグラフィカル ウィンドウ ルールの一致を非表示にする

バージョン 4 の capa は、.NET ファイルから次のタイプの機能を抽出して分析します。

  • namespace例: System.IO
  • class例: System.IO.File
  • apiimportなど、 System.IO.File::Delete
  • function-name例: HelloWorld::Main
  • number
  • ストリング

また、マネージド コードとアンマネージド (ネイティブ) コードの両方を含む .NET 実行可能ファイルと、マネージド コードからネイティブ コードへの呼び出しをそれぞれ検出する 2 つの新しい特性を追加しました。

  • ミックスモード
  • unmanaged call

今後の .NET の作業

より多くの .NET 固有のルールを記述し、より多くの調査を行うにつれて、将来のバージョンで .NET 機能のサポートを拡張および強化する予定です。不足している機能に遭遇したり、良い追加のアイデアがある場合は、GitHubリポジトリでディスカッションを開いてください。

指示範囲

ルールの評価を個々の命令に制限する新しいスコープを追加しました。このルールにより、作成者は命令ニーモニックとオペランドの特定の組み合わせを一致させることができます。 capa の更新されたルール構文には、オペランドのnumberoffset値を指定する新しいoperand機能も含まれています。これにより、ルールの作成者は、構造体からのデータの移動や定数との比較など、ソースから宛先へのデータの流れを指定できます。

図 7 は、Adler32 チェックサム計算をより確実に検出するために新しいinstructionスコープとoperator機能を使用する例を示しています。 shr命令がそのソース オペランドとして数値0xFを使用する必要があることがいかに明確であるかに注目してください。これにより、capa が機能をより正確に照合できるようになり、人間の読者にとってルールが理解しやすくなります。これらの変更により、以前サポートされていた/x32および/x64フレーバーのnumberおよびoperand機能が削除されました。

図 7: 古いルール機能 (左) と新しい命令スコープおよびオペランド機能 (右)
図 7: 古いルール機能 (左) と新しい命令スコープおよびオペランド機能 (右)

ルールリリースプロセスとその他の変更

Capa に新しい機能や重大な変更を導入すると、ルールが特定のリリースまたは現在の開発ブランチと互換性がなくなる可能性があります。これを説明するために、ユーザーがそれぞれの capa バージョンの正しいルール ブランチを識別するのに役立つ明確なドキュメントを追加しました。つまり、ユーザーは、使用されている capa メジャー バージョンに対応する一致ルール ブランチを使用する必要があります。つまり、capa の v3 リリースには v3 ルールを使用し、capa の v4 リリースには v4 ルールを使用します。

capa には Python 3.7 以降が必要になりました。 capa の上に構築する場合は、抽出された機能を保存するためのフリーズ フォーマットと、capa の結果を保存および交換するための JSON 結果ドキュメントが更新されていることにも注意してください。さらに、アドレスの内部表現が変更され、ツールが追加のコンテキスト (.NET トークンやオフセットなど) を表現できるようになりました。

貢献する

新しい capa 機能がコミュニティをさらにサポートし、貢献を奨励する方法を楽しみにしています。あらゆる形式のフィードバック、アイデア、プル リクエストを歓迎します。開始するには、問題を開くか、寄稿ドキュメントをチェックするだけです。

ルールは capa の識別アルゴリズムの基礎です。ルールのアイデアがある場合は、 Issueを開くか、 capa-rules にプル リクエストを送信してください。このようにして、誰もがマルウェア分析コミュニティの集合的な知識から利益を得ることができます.

結論

最新の改善により、capa に .NET 実行可能ファイルの分析サポートが追加され、そのルールがさらに表現力豊かになります。 4.0 capa リリースには、バグ修正、新機能、フリーズおよび JSON 結果シリアル化形式の改善、および 60 を超える新しいルールと更新されたルールも含まれています。すべての更新の詳細については、キャパ変更ログを参照してください。

参照: https://www.mandiant.com/resources/blog/capa-v4-casting-wider-net

Comments

Copied title and URL