みなさんあのね

エクセルいじりがお仕事のインフラ系SEのメモ

cuckooとJubatusによるマルウェア解析

3月29日(土)、セキュリティ勉強会に参加するため、香川の高松に行ってきました。一番の目的はメインセッションであるFFRI 村上純一さんの「ビッグデータ分析によるマルウェア検知・分析への挑戦」です。真面目な勉強会の参加は初めてだったので緊張しました。

セキュリティうどんのご紹介

セキュリティうどんの主旨はこーんな感じ。なんかとっても真面目そうなイメージを受けました。運営スタッフさんは「セキュリティ系勉強会一のゆるい勉強会」だと言ってましたけどねw

セキュリティうどんの主旨
  • 香川県をメインに、セキュリティ啓蒙、システム管理者スキルアップ、 ユーザーのボトムアップを目的として勉強会を実施します。
  • また、「四国情報セキュリティ勉強会連絡会」を通じて、四国地方の技術者育成と、一般ユーザの情報セキュリティに関する意識向上を目指します。



今回の勉強会のテーマはこちら。

  • 1. 自己紹介(参加者全員!) 1分/人
  • 2. ライトニングトーク
  • 3. おやつタイム
  • 4. ビッグデータ分析によるマルウェア検知・分析への挑戦



おやつタイムって何だ、うどんでも食べるのか?なんて思っていましたが、普通に美味しい洋菓子が振る舞われました。参加費無料でおやつ付き…勉強会っていいもんですね。

ビッグデータ分析によるマルウェア検知・分析への挑戦

FFRI 村上さんによると、cukoo(かっこう)でファイルの挙動を確認した結果を、jubatus(ゆばたす)で機械学習させマルウェア検知を行い、その検知精度を調査したとのこと。

cuckooとは?

f:id:si871137:20140331223140p:plain
1つのファイルを解析する度に新しくVM(仮想環境)を起動させ、ファイル実行時の挙動をログとして出力することが可能です。サンドボックスや動的解析、ビヘイビアとも呼ばれています。
複数のアンチウィルスエンジンでの解析を行うクラウドサービス「VirusTotal」との連携も可能です。
# Pythonで実装されてるので、Pythonの知識があれば色々楽しめるかもしれません。


自分もcukooには1年ほど前に手を出したことがありますが、得られるのはファイルの実行過程の情報のみで、それがマルウェアであるかどうかの条件は自分で考えなければいけないため、上手く活用することができませんでした。
その解決策のひとつとして村上さんが考えたのが、jubatusによる機械学習でした。

jubatusとは?

f:id:si871137:20140331223943p:plain
jubatusを利用すると大規模データ(今回だとcukooの解析結果)をリアルタイムに解析することができる、”大規模分散リアルタイム機械学習基盤”です。


こちらは実際に触ったことがないので詳しい解説はできませんが、イメージとしてはHadoop/Mahoutのリアルタイム版ですかね?和製ソフトなので日本語情報を得やすいというのもjubatusの特徴だと思います。
機会学習の技術を応用することでアンチスパムメールECサイトのレコメンド機能、将棋ソフトのAIなどを実現させることができます。
身近な例だと、iPhoneアプリのAkinatorをイメージしてもらえばいいかと思います。「性別:男性」「名前:漢字」「年齢:25才以上」「癖:倍返しする」等の情報を学習させ、特定の人物を定義することができます。同じようにマルウェアも定義できそうですよね。
f:id:si871137:20140331222648j:plain

機械学習とは?
  • 人間がなんとなくできていること(ファジーな物事)を機械にもやらせようという意味。
  • 医療業界では昔から使われている技術らしい。
  • 様々なテーマ、手法を包含した総称である。


なぜ機械学習なのか?

既存のアンチウィルスソフトじゃダメなの?高価/高学習コストなサンドボックスに投資する必要あるの?という疑問が湧いてくるかと思います。その理由を説明するにはまず、マルウェアのトレンドについて知る必要があります。

パターンマッチング*1の限界

