より迅速なマルウェア分析のために文字列出力をランク付けすることを学ぶ

リバース エンジニア、フォレンジック調査員、およびインシデント レスポンダーは、悪意のあるソフトウェア バイナリを分析するためのツールを自由に使用できます。マルウェアの分析を行う際には、これらのツールを次々と適用して、バイナリの機能に関する手がかりを徐々に収集し、検出方法を設計し、その被害を封じ込める方法を確認します。最も有用な最初のステップの 1 つは、 Stringsプログラムを介して印刷可能な文字を検査することです。エラー メッセージの出力、URL への接続、レジストリ キーの作成、特定の場所へのファイルのコピーなどの操作を実行するバイナリには、多くの場合、文字列が含まれます。これらの各操作は、将来の分析を促進するのに役立つ重要なヒントを提供します。

これらの関連する文字列を手動で除外すると、時間がかかり、エラーが発生しやすくなる可能性があります。特に次の点を考慮すると、

  • 関連する文字列は、無関係な文字列よりも不釣り合いに少ない頻度で発生します。
  • より大きなバイナリは、何万もの個々の文字列を出力できます。
  • 「関連性」の定義は、個々のアナリストによって大きく異なります。

捜査官は、マルウェアの分析に費やす時間を短縮したり、さらに悪いことに、不完全または不正確な結論を引き出したりする可能性のある重要な手がかりを見逃したくありません。このブログ投稿では、FireEye Data Science (FDS) と FireEye Labs のリバース エンジニアリング (FLARE) チームが最近どのように協力して、機械学習を使用してこのアナリストの問題点を合理化したかを紹介します。

ハイライト

  • マルウェアに対してStringsプログラムを実行すると、必然的に重要な文字列にノイズの多い文字列が混在して生成されます。これは、その乱雑な出力全体をふるいにかけ、スクロールして初めて明らかになります。マルウェア分析との関連性に基づいて文字列を自動的にランク付けする FireEye の新しい機械学習モデルは、このプロセスを大規模に高速化します。
  • 多くの場合、関連する個々の文字列を知るには、経験豊富なアナリストが必要です。品質が高く、セキュリティ関連のラベル付けされたトレーニング データを取得するには、時間と費用がかかりますが、リバース エンジニアの専門知識を活用する弱い監督は、このボトルネックを加速させるのに役立ちます。
  • 私たちが提案するランク付け学習モデルは、個々のマルウェア サンプルからのStrings出力に効率的に優先順位を付けることができます。 FireEye のリバース エンジニアが作成した 7 年以上のマルウェア レポートから得られた関連文字列のデータセットでは、レコメンデーション エンジンや検索エンジンの評価に一般的に使用される基準に基づいたパフォーマンスも良好です。

バックグラウンド

Stringsプログラムによって返される各文字列は、周囲のコンテキストやファイル形式に関係なく、null ターミネータで終わる 3 文字以上のシーケンスで表されます。これらの緩やかな基準は、人間が解釈できない場合に、文字列が一連の文字を文字として識別する可能性があることを意味します。たとえば、連続するバイト 0x31、0x33、0x33、0x37、0x00 がバイナリ内に表示される場合、文字列はこれを「1337」と解釈します。ただし、これらの ASCII 文字は実際にはその文字列自体を表していない場合があります。代わりに、メモリアドレス、CPU 命令、またはプログラムによって使用されるデータを表すこともできます。 Stringsは、その出力内に現れるそのような無関係な文字列を除外することをアナリストに任せています。たとえば、悪意のあるバイナリの例に由来する、図 1 にリストされている文字列のうち、マルウェア アナリストの観点から関連性があるのはほんの一握りです。

An example Strings output containing 44 strings for a toy sample with a SHA-256 value of eb84360ca4e33b8bb60df47ab5ce962501ef3420bc7aab90655fd507d2ffcedd.
図 1: おもちゃのサンプルの 44 個の文字列を含むStrings出力の例。

関連性の降順で文字列をランク付けすると、アナリストの作業がはるかに楽になります。次に、リストの一番上にある最も関連性の高い文字列に注意を向けるだけでよく、それより下の文字列はすべて無視します。ただし、文字列を自動的にランク付けするタスクを解決するのは簡単ではありません。関連する文字列のスペースは構造化されておらず、広大であり、それらの間のすべての可能なバリエーションを確実に説明するために細かく調整されたルールを考案することは困難な注文です.

文字列出力のランク付けを学ぶ

