技術者ブログ

クラウド型WAF「Scutum(スキュータム)」の開発者/エンジニアによるブログです。
金床“Kanatoko”をはじめとする株式会社ビットフォレストの技術チームが、“WAFを支える技術”をテーマに幅広く、不定期に更新中!

2017年10月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
  • お問い合わせはこちら
Scutum開発者/エンジニアによる技術ブログ WAF Tech Blog

機械学習とセキュリティについての勉強会で発表してきました

はじめに

2017/9/10(日)に「Security meets Machine Learning」に参加し、Scutumにおけるデータサイエンスの使い方について発表を行ってきました。今回は簡単な参加レポートをしたいと思います。

自分の発表

私はトップバッターでした。40分ほど時間を頂き、Scutumの防御機能の中核であるベイジアンネットワークや、最近導入を開始しているクラスタリングによる異常検知について紹介をさせていただきました。講演に使った資料は我々の主な敵であるスクリプトキディに見られたくない部分を含むため、非公開となっています。

現在、24時間休みなく、Scutum上を正常と異常が混ざった大量のデータが通過していきます。まさに「ビッグデータ」が手に入る状況ですが、それらすべてに「攻撃である・攻撃ではない」のようなラベルを付けることは現実的ではありません。そのためKaggleをウォッチして勉強した一般的な教師有り学習のテクニックは導入できておらず、クラスタリングによる教師無し学習によって正常(ありがち)とそれ以外を分けるところまでしかできていません。

教師有り学習にはできていないものの、やはりデータ量は正義であり、クラスタリングで得られた「ありがち」なデータをうまく使うことで、エキスパートの専門知識を量で上回り、それを使って誤検知を減らすことに繋げることができています。

40分も話ができる講演は久しぶりだったので最初はゆっくり喋っていたのですが、最後は結局時間が足りず、ちょっとあわただしい展開となってしまいすみませんでした。講演後、何人かの方から非常に参考になるフィードバックを頂くことができ、話をさせていただいて良かったと感じています。

マルウェア検出とコンセプトドリフト

基本的に(私が見ている範囲では)「機械学習とセキュリティ」というテーマではマルウェアの検出が主流となっています。私のようにウェブセキュリティ系は少数派です。この日もマルウェア系の発表が多くありました。私はマルウェアは完全に門外漢ですが、基本的に機械学習あるいはデータサイエンスというのは対象のドメインを少し抽象化してしまえば似ている部分が多くあるため(例えば、極端にわかりやすく言えば「特徴ベクトル化してしまえばその後やることは一緒である」ということ)、自身のウェブセキュリティの世界で役に立つヒントが隠されていないかどうか、という視点で他の方の発表をきいていました。

愛甲氏の発表で気付かされたのは、そもそもマルウェアというのは定義が定かではないということです。ウェブセキュリティの場合、例えばSQLインジェクションなどは必ず攻撃で、はっきりと定義できます。「攻撃ではないが、SQLインジェクション」などというものはあり得ません。しかしマルウェアというのは色々な挙動をして(例えば、データを暗号化してから身代金を要求するなど)結果的にそれが悪意ある攻撃であったりするわけで、ここはウェブセキュリティと大きく違います。データの暗号化は、かならずしも悪意があるわけではなく、ユーザが自身の作業として行うこともあります。「マルウェア」あるいは「攻撃」の定義が難しいわけです。そして、仮に定義できたとしても、それが時代と共に比較的速く変化していくということです。ウェブセキュリティの世界ではSQLインジェクションは10年選手で、未だに原因も攻撃手法も、発見当初とまるっきり同じ姿をしています。しかしマルウェアは10年前と今のもので、まるで異なるものになっています。

このように検出したい対象が変化していってしまうことを「コンセプトドリフト」と呼ぶようです。この用語や、マルウェア検出でコンセプトドリフトが大きな問題になっていることは知らなかったので非常に勉強になりました。

教師有り学習にでき(て)ない問題

「今日、本当にここに来てよかったな・・・!」と思った点がひとつありました。それは「教師有り学習にでき(て)ない問題」がマルウェア検出の世界でもドッシリと存在している、あるいは「意味のない教師有り学習をしているケースが多い」と確認できたことです。先に書いたように現在Scutumでは「大量のデータはあるものの、ラベルが付いていない」状態であるため、近年の(ディープラーニングのように教師有り学習を中心としている)データサイエンスや機械学習の技術の急激な進歩や環境の整備をいまいち活用しきれていないという悩みがありました。これを自分は「教師有り学習にでき(て)ない問題」と呼んでいます。

マルウェア検出の研究の多くは、まずラベル付きのデータセットがあり、それを特徴ベクトルに変換してから教師有り学習、という流れを前提にしています。私から見るときちんと「教師有り学習にできている」ように見え、うらやましく思っていました。しかし実際にこの日にスピーカーの方々と会話したり発表をきいた感じでは、どうも「データセットは確かにあるが、古くて使えなかったり、質が悪かったりするため、現実的にはあまり役に立たない」という悩みが多いようです。

この日の発表の一つ、黒米氏の「死にゆくアンチウイルスへの祈り」は(タイトルは若干釣り成分を含んでいますが)実際の内容は教師有り学習の教科書とも言える王道を紹介しつつ、そこにマルウェア検出の研究の視点がほどよく混ざっているという非常に密度の高いものでした。私はKaggleをウォッチして教師有り学習の動向はざっととらえようと勉強していたため、この資料の内容は全体的に非常にうなずけるものでした。

この日会場に来る前は、「マルウェア検出では、データセットが整備されているのであれば、あとはKaggle的に単純に教師有り学習の精度を上げればそれで終わりなのではないか?」と思っており、現場や製品ではそのようなアプローチをしているのか?というのが知りたいポイントでした。しかし先述の通り、特に研究は古かったり意味のないデータセットでやってしまっているケースが多く、良いデータセットを手に入れることはあまり出来ていないようで、まさに「Garbage in, garbage out」なケースが多く見られるようです。

この事から、自分が「教師有り学習にでき(て)ない問題」を抱えていることについて劣等感を抱く必要はないな、と思えたのが非常に大きな収穫でした。

余談

その他に衝撃的だったのが、新井氏の講演の「PEヘッダを編集してマルウェアとして検出されないようになったが、実はEXEとして正常に起動しないので攻撃もできない」ようなものも、研究の中では「回避成功しました!」という数としてカウントされているケースがあるらしい・・と言うネタです。たまにScutumで観測するSQLインジェクションの攻撃でも、おそらくツールのバグのせいか送られてくる文字列の内容がおかしく、「それじゃSQLの文法エラーになるから攻撃が成功しないよ・・・」のような物があります。スクリプトキディが現場で失敗するのはよいとして、研究でそれはあまりにもお粗末だと思います。

また、私は現場での検知精度向上に役立たせることをはっきりとした目的としてやっていますが、研究者は新規性を求められたり、他の研究動向に付いていく必要があるなど、同じ「機械学習とセキュリティ」でも立場の違いによってアプローチがかなり異なっているな、という発見もありました。例えば現場では役に立つのならば旧来のシグネチャによる防御も多く使われますが、研究者にとってはそんな単純な手法はまったく自分の成果にならないので、他の物を探すことになるわけです。

今後もマルウェア系の研究についても参考にできる部分は参考にしつつ、より高い検知精度を目指して活動していくつもりです。