マルウェアというのはインフルエンザ等の自然発生する(と仮定させていただきますw)ウィルスと違い、マルウェアは人の手によって生み出されています。しかも、マルウェアを作成するのは必ずしもセキュリティに関する深い知識を持つ必要はなく、マルウェアを生成するツールによって生み出されています。(しかもその数は爆発的に増加しているとのこと)
さらに最近はマルウェア生成ツールに加え、難読化ツールマルウェアを難読化させたり、不特定多数の標的にするのではなく特定の企業をターゲットにしたカスタムマルウェアを使用することで、検知の目をすり抜けてしまうケースが増えているのです。

機械学習による検知テスト

様々なアプローチがあるみたいですが今回は以下の感じでテストしたそうです。

1. サンプルの取得

まずは学習させるためのデータ(マルウェア/正常なソフトウェア)を一定数準備する必要があります。どの程度のデータを集めるかは以下のようなポイントを考慮するといいらしいです。

  • 信頼区間と呼ばれる概念
  • どれくらいの誤差があってもよいか
  • 数が多ければ多いほど誤差は減る
  • 偏りがないよう、長い期間/様々な場所から少しずつデータを取得する(たぶん重要!)

今回のテストでは、データを15000個(学習用5000個/テスト10000個)準備したそうです。

2. cukooによる解析

cuckooではAPIコールの傾向についての情報を抽出します。多くのAPIコールは1秒で完了するため、5秒以上経っても完了しないものについてはテストの対象外としたそうです。

3. jubatusによる学習/解析

APIコールを3-gramモデルによって解析し、正常/異常のラベル(条件)を登録。(N-gramのNが3なのは、3-gramの精度が一番よかったからとのこと)
「VirtualProtectEX(難読化を解除するAPIコール)というAPIコールが3回続いたらマルウェアの動き」というようにラベルを登録して学習モデルを作成して行きます。
コマンドライン上から、ラベル情報(正常系/異常系)を元に学習モデルをダンプできるようです。→人間がモデルのダンプを確認して新ロジックを開発!

4. クラスタリングによる分類

マルウェアクラスタリング(グルーピング)し、ユニークデータを抽出(亜種や新種である可能性を見極める)することで、優先して解析すべき検体の選定を行え、解析の効率化が可能となります。

適用に伴う弊害
  • 学習データ/評価データの傾向が著しく異なる場合、分類精度が著しく低下する。
  • 正常系のソフトウェアは類似度の分布が広いため、学習データ/評価データの精度が違う可能性あり。

要するに、こういうことでしょうか?

  • ユニークなデータを学習データやテストデータにする割合が増える→誤検知率(FPR)が上がる
  • 亜種情報が増える→正しい検知率(TPR)が上がる
  • 質のいいデータを集めるべき


感想

  • 未知のマルウェア/カスタムマルウェア機械学習によって判別するのは難しい。今回村上さんにお話いただいた特徴とは別のファクターを考える必要あり。
  • 学習するためのサンプルデータ集めが死ぬほど大変そう。
  • この手の話はいたちごっこだから低コストでサンドボックスを自作しようなんて甘い考えは捨てて、専門家集団に任せる。自分たちが考えなければいけないのはマルウェア発見時の運用フロー。(とは言うもののマルウェアと判断することがきる人員の育成/確保もできた方がいいかも)
  • 個人で遊ぶ分にはjubatus面白そう!



勉強会の運営スタッフのみなさま、各セッションで登壇いただいたみなさま、本当にありがとうございました。ドーナツ美味しかったです!

おまけ

香川と言ったらうどん。高松市のうどん屋ってなかなか探すのに苦労しますよね。
セキュリティうどんの公式サイトに掲載されているうどんマップが参考になりました。

より大きな地図で うどんマップ を表示
http://sec-udon.jpn.org/doku.php?id=%E3%83%AA%E3%83%B3%E3%82%AF:%E3%81%86%E3%81%A9%E3%82%93%E3%83%9E%E3%83%83%E3%83%97

*1:パターンマッチングとは、マルウェア検知用のデータベースにウィルスの情報を登録して、その情報と検査対象のファイルを突き合わせることでマルウェア判定する手法のこと。