Logo

GDKDEによるAdversarial Attackの理論

更新    公開  
Note

勉強していたことをまとめたものです。一部誤りがあるかもしれません。

マルウェア文脈におけるAdversarial Attackを想定しています。

論文: Evasion attacks against machine learning at test time(2013)

1. KDE(カーネル密度推定)の基礎

カーネル密度推定(Kernel Density Estimation, KDE) は与えられたデータから、その下にある未知の確率密度関数を推定するノンパラ手法。

ヒストグラムのようにビンにデータ点を数える代わりに、各データ点の近傍になめらかな「カーネル関数」(例えばガウス関数)による山(コブ)を配置し、それらを重ね合わせることで全体の密度関数を推定する。

KDEの数式表現は次の通り。データ点を x1,x2,,xnx_1, x_2, \dots, x_n とし、カーネル関数を KK, バンド幅(平滑化パラメータ)を hh とすると、ある点 xx での推定密度 f^h(x)\hat{f}_h(x) は以下で与えられる。

f^h(x)=1nhi=1nK(xxih)\hat{f}_h(x) = \frac{1}{nh}\sum_{i=1}^n K\left(\frac{x-x_i}{h}\right)

この式では、各データ点 xix_i について、その周りに幅 hh のカーネル関数 KK を置き、データで平均を取る。典型的には、ガウス核(Gaussian kernel) と呼ばれる標準正規分布(平均0, 分散1のガウス関数)

K(x)=12πex2/2K(x) = \frac{1}{\sqrt{2\pi}}e^{-x^2/2}

をカーネルに採用することが多い。

こうすることで、 f^h(x)\hat{f}_h(x) はガウス分布の重ね合わせ(混合分布)として計算され、データ点が密集している領域では多くのカーネルが重なるため高い密度推定値が得られ、データがまばらな領域では密度が低く推定される。

直感的には、各データ点が「小さな山」を形成し、その山の総和が確率密度の推定結果になる。

image 引用: カーネル密度推定, Wikipedia

2. GDKDEとは

GDKDE(Gradient Descent and KDE)は、ラプラシアンカーネルを用いた密度推定を攻撃アルゴリズムに組み込むことで、より「自然な」攻撃を行うものである。

勾配降下法(Gradient Descent)による最適化の文脈では、攻撃者はある損失関数 F(x)F(\mathbf{x}) を最小化するためにマルウェアサンプル x\mathbf{x} を段階的に更新していく。マルウェア検知回避のための基本的な損失関数は、モデルが出力する「マルウェアであるスコア」を表す関数 g(x)g(\mathbf{x}) (この値が大きいほどマルウェアらしいことを示す, SigmoidやLogitなど)を低減させることが目的になる。

しかし、g(x)g(\mathbf{x}) だけを最小化すると、しばしば決定境界の「穴」のような低密度領域(すなわち局所最小値)にサンプルが移動し、不自然な特徴を持つサンプルになってしまう恐れがある。そこでGDKDEでは、損失関数に密度ペナルティ項を追加し、サンプルがクリーンウェアデータの高密度領域から極端に外れないように誘導する。

Attack Strategy

攻撃者の最適な攻撃戦略は、マルウェアサンプル x0\mathbf{x}^0 に対し、g()g(\cdot) またはその推定値 g^()\hat{g}(\cdot) を最小化するサンプル x\mathbf{x}^* を見つけることである。ただし、 x\mathbf{x}^*x0\mathbf{x}^0 からの距離が、以下の制約を満たす必要がある。

x=argminxg^(x)s.t. d(x,x0)dmax.(1)\mathbf{x}^* = \arg \min_{\mathbf{x}} \hat{g}(\mathbf{x}) \tag{1} \\ \text{s.t. } d(\mathbf{x}, \mathbf{x}^0) \leq d_{\max}.

一般にこれは非線形最適化問題となる。これを解く方法として勾配降下法を用いる。しかし、g^(x)\hat{g}(\mathbf{x}) は非凸関数である可能性があり、勾配降下法では大域的最適解に到達できない場合がある。

代わりに、降下経路が平坦な領域(局所最小値)に到達する可能性がある。これはサンプルの支持の外側、すなわちp(x0)p(\mathbf{x} \approx 0) の領域にある場合である。この場合、攻撃サンプルが回避成功するかどうかは 未サポート領域における gg の振る舞いに依存してしまい、成功を確信できない。

