マルウェア検出のための機械学習

マルウェア検出のための機械学習

  [[188537]]

1. はじめに

機械学習は、コンピュータにデータから学習する能力を与え、現在インターネット上に存在する PB レベルのデータを効果的に活用し、人間にとって非常に複雑で時間のかかる意思決定やタスク実行をサポートすることを目的としたコンピュータ サイエンスの分野です。

マルウェアは、企業やユーザーが日々直面している差し迫った脅威です。フィッシング メールであろうと、ブラウザーを通じて直接配信されるエクスプロイトであろうと、これらのマルウェアはさまざまな回避手法やその他のセキュリティの脆弱性と組み合わされ、既存の防御をすり抜けることができます。 Veil や Shelter などのマルウェア フレームワークは、侵入テストの専門家によって使用されており、非常に優れた結果を達成しています。

本日は、特徴値検出や動作分析手法を使用せずに、機械学習で悪意のあるアプリケーションを検出する方法について読者に紹介します。

ちなみに、CylanceProtect、SentinelOne、Carbon Black などのセキュリティ製品は、シグネチャ検出と動作分析に重点的に取り組んでいます。この記事で紹介するマルウェア検出フレームワークでは、これらの製品で使用されるこれら 2 種類のテクノロジは使用しません。

2. 機械学習入門

機械学習の分野では、主に統計、確率論、線形代数、数学的計算(アルゴリズム、データ処理、数値計算など)を含む複数の数学分野が統合されています。機械学習はビッグデータの価値を深く活用することができ、詐欺検出、スパム検出、映画の推奨、食品や製品の購入推奨などに広く使用されています。 Amazon、Facebook、Google、その他数百の企業も、製品やサービスを改善するために機械学習を使用しています。

機械学習には、教師あり学習と教師なし学習という 2 つの主な方法があります。教師あり学習では、処理するデータは事前​​にラベル付けされていますが、教師なし学習ではその逆になります。どちらの方法もマルウェア検出に使用できますが、ここではファイルを分類することが目的なので、最初の方法に焦点を当てます。

分類は教師あり学習のサブフィールドです。分類オブジェクトはバイナリ ファイル (悪意のあるファイルまたはマルウェアでないファイル) または他の種類のオブジェクト (猫、犬、豚など) です。したがって、マルウェア検出はバイナリ ファイル分類のカテゴリに属します。

機械学習の詳細な紹介はこの記事の範囲を超えています。機械学習の詳細については、さまざまなソースから学ぶか、付録のリソースを参照してさらに詳しく学習してください。

3. 質問セット

機械学習のワークフローには、問題の定義、データの収集、データの整理(データをトレーニング要件に適合させる)、アルゴリズムを使用したデータの処理が含まれます。この一連の手順には多くのリソースが必要となるため、一般の人にとって機械学習を実装するのは困難です。これらのステップは機械学習ワークフローと呼ばれ、機械学習に必要な最小限のステップです。

この記事で説明するシナリオでは、まずワークフローを定義する必要があります。

1. まず、マルウェア サンプルを収集し、サイズが 10k 未満のものを除外する必要があります。サンプルサイズが大きいほど良いです。

2. 次に、サンプルから意味のある特徴を抽出する必要があります。これは、私たちの研究の基礎でもあります。いわゆる特徴とは、オブジェクトを説明できる属性を指します。たとえば、家の特徴に​​は、部屋の数、家の面積、家の価格などが含まれます。

3. 特徴を抽出した後、サンプルを処理してサンプル データ セットを構築する必要があります。機械学習アルゴリズムの計算オブジェクトはベクトルであるため、データセットはデータベース ファイルまたは CSV ファイルにすることができ、データ ベクトルへの変換が容易になります。

4. 最後に、バイナリ ファイルの分類結果を評価するためのメトリックが必要です。 ROC (受信者動作特性)、AUC (受信者動作特性曲線下面積)、混同行列など、アルゴリズムのパフォーマンスを測定するために使用できる指標は多数あります。ここでは、結果の正解率だけでなく、偽陽性率と偽陰性率も反映できるため、混同行列インジケーターを使用します。

4. サンプルを収集し、特徴を抽出する

