エンジニアまで道半ば

興味を持った技術についての備忘録

機械学習でマルウェア検出 ー安易な特徴量選択がもたらすリスクー

本稿はセキュリティキャンプ Advent Calendar 14日目の記事になります.

先日やっと論文を投稿できたので, 飛び入り参加ですがそれ関連の記事を書こうと思います.

Intro

機械学習マルウェア検出や異常検知などを行う研究が盛んに行われているかと思います.

検出・検知というと精度やTPR, FPRばかりに意識がいきがちですが, ことセキュリティに関してはRobustness(堅牢性)も重要になってきます.

ここでいう堅牢性とは, 学習データにない未知のデータに対する分類精度や, 汚染データによる分類モデルそのものへの攻撃に対する耐性などを指します.

今回は堅牢性を無視した分類モデルに対して実際に回避攻撃を行うことで, そのリスクを目の当たりにしようと思います.

 

コードはこちら

データセットやそれに付随するデータをアップロードすることができないため, 参考程度にしてください

マルウェア検出器の準備

堅牢性を無視した分類モデルとして, ファイルに使用されている(全ての)APIのみを特徴量としたマルウェア検出器を作成します.

データセットの都合上学習過程は省きますが, 訓練データのマルウェアと良性ファイル各3000個からAPIを抽出し, それら全てを特徴量に用いて学習させます.

今回は34499個(次元)の特徴量でロジスティック回帰(LR), ランダムフォレスト(RF), 多層パーセプトロン(MLP)で学習させました.

テストデータ(訓練データとは別の各3000個)に対し, 以下の結果が得られました.

  LR RF MLP
TPR(%) 93.9 91.8 93.9
FPR(%) 6.7 5.1 6.9

 

TPR: マルウェアの内, 正しくマルウェアと予測された割合

FPR: 良性ファイルの内, 誤ってマルウェアと予測された割合

※現実的にはこのFPRは高すぎます

マルウェア検出器の回避手法

作成したマルウェア検出器をどのように回避する(良性ファイルとして誤分類させる)のかというと, 一つの手段として, 攻撃者がマルウェアにダミーのコードを追加するかのごとく, 良性ファイルの特徴量をマルウェアの特徴量に加えるということが考えられます. これを実装したものにMalGANがあります.

 

MalGANはHuらが提案した, GANを応用した検出回避手法です. 要するにニューラルネットワークを攻撃に使用したものです.

Windows APIを特徴量としてマルウェア分類する検出器に対し, 以下の手順を繰り返すことで検出を回避するマルウェアの特徴量(APIリスト)を生成します.

  1. 生成器(Generator)による特徴量生成
  2. マルウェア検出器(Black-Box Detector)によるラベル付
  3. 代替識別器(Substitute Detector)によるマルウェア検出器の分類規則の学習
  4. 生成器による良性ファイル(Benign)生成の学習

f:id:phantasmagoria812:20181216195355p:plain

MalGAN (Huらの論文より引用)

実際の彼らのコードはこちらにあがっていますが, いろいろと突っ込みどころがあったので私なりに改良しています. また, 今回はデモ用にコードを多少簡素にしています.

今回改良したMalGAN

詳細な変更箇所は省略しますが, 改良したMalGANの構成は以下のようになっています.

f:id:phantasmagoria812:20181216201828p:plain

改良したMalGAN

まず, マルウェアに追加するためのAPIリストを作成します.

今回は検出器の学習には使われていない, 30個の良性ファイルから抽出された1799次元のAPIリストを作成しました.

改良したMalGANは, そのAPIリストに回避させたいマルウェアAPI(59次元)の重複しないものを追加した, 1807次元の特徴量からAPIリストを生成します.

 

いざ, LR検出器を回避

f:id:phantasmagoria812:20181216204932p:plain

0エポック目から回避できてますね...ガバガバすぎる...

しかし生成データのAPI数に制約をかけていないため,

f:id:phantasmagoria812:20181216205822p:plain

このとおり元のマルウェアに対し, 928-59=869個のAPIを追加したものが生成されてます. これでは使い物になりません.

そこで生成器に対し, 次のような損失を与えます.

f:id:phantasmagoria812:20181216212058p:plain

xハットは生成された特徴量, xはマルウェアの特徴量, mは次元数, nはバッチサイズです.

これを適用すると,

f:id:phantasmagoria812:20181216220219p:plain

このように回避に必要なAPI数を減らしていくことができるわけですね. ちなみに元のマルウェアの次元数に近づくような式にしてます.

しかしながら, API数を減らしていくということは回避もしにくくなるわけで, 学習も不安定になります. 途中からマルウェアと分類されるものしか生成できなることも多々あります.

またこの時, 検出器のアルゴリズムによって減らせるAPI数に差がでてきます.

今回の試行ではLRは約200, RFは約400, MLPは約230に収束しました.

この数値は分類モデルの堅牢性を示す上で重要になってきますね.

MalGANの使い道

堅牢性の検証に使えることは言わずもがなですが, それ以外だと訓練データの増幅に使えるのではないかと考えています. マルウェアの検体ともなると入手が困難ですから. ただし, 安易な増幅も誤検知をまねくのが機械学習検出の難しいところです.

終わりに

マルウェア検出器に対し回避攻撃を行うことで, 分類モデルにおける堅牢性の重要さを示しました.

今回はAPIのみを扱いましたが, その他生成しやすいパラメータを特徴量に用いている場合は注意が必要になると思います.

これを機に堅牢性について一考してもらえると幸いです.