ブログ(脅威調査)

capa 2.0: より良く、速く、強力に

オープンソース・ツール「capa」のバージョン2.0を発表いたします。capaは、拡張可能なルール・セットを使用して、プログラムの機能を自動的に識別します。このツールは、マルウェアのトリアージと深層リバース・エンジニアリングの両方をサポートしています。capaについて初めてお聞きになる方や、復習が必要な方は、最初のブログ記事をご覧ください。capa 2.0のスタンドアローン・バイナリは、プロジェクトのリリース・ページからダウンロードでき、ソース・コードはGitHubでチェックアウトできます。

capa 2.0では、誰もがより簡単にルールをコントリビュートできるようになり、既存のエコシステムがさらに活性化しています。このブログ記事では、capa 2.0に含まれる以下の主な改善点について詳しく説明しています。 

  • capa explorer IDA Proプラグインの新機能と強化により、ウィンドウを切り替えることなく、機能をインタラクティブに探索したり、新しいルールを作成したりできるようになりました。
  • FLIRTを利用したライブラリ関数の特定と、それに付随するオープンソースのFLIRTシグネチャの公開により、より簡潔で適切な結果が得られるようになりました。
  • マルウェアの追加機能を記述した数百の新しいルールを追加し、コレクションは合計579のルールとなり、半分以上がATT&CK技術に関連するものとなりました。
  •  他のプロジェクトとcapaの統合を容易にするためのPython3への移行

capa explorerとRule Generator

capa explorerはIDA Proで直接capaの結果を表示するIDAPythonのプラグインです。バージョン2.0のリリースでは、プラグインに多くの追加や改良が行われていますが、最も魅力的な追加を紹介したいと思います。capa explorerは、IDA Proで直接新しいcapaルールを書くことができるようになりました。

IDA Proなどのリバース・エンジニアリング・ツールによるマルウェアの解析にほとんどの時間を費やしていることから、capaのルール・ジェネレーターを追加することにしました。図1は、ルール・ジェネレーターのインターフェースを示しています。


図1:capa explorerルール・ジェネレーターのインターフェイス

スタートアップガイドを使用してcapa explorerをインストールしたら、「Edit」→「Plugins」→「FLARE capa explorer」と進み、プラグインを開きます。capa explorerペインの上部にあるRule Generatorタブを選択することで、ルール・ジェネレーターの使用を開始できます。ここから、IDA Proの逆アセンブル・ビューで、キャプチャしたい技術を含む関数に移動し、「Analyze」ボタンをクリックします。ルール・ジェネレーターは、関数内で検出されたすべてのcapa機能を解析、フォーマット、および表示します。ルール・ジェネレーターの3つのメイン・ペインを使って、ルールを書くことができます。「Features」、「Preview」、「Editor」です。最初のステップで、「Features」ペインから機能を追加します。

「Features」ペインは、関数から抽出されたすべてのcapa機能を含むツリー・ビューです。ペインの上部にある検索バーを使って、特定の機能をフィルタリングすることができます。そして、機能をダブルクリックして追加することができます。図2はその様子を示したものです。


図2:capa explorerの機能選択

「Features」ペインから機能を追加すると、ルール・ジェネレーターは自動的にフォーマットして 「Preview」 および 「Editor」 ペインに追加します。「Preview」 および 「Editor」 ペインでは、追加した機能を微調整したり、ルールのメタデータなどの他の情報を変更したりできます。

「Editor」ペインは、ルールを構成するステートメントと機能の階層を表示するインタラクティブなツリー・ビューです。ドラッグ&ドロップでノードを並べ替えたり、右クリックのコンテキスト・メニューでノードを編集したりできます。ルールのロジックを理解しやすくするために、「Description」および「Comment」列に入力して機能に説明やコメントを追加することができます。ルール・ジェネレーターは、「Editor」ペインで行った変更を自動的にフォーマットし、「Preview」ペインに追加します。図3は、「Editor」ペインを使ってルールを操作する方法を示しています。


図3:capa explorer 「Editor」ペイン

「Preview」ペインは、最終規則のテキストを含む編集可能なテキスト・ボックスです。表示されているテキストを編集することができます。ルール・ジェネレーターは、「Preview」ペインで行った変更を自動的にフォーマットして、「Editor」ペインに追加します。図4は、ルールを「Preview」ペインで直接編集する方法を示しています。


図4:capa explorerの「Preview」ペイン

編集を行うと、ルール・ジェネレーターにルールが表示され、「Preview」パネルの下に表示されるメッセージを使用してエラーが通知されます。ルールの作成が完了したら、「Save」ボタンを選択してcapaルール・ディレクトリに保存できます。ルール・ジェネレーターは、「Preview」ペインに表示される内容を正確に保存します。とてもシンプルです。

capa explorer ルール・ジェネレーターを使用することで、新しい capa ルールの作成にかかる時間を大幅に短縮できることがわかりました。このツールは、ルール作成プロセスのほとんどを自動化するだけでなく、IDA Proとお気に入りのテキスト・エディタの間でコンテキスト・スイッチを行う必要がないため、マルウェアに関する知識が新しいうちに成文化することができます。