Fig 1

引用: Evasion attacks against machine learning at test time(2013)

このために、攻撃者が回避成功の確率を高めるには、クリーンウェアが密集する領域から攻撃ポイントを選択すべきである。こうした領域では g^(x)\hat{g}(\mathbf{x}) の推定値がより信頼度高く(実際のg(x)g(\mathbf{x})に近づく)、その値は負の方向に向かう傾向がある。

この欠点を克服するため、攻撃目的(loss)関数に追加の要素し、次の目的(loss)関数を定義する。

F(x)=g(x)λp(xyc=cleanware)F(x) = g(x) - \lambda p(\mathbf{x} \mid y^c = \text{cleanware})

ただし、λ0\lambda \ge 0 はトレードオフを調整するハイパーパラメータである。第一項 g(x)g(x) は「サンプル x\mathbf{x} がマルウェアと判定される傾向」を表し、第二項は x\mathbf{x} がクリーンウェアの密集する領域にあるほど大きくなる。この F(x)F(x) を小さくする(最小化する)ことが攻撃者の目的とする。また、True Labelの yy と検知器が導くラベル ycy^c は区別して扱う。

バイナリ特徴量における p(xyc=cleanware)p(\mathbf{x} \mid y^c = \text{cleanware}) はラプラシアンカーネル(もしくはRBFカーネル)を使えば良い。

p(xyc=cleanware)=1ni=1nexp(xxi1h)p(x \mid y^c = \text{cleanware}) = \frac{1}{n} \sum_{i=1}^n \exp \left(-\frac{\|\mathbf{x}-\mathbf{x}_i\|_1}{h}\right)

ここで、xxi1\|\mathbf{x}-\mathbf{x}_i\|_1x\mathbf{x}xi\mathbf{x}_i1\ell_1 ノルム(ハミング距離)であり、nn は検知器 ff がクリーンウェアと判定する(つまりyc=cleanwarey^c = \text{cleanware}となる)サンプルであり、攻撃者が推定のために用意できるサンプルの数である。すなわち、攻撃者の戦略は次のように置き換わる。

argminxF(x)=g^(x)λniyic=cleanwarek(xxih)(2)\arg \min_{\mathbf{x}} F(\mathbf{x}) = \hat{g}(\mathbf{x}) - \frac{\lambda}{n} \sum_{i | y_i^c = \text{cleanware}} k \left(\frac{\mathbf{x} - \mathbf{x}_i}{h}\right) \tag{2} s.t. d(x,x0)dmax,(3)\text{s.t. } d(\mathbf{x}, \mathbf{x}^0) \leq d_{\max}, \tag{3}

直感的にいえば、 F(x)F(x) を減少させるには、

(a) マルウェア分類器の出力するマルウェアスコア g(x)g(x) を下げつつ