この記事は、読者が PE ファイル形式についてある程度の知識を持っているか、またはまずここで基本を学習できることを前提としています。サンプルの収集は非常に簡単です。有料サービス (VirusTotal など) を使用するか、このリンクのサンプル ソースを使用できます。

ここで、モデリングの問題に移ります。

アルゴリズムが入力したデータから学習できるようにするには、データをクリーンアップして整理し、理解しやすいものにする必要があります。この記事では、12 個の特徴を使用してアルゴリズムをトレーニングします。これらの 12 個の特徴はサンプル ファイルから抽出され、CSV ファイルに保存されます。

1. 特徴抽出

サンプルの特徴を抽出するために pefile を使用します。まず、python を使用して pefile をダウンロードします。コマンドは次のとおりです。

  1. pip で pefile をインストールします

ツールは準備完了です。コードを書き始める前に、抽出する必要がある機能について話し合いましょう。 PE ファイルの場合、主に次の特性フィールドが対象となります。

1. メジャー イメージ バージョン: アプリケーションのメジャー バージョン番号を示します。 Excelバージョン4.0の場合、この値は4です。

2. IMAGE_DATA_DIRECTORYの仮想アドレスとサイズ

3. オペレーティングシステムのバージョン

4. アドレステーブルアドレスのインポート

5. リソース領域のサイズ

6. セクション数

7. リンカーバージョン

8. スタックサイズを予約する

9. DLL属性値

10. テーブルのサイズとアドレスをエクスポートする

コード構造を明確にするために、PE ファイル情報を表現するためにクラス オブジェクトを使用します。クラス構造は次のとおりです。

  1. インポートOS
  2. pefileをインポートする
  3. クラス PEFile:
  4. def __init__(自分自身、ファイル名):
  5. self.pe = pefile.PE(ファイル名、fast_load= True )
  6. self.filename = ファイル名
  7. self.DebugSize = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[6] .サイズ 
  8. self.DebugRVA = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[6].VirtualAddress
  9. self.ImageVersion = self.pe.OPTIONAL_HEADER.MajorImageVersion
  10. self.OSVersion = self.pe.OPTIONAL_HEADER.MajorOperatingSystemVersion
  11. self.ExportRVA = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[0].VirtualAddress
  12. self.ExportSize = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[0] .サイズ 
  13. self.IATRVA = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[12].VirtualAddress
  14. self.ResSize = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[2] .サイズ 
  15. self.LinkerVersion = self.pe.OPTIONAL_HEADER.MajorLinkerVersion
  16. self.NumberOfSections = self.pe.FILE_HEADER.NumberOfSections
  17. self.StackReserveSize = self.pe.OPTIONAL_HEADER.SizeOfStackReserve
  18. self.Dll = self.pe.OPTIONAL_HEADER.Dll特性
  19. ここで、各 PE ファイルの辞書を作成するための簡単な関数を作成します。辞書のキーは特徴フィールドであり、その値は特徴値であるため、各サンプルは Python 辞書オブジェクトとして表すことができます。以下のように表示されます。
  20. def コンストラクト(self):
  21. サンプル = {}
  22. self.__dict__.iteritems()内のattr、kについて:
  23. if(attr != "pe" ):
  24. サンプル[属性] = k
  25. 返品サンプル

ここで、各 PE ファイルの辞書を作成するための簡単な関数を作成します。辞書のキーは特徴フィールドであり、その値は特徴値であるため、各サンプルは Python 辞書オブジェクトとして表すことができます。以下のように表示されます。

  1. pe2vec() を定義します:
  2. データセット = {}
  3. os.walk(direct)内のサブディレクトリ、ディレクトリ、ファイルの場合:
  4. ファイル内のfの場合:
  5. ファイルパス = os.path.join (サブディレクトリ、f )
  6. 試す:
  7. pe = pedump.PEFile(ファイルパス)
  8. データセット[str(f)] = pe.Construct()
  9. except例外をeとして:
  10. 印刷e
  11. データセットを返す
  12. # 辞書ができたので、それをクリーンなcsvファイル保存しましょう
  13. def vec2csv(データセット):
  14. df = pd.DataFrame(データセット)
  15. viral = df.transpose() #特徴量サンプル数を列として転置する  
  16. # utf-8が推奨されます
  17. 感染した.to_csv( 'dataset.csv' 、 sep= ',' 、 エンコーディング= 'utf-8' )