capa explorerとルール・ジェネレーターの詳細については、READMEを参照してください。

FLIRTを使用したライブラリ関数の識別

何百ものcapaルールを書き、何千ものcapa結果を検査しているうちに、このツールが、埋め込まれたライブラリ・コードのために紛らわしい結果を示すことがあることに気づきました。私たちは、capaはプログラマーのロジックに注目し、サポートするライブラリ・コードを無視する必要があると考えています。例えば、高度に最適化されたC/C++ランタイム・ルーチンやオープンソースのライブラリ・コードは、プログラマーが製品を迅速に構築することを可能にしますが、それは製品そのものではありません。したがって、capa結果は、プログラムのすべてのバイトを分類するのではなく、プログラマーのプログラムに対する意図を反映したものでなければなりません。

図5のcapa v1.6の結果と図6のcapa v2.0の結果を比較すると、capa v2.0では約200のライブラリ関数を識別してスキップし、より適切な結果を得ることができました。


図5:ライブラリ・コード認識なしのcapa v1.6の結果


図6:capa v2.0の結果では、ライブラリ・コード関数は無視されます。

そこで、プログラマーのコードとライブラリのコードを区別する方法を探しました。

いくつかの方法を試した後、Hex-Rays社が開発したFLIRT(Fast Library Identification and Recognition Technology)を採用しました。この技術は、1996年以来、安定した効果を維持しており、高速で、コード解析の必要性が非常に少なく、IDA Proのユーザーベースで幅広いコミュニティが存在していることが注目されました。私たちは、IDA ProがFLIRTシグネチャをマッチングする方法を解明し、マッチング・エンジンをRustとPythonバインディング再実装しました。そして、最近のマルウェアで見られるライブラリ・ルーチンの多くをカバーするオープンソースのシグネチャ・セットを構築しました。

最後に、capaが新しいシグネチャを使用して分析を行うように更新しました。

capaはこれらのシグネチャを使用して、ライブラリ・コードとプログラマのコードを区別します。capaは、埋め込まれたライブラリ関数の名前を抽出して照合することはできますが、ライブラリ・コード内の機能や動作を見つけることはできません。このようにして、capaの結果は、プログラマーが書いたロジックをよりよく反映します。

さらに、ライブラリ関数を識別することで、capaの実行時のパフォーマンスが大幅に向上します。capaはライブラリ関数の処理をスキップするため、実世界の関数のかなりの割合で、コストのかかるルール・マッチングのステップを回避することができます。206個のサンプルからなるテストベッドでは、186,000個の全関数のうち28%が、私たちの関数シグネチャによってライブラリ・コードとして認識されました。私たちの実装では約100,000個/秒の関数を認識することができたため、ライブラリ関数識別のオーバーヘッドは無視でき、capaは2020年と比較して約25%高速化しました。

最後に、ルール作成者が認識されたライブラリ関数を照合するために使用できる新しい機能クラス「function-name」を紹介します。この機能は、ファイル・レベルのスコープで照合します。図7のルール例に示すように、Crypto++で提供されるAESなどの暗号ルーチンの特定の実装を認識するために、この新しい機能をすでに使用し始めています。


図7:function-nameを使用してCrypto++経由でAESを認識するルールの例

興味深い動作に対するルールを作成していくうちに、一般的ではない技術がどこで合法的に使用されているかについて多くのことを学びました。例えば、マルウェア・アナリストとしては、VM検出ルーチンなどのアンチアナリシス・チェックの際にcpuid命令をよく目にします。そのため、この命令にフラグを立てるルールを無意識に作成しました。しかし、テストベッドでテストしてみると、このルールはほとんどの最新プログラムと一致しました。なぜなら、この命令は、memcpyなどの高度に最適化されたルーチンの中で、新しいCPU機能を利用するために合法的に使用されることが多いからです。今になってみれば当たり前のことですが、当時は実行ファイル全体の約15%にcpuidが含まれていることに少し驚きました。新しいFLIRTサポートにより、capaはVisual Studioが組み込んだ最適化されたmemcpyルーチンを認識し、プログラマーのコードの一部ではないため、組み込まれたcpuid命令にフラグを立てません。

capa 2.0にアップグレードすると、ツールの動作が速くなり、より正確な結果が得られるようになります。

署名生成

すべてのユーザー(特にIDA Proライセンスをお持ちでない方)にpython-flirtのメリットを提供するために、私たちはマルウェア解析の一般的なユースケースに対応する包括的なFLIRTシグネチャ・セットの作成に多大な時間を費やしました。シグネチャはcapaに含まれており、Apache 2.0ライセンスの下、GitHubでも公開されています。私たちは、他のプロジェクトもこの恩恵を受けることができると信じています。例えば、FLOSSでは、ライブラリ関数の識別機能を組み込むことで、パフォーマンスが向上することを期待しています。さらに、IDA Proと一緒に私たちのシグネチャを使えば、より多くのライブラリ・コードを認識することができます。