このタスクは代わりに、 Learning to Rank (LTR)と呼ばれる機械学習 (ML) フレームワークで定式化できます。これは歴史的に、情報検索、機械翻訳、Web 検索、協調フィルタリングなどの問題に適用されてきました。 LTR の問題に取り組む 1 つの方法は、 勾配ブースト決定木 (GBDT)を使用することです。 GBDT は、勾配降下手順を使用して損失を削減する個々の決定木を連続的に学習し、最終的にすべてのツリーの予測の加重和をアンサンブルとして使用します。 LTR 目的関数を持つ GBDT は、クラスの確率を学習して、各文字列の予想される関連性を計算できます。これを使用して、特定の文字出力をランク付けできます。これがどのように機能するかの概要を図 2 に示します。

図 2 の最初のtrain()ステップでは、25,000 を超えるバイナリがStringsプログラムで実行され、合計 1,800 万を超える文字列で構成されるトレーニング データが生成されます トレーニング サンプルは、その入力ファイルでStringsプログラムによって出力された ASCII 文字列と Unicode 文字列の連結リストに対応します。モデルをトレーニングするために、これらの生の文字列は、シャノン エントロピーや文字の共起頻度などの自然言語処理機能を含む数値ベクトルに変換され、侵害の兆候 (ファイル パス、IP アドレス、URL など) の存在などのドメイン固有のシグナルも含まれます。など)、フォーマット文字列、インポート、およびその他の関連するランドマーク。

ML ベースの LTR フレームワークは、マルウェア分析との関連性に基づいて文字列をランク付けします。この図は、機械学習モデリング プロセスのさまざまなステップを示しています。最初の train() ステップは実線の矢印とボックスで示され、後続の predict() および sort() ステップは点線の矢印とボックスで示されます。
図 2: ML ベースの LTR フレームワークは、マルウェア分析との関連性に基づいて文字列をランク付けします。この図は、機械学習モデリング プロセスのさまざまなステップを示しています。最初の train() ステップは実線の矢印とボックスで示され、後続の predict() および sort() ステップは点線の矢印とボックスで示されます。

変換された各文字列の特徴ベクトルは、マルウェア分析との関連性を表す負でない整数ラベルに関連付けられています。ラベルの範囲は 0 ~ 7 で、数字が大きいほど関連性が高いことを示します。これらのラベルを生成するために、FLARE アナリストの主題に関する知識を活用してヒューリスティックを適用し、結果のラベル配布に高レベルの制約を課します。この弱い監視アプローチは、すべての文字列に手動でラベルを付ける理想的なケースと比較して、ノイズやスプリアス エラーを生成する可能性がありますが、ドメインの専門知識を GBDT モデルに直接統合するための安価でモデルに依存しない方法も提供します。

次に、図 2 の predict ()ステップで、トレーニング済みの GBDT モデルを使用して、元はトレーニング データの一部ではなかった入力ファイルに属する文字列のランクを予測します。このクエリの例では、次の文字出力を使用します。図 1. モデルは、予想される関連性スコアを表す浮動小数点数としてクエリ内の各文字列のランクを予測し、図 2 の最後のsort()ステップで、これらのスコアによって文字列が降順でソートされます。図 3 は、この結果の予測が、マルウェア分析の関連性に従って文字列をランク付けするという望ましい目標をどのように達成するかを示しています。

図 1 と図 2 の切り詰められたクエリの両方に示されている文字列の結果のランキング。
図 3: 図 1 と図 2 の切り捨てられたクエリの両方に示されている文字列の結果のランキング。

図 3 の予測およびソートされた文字列ランキングでは、リストの一番上にネットワーク ベースのインジケーターが表示され、その後にレジストリ パスとエントリが続きます。これらは、潜在的な C2 サーバーと、ホスト上の悪意のある動作を明らかにします。ユーザー関連の情報で構成される後続の出力は、無害である可能性が高くなりますが、それでも調査する価値があります。リストを締めくくるのは、Windows API 関数や PE アーティファクトなどの一般的な文字列で、マルウェア アナリストに警告を発することはありません。

定量評価

モデルは期待どおりに上記の文字列を質的にランク付けしているように見えますが、モデルのパフォーマンスをより全体的に評価するための定量的な方法が必要です。モデルが弱い監視ソースの範囲を超えて一般化することを確信し、さまざまなパラメーターでトレーニングされたモデルを比較するために、どの評価基準を使用できますか?

