機械学習/深層学習でマルウェア分類することの意味とは

またまたごぶさたしています。ようやっと仕事に余裕が出てきました。

最近、うちの学生が深層学習でマルウェア分類する研究をしています。これはもうそろそろ発表されるので言ってもいいと思うんですけれども、具体的には、マルウェアバイナリを画像変換して、CNN系の学習をかけています。

画像変換!?

おまゆう!?

とおっしゃるでしょうね。ええ、ええ。確かに以前のブログで私は画像化して分類することに、批判ではないんですけれども疑問を投げかけましたとも。でも学生がやることを止められます?止められないではないですか(開き直り)

まあ、別にそのことはいいんです(論点ずらし!?)。今回言いたいのはそのことじゃなく、マルウェア分類そのものについてです。この学生の成果もありがたいことにですが、他の先行研究でも、分類を行って、かなりいい成果を出してます(F1値0.97、Accuracy0.99とか)。でも、そのこの単体では、マルウェアを発見し分類するという実際の活動において、どんな意味があるんですかね?

例えば、この学生の使っているデータセットは2種類。1つは、kaggleで公開されているMicrosoft Malware Classification Challenge (BIG 2015)。こちらは、コンテスト用に提供されているもので、PEヘッダが削除されているため、そのままでは実行できず安全に扱えるのが特徴です。もう一つは、Malimg Datasetと呼ばれるもので、文字通り、マルウェアデータを画像変換したデータセットです。Dropboxでダウンロードできるようになっています。kaggleの方は9種類、Malimgは25種類のマルウェアファミリで構成されています。

…ということはですよ。先ほどの先行研究にしろ高い精度ってのは、必ず9なり25種類のどれかに分類されることが分かっているデータでやっての話であって、現実にはそれ以外のファミリ、ひいては未知のマルウェアもある訳で、もしそんなマルウェアが来た際に9なり25種類のどれかに分類してしまったら、それは正しい結果ではないですよね。では、この分類器を現実のマルウェア解析で使おうとすると、まず、9ないし25種類以外のファミリらしきものはあらかじめ除いておいて、それから分類器にかけるということになりますが…なんでしょうね。それって。
…という議論に先日のゼミでなったので、メモしておいたのでした。

何が言いたいかというと、見た目結果よさそうな研究でも、現実的にそれってどう役に立つの?っていうのが多々あるってのと、特にうちのドクターに行くような学生には、もっとそういう実際的、かつ俯瞰的な観点からマルウェアの研究を行ってほしいところです。

…あくまで、「うちの学生」向きに話してるので、今回は(?)喧嘩売ってないと思いますよー。

マルウェアのイメージ化→機械学習の「元凶」

「元凶」なんて、悪いイメージの言葉を使って、すみませんでした!

…と、先に謝っておいて、と。

そうなんです。最近、マルウェアのバイナリを2次元イメージ化して、CNNなどの深層学習で分類させるというのが、流行ってますよね。去年のCSSでもいくつかそういう発表を見かけました。バイナリって、そもそも1次元情報だし、特徴点だって2つじゃないだろうに、なんで2次元?ひょっとして、CNNとかが画像解析に実績があるからって、それだけ?と常々思ってました。そうこうしているうちに、うちの学生もそんなことやりたいと言いだしたので、「なんでなんで!?」と問い詰めた訳です。そしたら、下の論文を見つけてきまして…

[1]L. Nataraj, S. Karthikeyan, G. Jacob, B. S. Manjunath. “Malware Images:  Visualization and Automatic Classification”, VizSec’11, July 20, 2011, Pittsburg, PA, USA.

こいつだ!こいつが元凶(すみません)!
…という訳で読んでみました。概要はこんな感じ。

  • マルウェアのバイナリをイメージ可視化、パターン認識による分類してます
  • なんでかというと、同じファミリーに属するマルウェアは似たようなレイアウト、内容だから!
  • この方式ならば逆アセンブルもコード実行も必要ない!
  • ユークリッド距離のk-nearest neighborでやってます
  • 25ファミリー、9,458のサンプルをテストして98%の分類精度が得られたよ!

ってことなんですが。著者らによると、マルウェアのバイナリを画像化して見てると、模様のようなものが出てくると。だから分類可能なんじゃないかと、例として上がってる画像が下のもの。

出典:[1]

まあ、こいつなら目grepできそうだけど…
それにしても、こんなの幅次第で変わるじゃん?それに、packer変えたらバイナリも変わっちゃうから意味ないのでは?

幅については、次のように決められているらしい。

ファイルサイズ画像の幅
<10KB32
10KB~30KB64
30KB~60KB128
60KB~100KB256
100KB~200KB384
200KB~500KB512
500KB~1000KB768
1000KB≦1024
出典:[1]

…だからなんでこういう設定!?

packerについては、今回のはunpack後にやっている。が、packされていても98%の精度があると主張している!ホントかよ!後の研究によれば、packが完全な暗号じゃなかったり、同じファミリーが同じpackerを使う傾向が多いかららしい。じゃ、違うpacker使ったらアウトじゃね?

この元凶が(申し訳ございません)2011年ですが、国内でというと下記の発表でしょうか。

矢倉大夢,篠崎慎之介,西村礼恩,大山恵弘,佐久間淳.“CNNと注意機構による画像化されたマルウェアの解析手法”,コンピュータセキュリティシンポジウム2017.

なんと、その年の優秀論文賞を受賞されています。はーん。この受賞が流行の元か。

彼らは、単純に模様で見るのではなく、(1)されたバイナリデータをCNNにかけ、マルウェアに特徴的な領域を検出して、(2)CNN に注意機構と呼ばれる仕組みを組み合わせることによって,画像の中で分類に重要な領域を示す「注意度マップ」を出力しています。
注意機構というのは、深層学習において用いられる手法の1 つで、重要な特徴を動的に選び出し,それらを直接的に用いるのだそうです。自然言語処理の研究で提案されたものだそうです。画像認識では、画像につけられたキャプションを最も特徴的にあらわす領域を抽出することができます。例えば、画像に「バイオリン」というキャプションがついている時、バイオリンの領域を抽出できる訳です(この例の画像はこの解説記事を参照ください)

で、矢倉さん達も、unpackしなくても同等の精度が得られると言ってます。うーーん、そういうものなんですかね。今一つ釈然としないのだが