次に、このデータを処理する準備が整いました。

2. データの探索

これは必須のステップではありませんが、データを直感的に理解できるようになります。

  1. pandasをpdとしてインポートする
  2. numpyをnpとしてインポートする
  3. matplotlib.pyplot をpltとしてインポートします。
  4. 悪意のある = pd.read_csv( "bucket-set.csv" )
  5. クリーン = pd.read_csv( "クリーンセット.csv" )
  6. 「クリーンファイル統計」を印刷する 
  7. クリーン.記述()
  8. 「悪意のあるファイルの統計」を印刷する 
  9. 悪意のある記述()

次の 2 つの表は、それぞれ通常のプログラムと悪意のあるファイルの統計に対応しています。

2 つのデータセット間の違い、特に最初の 2 つの特徴フィールドの違いがより顕著にわかります。これらの違いを視覚的に把握するためにグラフを描くことができます。

  1. 悪意のある[ 'クリーン' ] = 0
  2. クリーン[ 'クリーン' ] = 1
  3. インポートシーボーン
  4. %matplotlib インライン
  5. 図、ax = plt.subplots()
  6. x = 悪意のある[ 'IATRVA' ]
  7. y = 悪意のある[ 'クリーン' ]
  8. ax.scatter(x,y,color= 'r' ,label= '悪意のある' )
  9. x1 = クリーン[ 'IATRVA' ]
  10. y1 = クリーン[ 'クリーン' ]
  11. ax.scatter(x1,y1,color= 'b' ,label= 'クリーンファイル' )
  12. ax.legend(loc= "右" )

チャートは以下のとおりです。

上の図からわかるように、マルウェア サンプルは高度に「クラスター化」されていますが、通常のファイル サンプルは x 軸上にまばらに分散されています。次に、これらのサンプル データを完全に理解するために、他の機能をプロットしてみます。

「DebugRVA」機能の分析:

  1. %matplotlib インライン
  2. 図、ax = plt.subplots()
  3. x = 悪意のある[ 'DebugRVA' ]
  4. y = 悪意のある[ 'クリーン' ]
  5. ax.scatter(x,y,color= 'r' ,label= '悪意のある' )
  6. x1 = クリーン[ 'DebugRVA' ]
  7. y1 = クリーン[ 'クリーン' ]
  8. ax.scatter(x1,y1,color= 'b' ,label= 'クリーンファイル' )
  9. ax.legend(loc= "右" )

描かれたグラフは次のようになります。

「ExportSize」機能の分析:

  1. %matplotlib インライン
  2. 図、ax = plt.subplots()
  3. x = 悪意のある[ 'エクスポートサイズ' ]
  4. y = 悪意のある[ 'クリーン' ]
  5. ax.scatter(x,y,color= 'r' ,label= '悪意のある' )
  6. x1 = clean[ 'エクスポートサイズ' ]
  7. y1 = クリーン[ 'クリーン' ]
  8. ax.scatter(x1,y1,color= 'b' ,label= 'クリーンファイル' )
  9. ax.legend(loc= "右" )

描かれたチャートは次のようになります。


グラフを多く描くほど、データに対する理解が深まり、全体的な分布に対する理解も深まります。現在、私たちが持っているデータセットは低次元なので、データセットが高次元の場合はどうすればよいかという疑問が生じます。データセットの次元を減らし、「重要な」特徴をより目立たせることができるテクニックは数多くあります。たとえば、PCA および t-SNE アルゴリズムでは、データ セットを 3 次元または 2 次元の画像にプロットできます。

5. マルウェア検出における機械学習の応用

これまでも十分な統計作業を行ってきましたが、データの収集、クリーニング、トレーニング データの準備など、機械学習の作業の一部しか行っていませんでした。機械学習を始める前に、次のタスクを完了する必要があります。

1. まず、2 つのデータセットを 1 つのデータ フレームにマージする必要があります。

2. 次に、データ フレームを 2 つの部分に分割する必要があります。最初の部分はトレーニング用、2 番目の部分はテスト用です。

3. 次に、いくつかの機械学習アルゴリズムを使用して結果を確認します。