レコメンデーション システムの文献に目を向けると、 Normalized Discounted Cumulative Gain (NDCG) スコアを使用して、コレクション (つまりStrings出力) 内のアイテム (つまり個々の文字列) のランキングを評価します。 NDCG は複雑に聞こえますが、一度に 1 文字ずつ要約してみましょう。

  • 「G」はゲインを表し、各文字列の関連性の大きさに対応します。
  • 「C」は累積を意味し、すべての文字列の関連性の累積的な増加または合計を指します。
  • 「D」は割引を意味し、各文字列の予測された関連性を、ランク付けされた位置の対数のような単調に増加する関数で割ります。これは、最も関連性の高い文字列を予測の上位にランク付けするという目標を反映しています。
  • 「N」は正規化を意味します。これは、過去のマルウェア レポートに含まれる FLARE で識別された関連文字列から取得したグラウンド トゥルース ホールドアウト データセットに対して計算された理想的な DCG スコアで DCG スコアを割ることを意味します。異なるStrings出力内の文字列の数は大きく異なる可能性があるため、正規化により、サンプル間でスコアを比較できます。
ホールドアウト データセットからの文字列出力の NDCG@100 スコアのカーネル密度推定。スコアは、トレーニング済みの GBDT モデルから予測された順序 (赤) に対して、各バイナリ (灰色) に対して単純に Strings プログラムを実行した後の元の順序に対して計算されます。
図 4: ホールドアウト データセットからの文字列出力の NDCG@100 スコアのカーネル密度推定。スコアは、トレーニング済みの GBDT モデルから予測された順序 (赤) に対して、各バイナリ (灰色) に対して単純に Strings プログラムを実行した後の元の順序に対して計算されます。

実際には、単一のStrings出力内のランクによってインデックス付けされた最初のk 個の文字列を取得します。ここで、 kパラメータは、マルウェア アナリストが注目する、または関連性があるとみなす文字列の平均数に基づいて選択されます。この目的のために、 Strings出力あたりの関連する文字列のおおよその平均数に基づいて、 k = 100 を設定します。 NDCG@ kスコアは 0 と 1 の間で制限されます。 スコアが 1 に近いほど、より関連性の高い文字列が上位に表示され、予測の質が高いことを示します。この測定により、特定のモデルからの予測と、他のモデルによって生成され、異なるアルゴリズムでランク付けされた予測とを比較することができます。

モデルのパフォーマンスを定量的に評価するために、グラウンド トゥルース FLARE レポートを含む各サンプルの文字列を図 2 のpredict()ステップで実行し、予測された順位をStringsによって出力された文字列の元の順位のベースラインと比較します。これら 2 つのアプローチ間の NDCG@100 スコアの分布の相違は、トレーニングされた GBDT モデルが、独立したホールドアウト セットに適切に一般化する有用な構造を学習することを示しています (図 4)。

結論

このブログ投稿では、マルウェア分析との関連性に基づいて文字列をランク付けすることを学習する ML モデルを紹介しました。私たちの結果は、定性的検査 (図 3) と NDCG@ kの定量的評価 (図 4) の両方に基づいてStrings出力をランク付けできることを示しています。 Stringsは、FireEye などでのマルウェア分析に広く適用されているため、このモデルを使用すると、疑わしい悪意のあるバイナリを大規模に調査するために必要な全体の時間を大幅に短縮できます。より忠実度の高いラベル付きデータでトレーニングし、より洗練されたモデリングと特徴付けの手法を組み込み、フィールド テストからアナリストのフィードバックをさらに求めることで、NDCG@ kスコアを引き続き改善する予定です。

マルウェアの作成者が、有用な文字列をアナリストから隠蔽するために多大な努力を払っていることはよく知られています。このモデルで考慮すべき潜在的な盲点は、文字自体の有用性が難読化によって妨げられる可能性があることです。ただし、 FireEye Labs Obfuscated Strings Solver (FLOSS)などのオープン ソース ツールは、 Stringsのインライン置換として使用できます。 FLOSS はStringsと同じように印刷可能な文字列を自動的に抽出しますが、スタック上でエンコード、パック、または手動で構築された難読化された文字列をさらに明らかにします。このモデルは FLOSS 出力で簡単にトレーニングして、難読化された文字列でもランク付けできます。さらに、文字列の任意のリストに適用できるため、このモデルを使用して、ライブ メモリ ダンプやサンドボックスの実行から抽出された文字列をランク付けすることもできます。

この作業は、FDS と FLARE のチーム間のコラボレーションを表しており、 予測モデルを共同で構築して、FireEye の顧客と製品の悪を発見し、結果を改善するのに役立ちます。この使命に興味がある場合は、求人に応募して、チームへの参加を検討してください。

参照: https://www.mandiant.com/resources/blog/learning-rank-strings-output-speedier-malware-analysis

コメント

タイトルとURLをコピーしました