Volatility Pluginをバージョン3に対応する方法
The Volatility Foundationは2019年10月、Volatility Frameworkの次期バージョンであるVolatility 3のベータ版を公開しました。このVolatility 3はPython3への対応に加えて、Volatility 2から多くの点が改善されています。(変更点に関する詳細は、Volatility 3の公式ページをご覧ください。)特に大きな改善ポイントとして、追加のPluginを作成しやすくなっているのが特徴です。
Volatility 3は、2020年8月に正式バージョンのリリースが予定されており、Volatility 2のサポートは2021年8月に終了することがアナウンスされています[1]。そのため、今後のVolatility Plugin開発はVolatility 3が主流になっていくと思います。あわせて、これまでに開発されたVolatility PluginはVolatility 3では動作しないため、アップデートすることが求められます。
今回は、既存のVolatility 2用のPluginをVolatility 3に対応させる際のポイントを紹介します。このブログでは過去にJPCERT/CCから公開した以下のVolatility PluginをVolatility 3に対応させる場合を例に説明していきます。
JPCERTCC/impfuzzy GitHub - impfuzzy for Volatility
https://github.com/JPCERTCC/impfuzzy/tree/master/impfuzzy_for_Volatility/
なお、アップデート後のPluginは以下で公開しています。
JPCERTCC/impfuzzy GitHub - impfuzzy for Volatility3
https://github.com/JPCERTCC/impfuzzy/tree/master/impfuzzy_for_Volatility3/
Volatility Plugin移行のポイント
Volatility 3 Pluginを作成する方向けに、Plugin作成方法のドキュメントが公開されています[2]。Pluginの作成、アップデートを行う際は、まずこれらのドキュメントを確認することをお勧めします。 Volatility 2用のPluginをVolatility 3に対応させる際は、Python3で動作するようにするだけではなく、以下のVolatility 2と3の違いに注意する必要があります。
- Volatility Plugin実行の流れ
- クラスの継承
- オプション
- SymbolとMemory Layer
- 結果の表示
以降では、上記ポイントについて解説します。
Volatility Plugin実行の流れ
Volatilityでは、Pluginが呼び出されるとPlugin内の特定の関数が実行される仕様になっています。図1はVolatility 2と3のPlugin呼び出し時に実行される関数を比較しています。
Volatility 2では、最初に呼び出される関数はcalculate()であり、その後、render_text()が実行されます。render_text()はcalculate()から呼び出されるわけではなく、calculate()の戻り値を受け取る形で実行されるというわかりづらい仕様になっていました。
一方Volatility 3では最初にrun()が実行されます。その後は、結果表示のための関数TreeGrid()を呼び出すというわかりやすい仕様に変更されています。
クラスの継承
Volatility Pluginは、既存の準備されたクラスを継承して作成することが基本となります。Volatility 2では、継承するクラスは決まっておらず、既存のPluginの中から使用したいデータをスキャンすることができるものを継承することになります。
それに対してVolatility 3では、継承するクラスは統一されておりinterfaces.plugins.PluginInterfaceを継承すれば、Pluginを作成するには十分なようになっています。
そして、既存のPluginの中から使用したいデータを取り出す場合は、図3のように新たに設けられたrequirementsで指定し、importすることになります。
オプション
Volatility Plugin実行時に指定可能なオプションは、Volatility 2では、Pythonモジュールであるargparseを使ってconfigにオプションを追加するようになっています。Volatility 3は、先ほどのクラスの継承で説明したrequirementsで指定することになります。
Volatility 3では、これまで使用できた短縮オプション(short_option)が使用できなくなりました。さらにVolatility 2では特定のクラスを継承することでオプションも継承していましたが、前述の通りクラスの継承指定が変わったことで、オプションはすべて指定しなくてはいけなくなりました。例えば、多くのPluginで使用できる調査対象プロセスを指定するオプションpidは、継承されないので、記述する必要があります。
SymbolとMemory Layer
Volatility 2は、実行時に分析対象のメモリイメージのOS情報をprofileオプションで指定する必要がありました。Volatility 3では、profileオプションの指定は必要なくなりましたが、プラグイン上で、どのOSで使用できるものかあらかじめ指定することになっています。これもrequirementsで指定します。(Windows OSの場合は、”nt_symbols”を指定します。)
また、Volatility 3では分析対象のメモリイメージを”Memory Layer”という単位で管理します。そのため、Memory Layerをrequirementsで定義する必要があります。通常は、このMemory Layerを1つ準備すればよいのですが、複数のメモリイメージを分析する必要がある場合は、複数のMemory Layerを定義します。Memory Layerにはメモリアーキテクチャも指定可能ですが、省略することもできます。
結果の表示
Volatility Pluginは、結果を表示するための関数が準備されています。Volatility 2は、table_header()およびtable_row()で表示しますが、Volatility 3ではTreeGrid()を使用します。
TreeGrid()では、テーブルサイズを指定する必要はなくなったのですが、Typeを指定する必要があります。Hex表示やバイナリ表示のためにformat_hintsモジュールが準備されています。TreeGrid()による出力結果は、コマンドラインオプション”renderer”を使うことでCSVやJSONなど異なるフォーマットで出力することが可能です。
おわりに
現時点では、Volatility 3はベータ版であるため、今回紹介した仕様が変更される可能性があります。また、現状ではVolatility 2で使用できたデフォルトPluginの中で使用できないものがあります。そのため、実際に移行する場合は注意が必要です。また、今回紹介したポイント以外にも、Volatility 3には多くの変更が行われているため、アップデートする際は多くの変更が必要になる可能性があります。
Volatility 3は、Volatility 2と比べるとPluginを作成することを意識した仕様に変更されています。もし、Volatility Pluginを作成したことがない場合は、試してみることをお勧めします。
インシデントレスポンスグループ 朝長 秀誠
参考情報
[1] Volatility Labs: Announcing the Volatility 3 Public Beta!
https://volatility-labs.blogspot.com/2019/10/announcing-volatility-3-public-beta.html
[2]Volatility Docs: How to Write a Simple Plugin
https://volatility3.readthedocs.io/en/latest/simple-plugin.html