(I)データセットの準備

  1. pandasをpdとしてインポートする
  2. データセット = pd.read_csv( 'マルウェアデータセット.csv' )
  3. 「」 「
  4. この点データセットを追加すると、データが保持されます
  5. 素晴らしいですね。トレーニングとテスト分割し予測を一定に保つためにランダムシードを固定しましょう。
  6. 「」 「
  7. numpyをnpとしてインポートする
  8. sklearn.model_selectionからtrain_test_split をインポートします
  9. sklearn.metricsからconfusing_matrix をインポートします
  10. #必要な4つのアルゴリズムをインポートしましょう テストする
  11. #ニューラルネットワーク
  12. sklearn.preprocessingからStandardScaler をインポートします
  13. sklearn.neural_networkからMLPClassifier をインポートします
  14. #ランダムフォレスト
  15. sklearn.ensembleからRandomForestClassifier をインポートします
  16. 「」 「
  17. データを準備しましょう
  18. 「」 「
  19. 状態 = np.random.randint(100)
  20. X = dataset.drop ( 'clean' 軸=1)
  21. y = データセット[ 'クリーン' ]
  22. X = np.asarray(X)
  23. y = np.asarray(y)
  24. X = X[:,1:]
  25. X_train、X_test、y_train、y_test = train_test_split(X、y、テストサイズ=0.1、ランダム状態=0)

これで、4 つの大きな行列が手に入りました。X_train と y_train はさまざまな分類器をトレーニングするために使用され、X_test はラベル予測に、y_test はメトリック測定に使用されます。実際には、アルゴリズムの具体的な実装を分析するために、X_test と y_test の予測値を比較します。

(II)アルゴリズムの選択

まず、「決定木」アルゴリズムの統合アルゴリズムである「ランダムフォレスト」アルゴリズムを見てみましょう。中心となる考え方は、トレーニング中に大量の分類決定木を作成し、出力分類がサンプル分類の基本モデルとなることです。ランダム フォレスト アルゴリズムは、バイナリ ファイルの分類問題を解決するのに非常に効果的です。

  1. #ランダムフォレストから始めましょう
  2. #分類器を起動します
  3. clf1 = ランダムフォレスト分類器()
  4. #トレーニング
  5. clf1.fit(X_train、y_train) は、
  6. #X_test予測ラベル
  7. y_pred = clf1.predict(X_test)
  8. #メトリクス評価
  9. 「」 「
  10. tn =負 正しい予測 クリーン クリーンとして予測れた
  11. fp = False Positive検知悪意がある予測された誤報
  12. tp =陽性 正しい予測(悪意のある)
  13. fn = False Negative 悪意のあるラベルがクリーンであると予測される
  14. 「」 「
  15. tn、fp、fn、tp = 混乱行列(y_test、y_pred).ravel()
  16. 「TN = " ,tn を印刷する
  17. 印刷"TP = " ,tp
  18. "FP = " ,fpを印刷
  19. "FN = " ,fnを印刷します

プログラムの出力は次のとおりです。

  1. TN = 697
  2. TP = 745
  3. FP = 6
  4. FN=4

処理結果によると、パラメータの微調整や変更を行わなくても、誤検知は 6 件、誤検知は 4 件しかなく、かなり良い結果でした。 697 個の通常ファイルと 745 個のマルウェア ファイルを正しく識別できました。結果から判断すると、当社の小型ウイルス対策エンジンは優れたパフォーマンスを発揮します。

次に、別の分類器を試してみましょう。単純なニューラル ネットワークを構築し、ランダム分割をどれだけうまく処理できるかを確認します。

Wikipedia のエントリによると:

多層パーセプトロン (MLP) は、入力データ セットを適切な出力セットのセットにマッピングするフィードフォワード人工ニューラル ネットワーク モデルです。 MLP は有向グラフ内の複数のノード層で構成され、各ノード層は次の層のノードに完全に接続されています。入力ノードを除いて、各ノードは非線形活性化関数を持つニューロン (または処理ユニット) です。 MLP は、教師あり学習手法であるバックプロパゲーションを使用してニューラル ネットワークをトレーニングします。 MLP は、線形に分離できないデータを区別するために使用できる標準線形パーセプトロンの修正版です。

