[CODE BLUE 2018] The Mystery of WannaCry Mutants – 突然変異が引き起こす情報漏えいのメカニズムに迫る 岩村 誠 [レポート] #codeblue_jp

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、芳賀です。

『世界トップクラスのセキュリティ専門家による日本発の情報セキュリティ国際会議』でありますCODE BLUE 2018に参加していますのでレポートします。

このブログは下記セッションについてのレポートです。

The Mystery of WannaCry Mutants - 突然変異が引き起こす情報漏えいのメカニズムに迫る Presented by 岩村 誠

WannaCryは、2017年5月に大規模な被害をもたらしたワーム機能を備えるランサムウェアである。ある報告によると、WannaCryは150か国30万台以上のコンピュータに感染、また登場から3か月で約6万件の亜種が発生したと言われている。我々は、WannaCryが明示的な自己変異機能を持たないにも関わらず、その実行ファイルに多様性があることに疑問を抱き、変異の原因を調査した。その結果、WannaCry感染時にカーネルメモリの未初期化領域がWannaCryの実行ファイルに混入する条件を発見した。これは、カーネルモードで動作するバックドアDoublePulsarが、WannaCryから受信したペイロードを適切に処理していないことに起因する。不幸なことに、この特殊な条件の存在はWannaCryの変異を理由づけるだけでなく、WannaCryへの感染を契機とした機密データの漏えいを暗示している。つまり、カーネルメモリの未初期化領域には機密データを含むその端末で扱ったあらゆるデータが含まれ、そうしたデータが混入したWannaCryの実行ファイルは、ワーム機能により世界中に拡散し続けている恐れがある。 本発表では、我々が発見したWannaCry感染に伴う突然変異のメカニズムと、再現実験の手順、実験結果を報告する。また、WannaCryの実行ファイルに本来では考えられない様々な情報(NTFSのマスターファイルテーブル等)が混入している例を紹介し、人知れず拡散し続けるWannaCryのミュータントにどう対処していくべきかを展望する。

レポート

  • 岩村氏は。SECCONの問題を作ったりしていた
  • 昼食後なので、眠気覚ましに16進のQuiz
    • JPEG, PNG, NTFSのMFT, HTTP Response
    • 実はWannaCryのコードに上記のバイナリコードが入っていた
  • 2017年5月に観測された(24時間で150カ国以上,30万台以上)
  • WannaCryは、ワーム機能がついたランサムウェアでkillスイッチをもっていた
    • 亜種にはkkillスイッチが無いものあった
    • SMB v1脆弱性(MS17-010):リモートからカーネル権限を奪う強力なものが使われた
    • 亜種は6件とか3万5千件とニュースサイトで騒がれた
      • ただし、違いはkillスイッチの有無とか機能の違いはすくない
      • なぜ、こんなに亜種があるのか?が研究のきっかけだった
  • WannaCry の感染の仕組み
    • EternalBlue : SMBサーバの脆弱性を攻略する部位
    • DoublePulsar: SMBサーバにバックドアを仕込む部位
    • バックドアを使った感染は、シェルコード、DLL、EXEの順番で処理する
    • ペイロードで送られるデータ量は5Mbyteぐらいだが通信は4kByteに分割されて送られる
    • ペイロードはメモリ上にダウンロードする
    • ダウンロードされたら、前述の処理順番で活動が始まる。
  • WannaCry突然変異の仮説1
    • 4096バイトを送信している処理
    • recv()関数は受信できたバイト数が返ってくるのだがプログラムではそのように判断されていない
    • そのため中途半端なパケットが送信され、通信が終了する
    • ただ、WannaCryの感染コードはExAllocatePoolでメモリへ確保されている
    • ExAllocatePool FunctionのMS注意ドキュメント
      • これで確保されるメモリ領域は未初期化領域である
      • 使用する場合にはゼロクリアして利用することを推奨
    • そのため、未初期化されたデータがWannaCryへ溶け込んで実行される。
    • 亜種の増えた理由は、実はこのメモリ確保が原因ではないか?と仮説を考えた
      • 最初に見せた、JPEG, PNG, NTFSのMFT, HTTP Responseなどがそれである。
    • 仮説を検証するためVirusTotalから150を越える検体を調べた
      • 32bit/64bitで違いがあり、32bitが多ければ仮説1が成り立つ
      • しかし、64bitの方が多く亜種を生み出していた
      • 仮説1以外にも亜種を生んだ理由がありそうだ
  • WannaCry突然変異の仮説2
    • ワーム機能でペイロードの書き換えがあるのではないか?
    • 同時刻に複数端末の感染活動が1つの対象へ行われると受信ペイロードが上書きされる
    • そのため、複数から送信されると途中に未受信領域があっても最終ペイロードの受信でシェルコードが実行されはじめる
    • その未受信領域がゼロクリアされていないメモリ領域としてWannaCryへ溶け込むのではないか?
      • 某省庁がWannaCryへ感染したが暗号化処理が壊れて暗号かされなかった
    • 仮説2を検証するためにエミュレータで検証
      • CPUのエミュレータで動かして、それっぽい挙動が出た
  • 最後にカーネルメモリガチャ
    • VirusTotalから検体を収集
    • WannaCryに溶け込んだ”ユーザーのメモリ領域”を解析してみた
    • JPEGやPNGなどが多かったが、一部でHTTPトークン、APIキーが入っていた。
  • まとめ
    • WannaCryの感染による情報漏洩の可能性を示唆させていただいた
    • 同一サブネットに感染が起きたため、情報漏洩する突然変異が起きた
    • 同一サブネットで感染が発生しても外へ出るネットワークルートがなければ、漏洩の可能性は低いのではないか?

感想

WannaCry自体も脅威だが、感染の仕組みの中でWannaCryのバグのせいで情報漏洩があり得る話は興味深かった。ExAllocatePoolなどの低レイヤーのコードを書く時には注意すべき点があることを再認識させられた。