(b) xx をクリーンウェアサンプルの分布が高い領域(すなわち p(xyc=cleanware)p(\mathbf{x} \mid y^c = \text{cleanware}) が高い領域に留まらせる

という2点を解決する必要がある。この密度項により、勾配降下法が導く方向は単に分類器を騙すだけではなく、「よりクリーンウェアに似せる」方向となる。その結果、生成された攻撃サンプルはモデルから見てより本物のクリーンウェアサンプルらしい特徴を持つようになり、検知をすり抜けやすくなる。

このアプローチは従来から知られるMimicry攻撃(正常動作の模倣攻撃)と同様に、攻撃対象のシステムに正常データを真似た痕跡を持ち込むことで検知を回避する効果がある。

そのため、以降ではこの項をmimicry componentと呼ぶ。

Important

mimicry componentを使用した場合(λ0\lambda \ge 0)、勾配降下は g(x)g(\mathbf{x}) のみを最小化する場合(λ=0\lambda = 0) と比較して、明らかに非最適な経路をたどることを指摘しておく。そのため、λ=0\lambda = 0 の時に達成される g(x)g(\mathbf{x}) と同じ値に到達するには、より多くの変更が必要になる可能性がある。しかし、 勾配降下法は局所最小値に陥る可能性があるためこれが重要となる。

勾配降下の手順では、F(x)F(x) の勾配 F(x)\nabla F(x) を計算し、その反対方向へ少しずつ x\mathbf{x} を更新していく。F(x)F(x) の定義から、勾配は

F(x)=g(x)λp(xyc=cleanware)\nabla F(x) = \nabla g(\mathbf{x}) - \lambda \nabla p(\mathbf{x} \mid y^c = \text{cleanware})

となる。したがって、g(x)\nabla g(x) が「よりマルウェアスコアを下げる方向」を示すのに対し、p(xyc=cleanware)\nabla p(\mathbf{x} \mid y^c = \text{cleanware}) は「より良性データが多い領域へ向かう方向」を示す。

λ\lambda によってこの二つのバランスが調整されることになる。λ=0\lambda = 0 なら従来通り分類器スコアだけを最小化し、λ\lambdaが大きいほど「クリーンウェアらしさ」を重視した更新となる。結果として、「適切な λ\lambda」のもとで勾配降下法を用いると、攻撃サンプルは徐々に検知モデルの決定境界をすり抜けつつ、クリーンウェアのデータ分布に溶け込むような方向へ変化していく。この密度推定項は低密度領域にサンプルが迷い込むことを防ぐ一種の「ペナルティ項」として働くため、攻撃を加速させるものではない。勾配降下法が局所解に陥ったり不自然な解を見つけたりするのを緩和する。

ここでいう「適切な λ\lambda」は、g(x)\nabla g(\mathbf{x}) とのバランスを取れるように設定するべきであり、

p(xyc=cleanware)=1nhiyic=1exp(xxi1h)(xxi)\nabla p(\mathbf{x} \mid y^c = \text{cleanware}) = \frac{1}{nh} \sum_{i | y_i^c = -1} \exp\left(-\frac{\|\mathbf{x} - \mathbf{x}_i\|_1}{h}\right) (\mathbf{x} - \mathbf{x}_i)

であることから、O(1nh)O(\frac{1}{nh}) を考慮しなければならない。目的関数内の λ\lambda の値を、 λnh\frac{\lambda}{nh} の値が識別関数 g^(x)\hat{g}(\mathbf{x}) の値の範囲と同等(またはそれ以上)になるように選択する必要がある。

3. アルゴリズム

  1. 初期設定: 攻撃対象のマルウェアサンプルをx0\mathbf{x}^0 とする。これが初めはモデルにマルウェアと分類されるポイントである。攻撃者は許容できる改変の範囲(例: 元のプログラムからの距離 dmaxd_{\max})やステップサイズ tt, 密度項の重み λ\lambda, 収束判定しきい値 ϵ\epsilon を決定する
  2. 勾配計算: 現在のサンプル xm\mathbf{x}^m における損失関数 F(xm)=g(xm)λp(xmyc=cleanware)F(\mathbf{x}^m) = g(\mathbf{x}^m) - \lambda p(\mathbf{x}^m \mid y^c = \text{cleanware}) の勾配 F(xm)\nabla F(\mathbf{x}^m) を計算する。これは分類器の出力スコアに関する勾配と、クリーンウェアデータ密度の勾配を組み合わせたものである。F(xm)=g(xm)λp(xmyc=cleanware)\nabla F(\mathbf{x}^m) = \nabla g(\mathbf{x}^m) - \lambda \nabla p(\mathbf{x}^m|y^c=\text{cleanware})
  3. サンプルの更新: xm\mathbf{x}^mを次のステップでは xm+1=xmtF(xm)\mathbf{x}^{m+1} = \mathbf{x}^m - t \cdot \nabla F(\mathbf{x}^m) と更新する。つまり、F(xm)\nabla F(x^m) の方向に沿ってステップサイズ tt だけサンプルを移動させる。この操作で分類器の出力スコアを下げつつ、クリーンウェア密度の高い方向へサンプルをわずかに変化させる。
  4. 制約の適用: 更新後のサンプルが元のサンプルを超えてしまった場合、そのサンプルを許容範囲内に射影する
  5. 反復と収束: 上記の勾配計算と更新を繰り返し行う。回避成功または変更量が収束判定しきい値 ϵ\epsilon を下回った場合、ループを終了する。

Algorithm 1

引用: Evasion attacks against machine learning at test time(2013)