上記の定義から、MLP はパーセプトロンの一般化された形式であり、幅広く深いネットワークを処理するために使用できるディープラーニング手法の基本モデルの 1 つであることがわかります。

  1. #いつもの分割
  2. X_train、X_test、y_train、y_test = train_test_split(X、y、テストサイズ=0.3、ランダム状態=0)
  3. #これ特徴エンジニアリングと呼ばれる特別なプロセスで、データを同じスケール変換して予測精度を向上させます
  4. スケーラー = StandardScaler()
  5. スケーラー.fit(X_train)
  6. X_train = スケーラー.transform(X_train)
  7. X_test = スケーラー.変換(X_test)
  8. #ここでは、12 個の機能を持つ12 層マルチ レイヤー パーセプトロンを構築します。必要に応じてさらに使用することもできますが、複雑な動物園なってしまいます。
  9. mlp = MLP分類子(隠しレイヤーのサイズ=(12,12,12,12,12,12))
  10. #データMLPをトレーニングする
  11. mlp.fit(X_train、y_train) は、
  12. 予測 = mlp.predict(X_test)
  13. #分類器の評価
  14. tn、fp、fn、tp = 混乱マトリックス(y_test、予測).ravel()
  15. 「TN = " ,tn を印刷する
  16. 印刷"TP = " ,tp
  17. "FP = " ,fpを印刷
  18. "FN = " ,fnを印刷します

プログラムの出力は次のとおりです。

  1. TN = 695
  2. TP = 731
  3. FP = 8
  4. 18 18 19 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 19 20 310 180 230 240 320 330 340 360 380 490 500 510 520

一見強力そうなニューラル ネットワークは、サンプル データ セット内の 18 個のマルウェアを識別できません (偽陰性)。これは深刻な問題です。ウイルス対策ソフトウェアがランサムウェアを通常のプログラムとして誤分類したらどうなるか想像してみてください。しかし、あまり悲観的になりすぎないでください。ニューラル ネットワークはまだ非常に原始的なものです。実際、精度を上げることは可能ですが、これはこの記事の範囲を超えています。

VI. 結論

この記事は単なる入門記事です。読者に伝えたいのは、99% の認識率を受け入れることができれば、マルウェアの識別は解決が難しい問題ではないということです。もちろん、現実の世界では、機械学習の構築と展開は、多くの知識と大量のデータを必要とする、時間と労力を要する作業です。この記事は、機械学習と人工知能 (AI) がマルウェア識別にどのように適用されるかについての簡単な記事です。読者の皆さんに知識を学ぶ楽しさを提供できれば幸いです。

<<:  ディープラーニングの概要: パーセプトロンからディープネットワークまで

>>:  5つのAI技術トレンドが私たちの労働環境を根本的に変える

ブログ    
ブログ    

推薦する

AI チップ: なぜそれほど重要なのか?

周りを見渡せば、人工知能がいかに重要になっているかがわかるでしょう。顔認識カメラでも音声アシスタント...

スマートカーシステムへの生体認証技術の統合

近年、自動車業界はインテリジェント車両システムの出現により大きな変化を遂げています。これらのシステム...

よりスケーラブルになるにはどうすればよいでしょうか?

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

ChatGPT がリリースされてから 1 年が経ちました。主要なオープン ソース モデルはすべて追いついたのでしょうか?

1年前の今日、ChatGPTが誕生し、人工知能の新しい時代が到来したように思えました。 ChatG...

マスクを着用しているときでも顔認識は役立ちますか?

[[415947]]顔認識技術は今や私たちの生活のあらゆる側面に浸透しています。公共の安全、スマー...

...

今後の展望:自動運転におけるビッグモデル技術の応用と影響

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

MSNを覚えていますか?マイクロソフトはAIを使って人間を排除している

海外メディアの報道によると、マイクロソフトは、自動化や人工知能によるコンテンツ決定に向けた同社の取り...

CIOがAIのビジネスケースを作成する方法

近年、AI プロジェクトに対する組織の関心は着実に高まっています。調査会社ガートナーの調査によると、...

...

...

...

...

...

Google Brain エンジニアの講演: TensorFlow とディープラーニング

この記事は、Google Brain エンジニアの Zhou Yuefeng 氏が QCon Sha...