当社の初期の署名には以下が含まれます。

  • Microsoft Visual Studio(VS)より、VS6からVS2019までのすべてのメジャー・バージョンに対応
    • CおよびC++ランタイム・ライブラリ
    • AActive Template Library(ATL)およびMicrosoft Foundation Class(MFC)ライブラリ
  • VS2015、VS2017、およびVS2019でコンパイルされた以下のオープンソースプロジェクト
    • CryptoPP
    • curl
    • Microsoft Detours
    • Mbed TLS (previously PolarSSL)
    • オープンSSL
    • zlib

関連するライブラリやオブジェクト・ファイルを特定して収集するのは大変な作業でした。VSの古いバージョンでは、この作業を手作業で行っていました。しかし、新しいVSバージョンや各オープンソース・プロジェクトでは、vcpgkとDockerを使ってこのプロセスを自動化することができました。

その後、IDA Pro FLAIRユーティリティを使用して、何ギガバイトもの実行コードをパターン・ファイルに変換し、さらに署名に変換しました。このプロセスには、広範な調査と多くの試行錯誤が必要でした。例えば、最適な組み合わせを理解するために、2週間かけて様々なFLAIRオプションをテストし、検討しました。IDA Proに高品質のシグネチャを提供してくれたHex-Rays社に感謝するとともに、彼らの研究とツールをコミュニティに提供してくれたことに感謝します。

パターンと署名ファイルの生成についての詳細は、siglibリポジトリをご覧ください。FLAIRユーティリティは、Hex-Raysのウェブサイトの保護されたダウンロード・エリアで入手できます。

ルールのアップデート

最初のリリース以来、コミュニティはcapaのルール総数を260から570以上へと2倍以上に増やしました。これは、capaが実際のマルウェアに見られるより多くのテクニックを認識していることを意味し、アナリストがプログラムをリバース・エンジニアリングする際の時間を確実に節約しています。また、繰り返しになりますが、これらのルールを開発するために、12の組織から30人近くの同僚がボランティアで経験を提供してくれることでサポートを受けることができました。ありがとうございました。

図8は、capaが現在取得している機能の概要を示しています。

  • Host Interaction: ファイル・システム、プロセス、レジストリと連携するプログラム機能について説明します。
  • Anti-Analysis: パッカー、アンチ VM、アンチデバッギング、その他の関連技術について説明します。
  • Collection: 認証情報やクレジットカード情報などのデータを盗むための機能について説明しています。
  • Data Manipulation: データの暗号化、復号化、ハッシュ化などの機能について説明しています。
  • Communication: HTTP、DNS、TCPなどのデータ転送技術について説明しています。


図8:capaルール・カテゴリの概要

capa のルールの半分以上は、MITRE ATT&CK技術に関連付けられており、これには capa のスコープ内にある ATT&CKバージョン 9 で導入されたすべての技術が含まれています。さらに、capaのルールの約半数は、現在、Malware Behavior Catalog(MBC)の識別子と関連付けられています。

また,70%以上の capa ルールについて,関連する実世界のバイナリを収集しました。各バイナリは、興味深い機能を実装し、注目すべき機能を備えています。サンプル・コレクション全体は、capa test filesのGitHubページで見ることができます。これらのサンプルは、コードの拡張やルールの更新の開発およびテストに大きく貢献しています。

Python3のサポート

最後に、約3ヶ月かけて、capaをPython 2.7からPython 3に移行しました。これにはvivisectとの密接な協力が必要だったため、彼らのサポートに感謝したいと思います。広範囲にわたるテストと、2つのPythonバージョンをサポートするいくつかのリリースの後、私たちはcapa 2.0と将来のバージョンがPython 3のみであることをうれしく思います。

結論

最近のcapaの改良点をご覧になった後、すぐに最新のcapaバージョンにアップグレードしていただけると幸いです。ライブラリ機能の識別により、capaはより速く、より適切な結果を報告します。何百もの新しいルールは、最も興味深いマルウェアの機能を捕捉し、改良されたcapa explorerプラグインは、新鮮なうちに分析に集中し、マルウェアの知識を体系化するのに役立ちます。

Windows、Mac、Linux用のスタンドアロンのバイナリは、capa Releasesページで入手できます。PyPiからcapaをインストールするには、pip install flare-capaコマンドを使用します。ソース・コードは、capaのGitHubページで公開されています。GitHubのプロジェクト・ページには、インストール方法やcapa explorerのウォークスルーなどの詳細なドキュメントがあります。質問やアイデアの検討、問題の提案にはGitHubをご利用ください。

capaのルール・コーパスへの貢献をぜひお願いします。改良されたIDA Proプラグインにより、これまで以上に簡単にできるようになりました。ルールに関する問題やアイデアがありましたら、GitHub リポジトリでお知らせください。ルールをコミュニティで共有することにより、数十の組織の数百人のリバース・エンジニアに影響を与えることができます。

 

本ブログは機械翻訳(MT)を使用して翻訳しています。原文と翻訳版の意味、文言が異なる場合は原文を有効とします。

原文:July 19, 2021 「capa 2.0: Better, Faster, Stronger