FFRIエンジニアブログ

株式会社FFRIセキュリティのエンジニアが執筆する技術者向けブログです

Adversarial Example 検知のバイパス:ホワイトペーパーの補足として

はじめに

基礎技術研究室リサーチエンジニアの茂木です。 最近、Adversarial Example についてまとめたホワイトペーパーを出しました。 こちらがホワイトペーパーのリンクです。

今回は、このホワイトペーパーで触れた、Adversarial Example の検知のバイパスについて、実際に行ってみます。

Adversarial Example とは

まず、Adversarial Example について簡単にご説明いたします。

Adversarial Example とは、微小な摂動を加えることで、機械学習モデルに誤分類を起こさせる攻撃です。

図 1 では、パンダの画像に摂動を加えることで、テナガザルに誤分類させています。

図 1 [1]より微小な摂動を加えることでパンダの画像がテナガザルに誤分類されることを示す図

画像だけでなく、自然言語や、音声など、他の分野でも Adversarial Example は問題となっています。

さて、Adversarial Example の研究が進むにつれ、防御手法も複数提案されました。

ですが、真に防御することは難しく、機械学習のトップ国際会議にアクセプトされたような手法でも次々に破られていきました[2,3,4]。

詳しくはホワイトペーパーをご参照ください。

検知手法のバイパス例

さて、ここではホワイトペーパーでご紹介した検知手法のバイパスについて、実際に行ってみます。

まず、ベースとなる分類モデルを作成します。 今回は、MNIST データセット[5]で学習した CNN モデルを作成します。MNIST データセットは、手書きの 0 から 9 までの画像とその数字のラベルのついたデータセットです。今回はこれを 10 クラスに分類します。

10 エポック学習した結果、約 98% の正解率でした。

ubuntu@hoge:~/break-defense$ poetry run python break_defense/main.py train-base
1/10, train_loss: 0.83113, val_loss: 0.25082
#省略
10/10, train_loss: 0.08940, val_loss: 0.05574
test loss: 0.05145, acc: 0.98340

(作成したスクリプトの出力の数字以外を一部改変して示しています。)

次に、このベースモデルに対し、Adversarial Example を作成します。

今回は、(Targeted) PGD Attack を使い Adversarial Example を生成します。PGD Attack には advertorch[6] を用いました。

ubuntu@hoge:~/break-defense$ poetry run python break_defense/main.py create-adv

生成された Adversarial Example は、図 2 のようなものです。

図 2 本来は 5 だが 9 と誤分類された Adversarial Example

次にこれらを検知するモデルを作成します。 今回用いる手法は、Adversarial Example であった場合に 11 クラス目として分類する分類器を作成することで、検知するものです。ここで、Adversarial Example でなければ元々の 10 クラスに分類します。この手法は[7]で提案されました。

結果、検知率は 100% と極めて良好でした。

ubuntu@hoge:~/break-defense$ poetry run python break_defense/main.py train-detector
1/10, train_loss: 0.47912, val_loss: 0.12336
# 省略
test loss: 0.02711, acc: 0.99120
detection rate: 1.00000

さて、本題である検知のバイパスを行います。 実はバイパスの手法は単純です。 本来のクラスでも、11 番目のクラスでもないクラスに誤分類されるような Adversarial Example を検知器に対して生成するだけです。 例えば 2 の手書き文字であれば 3 に分類されるように摂動を加える、といった方法です。この手法は[3]で提案されました。

実際にやってみると、攻撃成功率(狙ったクラスに誤分類させた率)は約 97 %でした。また検知率は約 1.5% にまで低下しました。

ubuntu@hoge:~/break-defense$ poetry run python break_defense/main.py bypass
attack success rate: 0.96750
detection rate: 0.01540

つまり、検知器のバイパスが成功しています。

これによって生成された Adversarial Example は図 3 のようなものでした。

図 3 本来は 2 だが 8 と誤分類された Adversarial Example

おわりに

今回、Adversarial Example の検知手法のバイパスを行いましたが、これを体験できるインターンを行います。Adversarial Example の生成手法の実装も行います。

詳しい内容は以下のリンクからご覧ください。 https://open.talentio.com/r/1/c/ffri.1440_recruit/pages/21697

また、私の所属する基礎技術研究室では、この他にも「CPU レベルでの脆弱性防御機構の作成」というインターンも開催します。 このインターンでは、近年注目を集めているオープンな命令セットアーキテクチャ RISC-V を題材にしています。脆弱性を突く攻撃コードの作成とそれを通じた防御に必要な知識の習得、CPU レベルで脆弱性攻撃から防御する機構の自作を体験できます。

こちらのインターンの説明は以下のリンクからご覧ください。 https://open.talentio.com/r/1/c/ffri.1440_recruit/pages/20767

FFRIセキュリティではサイバーセキュリティに関する研究開発を希望するエンジニアを募集しています。採用に関しては こちら を御覧ください。

参考文献

[1] Ian J. Goodfellow, Jonathon Shlens, Christian Szegedy, "Explaining and Harnessing Adversarial Examples." ICLR(Poster) 2015

[2] Nicholas Carlini, David A. Wagner, "Towards Evaluating the Robustness of Neural Networks." IEEE Symposium on Security and Privacy 2017: 39-57

[3] Nicholas Carlini, David A. Wagner, "Adversarial Examples Are Not Easily Detected: Bypassing Ten Detection Methods." AISec@CCS 2017: 3-14

[4] Anish Athalye, Nicholas Carlini, David A. Wagner, "Obfuscated Gradients Give a False Sense of Security: Circumventing Defenses to Adversarial Examples." ICML 2018: 274-283

[5] "THE MNIST DATABASE of handwritten digits." http://yann.lecun.com/exdb/mnist/

[6] Gavin Weiguang Ding, Luyu Wang, Xiaomeng Jin, "advertorch v0.1: An Adversarial Robustness Toolbox based on PyTorch." https://arxiv.org/abs/1902.07623

[7] Kathrin Grosse, Praveen Manoharan, Nicolas Papernot, Michael Backes, and Patrick McDaniel, "On the (Statistical) Detection of Adversarial Examples." https://arxiv.org/abs/1702.06280