
マルウェア解析における関連性に基づいて文字列をランク付けする機械学習ツール。
StringSifterは、マルウェア解析における関連性に基づいて文字列を自動的にランク付けする機械学習ツールです。
StringSifter は Python バージョン 3.9 以上を必要とします。コードを取得し、ユニットテストを実行し、ツールを使用するには、次のコマンドを実行します:
pip install stringsifter
開発用には、poetry を使用します:
git clone https://github.com/mandiant/stringsifter.git
cd stringsifter
poetry install --with dev
StringSifter のインストールディレクトリからユニットテストを実行するには:
poetry run tests -v
pip install コマンドは、2つの実行可能なスクリプト flarestrings と rank_strings を Python 環境にインストールします。ソースから開発する場合は、pipenv run flarestrings と pipenv run rank_strings を使用します。
flarestrings は GNU binutils の strings の機能を模倣しており、rank_strings はパイプ入力を受理します。例:
flarestrings <my_sample> | rank_strings
rank_strings は多くのコマンドライン引数をサポートしています。位置引数 input_strings は、ランク付けする文字列を含むファイルを指定します。オプション引数は以下のとおりです:
| Option | Meaning |
|---|
ランク付けされた文字列は標準出力に書き込まれます。ただし、--batch オプションを指定した場合は、<input_file>.ranked_strings という名前のファイルにランク付け結果が書き込まれます。
flarestrings は、既定の4文字ではなく、少なくとも min-len 文字の長さの文字シーケンスを出力するためのオプション -n (または --min-len) をサポートしています。例:
flarestrings -n 8 <my_sample> | rank_strings
は、長さ8以上の文字列のみを出力してランク付けします。
docker build -t stringsifter -f docker/Dockerfile .
flarestrings または rank_strings の引数付きで実行すると、それぞれのコマンドを使用できます。コンテナ化されたコマンドはパイプラインで使用できます:cat <my_sample> | docker run -i stringsifter flarestrings | docker run -i stringsifter rank_strings
-v フラグを使用してホストディレクトリをコンテナに公開します:docker run -v <my_malware>:/samples -it stringsifter
ここで <my_malware> には解析用のサンプルが含まれます。例:
docker run -v $HOME/malware/binaries:/samples -it stringsifter
flarestrings /samples/<my_sample> | rank_strings <options>
すべての コマンドライン引数 は、コンテナ化されたスクリプトでサポートされています。
StringSifter は任意の文字列リストに適用できるため、ライブメモリダンプ、サンドボックス実行、難読化された文字列を含むバイナリなど、代替の情報収集ソースからインサイトを得ようとする実務者にとって役立ちます。たとえば、FireEye Labs Obfuscated Strings Solver (FLOSS) は、Strings と同じように印刷可能な文字列を抽出しますが、エンコード、パック、またはスタック上で手動構築された難読化文字列も追加で明らかにします。これは Strings のインライン置換として使用できるため、StringSifter は次のコマンドで FLOSS 出力に対しても同様に呼び出すことができます:
$PY2_VENV/bin/floss –q <options> <my_sample> | rank_strings <options>
注意:
–q 引数は、抽出された文字列のみを表示するためにヘッダーと書式設定を抑制します。追加の FLOSS オプションの詳細については、Usage Docs を参照してください。floss または rank_strings の少なくとも1つに Python 仮想環境を参照する相対パスを含める必要があります。strings の実行に関する注意このディストリビューションには、プラットフォーム間で予測可能な出力を保証するための flarestrings プログラムが含まれています。システムにインストールされている strings を実行する場合は、そのオプションがバージョンやプラットフォーム間で一貫していないことに注意してください:
ほとんどの Linux ディストリビューションには、GNU Binutils の strings プログラムが含まれています。「ワイド」文字列と「ナロー」文字列の両方を抽出するには、プログラムを2回実行して出力ファイルにパイプする必要があります:
strings <my_sample> > strs.txt # narrow strings
strings -el <my_sample> >> strs.txt # wide strings. note the ">>"
MacOS に同梱されている一部の BSD strings はワイド文字列をサポートしていません。また、ファイル全体をスキャンするための -a オプションは、デフォルト設定では無効になっている場合があることにも注意してください。-a がないと、有用な文字列が失われる可能性があります。ワイド文字をサポートする strings を入手するには、Homebrew または MacPorts を使用して GNU Binutils をインストールすることをお勧めします。正しいバージョンの strings を呼び出すように注意してください。
strings は Windows にはデフォルトでインストールされていません。動作する strings を入手するには、Windows Sysinternals、Cygwin、または Malcode Analyst Pack をインストールすることをお勧めします。
このバージョンの StringSifter は、最初の EMBER データセット に関連するサンプリングされたマルウェアバイナリからの Strings 出力を使用してトレーニングされました。順序ラベルは弱監督手順を使用して生成され、教師あり学習は、Learning-to-Rank 目的関数を持つ Gradient Boosted Decision Trees によって実行されます。さらなる技術的詳細については、クイックリンク を参照してください。現在、ラベル付きデータもトレーニングコードも利用できないことに注意してください。ただし、将来のリリースではこのアプローチを再検討する可能性があります。
バグや機能リクエストの投稿には GitHub Issues を使用しています。
flarestrings は、優れたツール FLOSS から派生しています。| --scores (-s) | 出力にランクスコアを含める |
| --limit (-l) | 出力を上位 limit 個のランク付けされた文字列に制限する |
| --min-score (-m) | 出力をスコア >= min-score の文字列に制限する |
| --batch (-b) | バッチ処理用の strings 出力フォルダを指定する |