Cuckoo Sandboxの実行でYaraのエラーが出る


Cuckoo Sandboxを実行したらYaraに関して怒られたので、その原因の調査と解決策です。
原因がバージョンにあると考え、Yaraの違うバージョンを入れようとしたら更に詰まったので、忘れないようにメモ。
エラーを一つ解決すると新しいエラーが登場してくれるおかげで退屈せずにすみました。
本来自分用であるということと、同じエラーが出た人の少しでも役に立てばと考えて、試行錯誤した過程をそのまま書いてますが、一応最後にまとめてあります。

#参考
- http://community.cuckoosandbox.org/posts/show/yara-error-error_on_warning/
- http://rayschippers.wordpress.com/2014/01/11/install-yara-on-ubuntu-13-10-saucy-salamander/
- http://yara.readthedocs.org/en/latest/gettingstarted.html
- https://github.com/styx/YARA/tree/master/yara-python


#環境
- OS
 - Ubuntu 14.04
- Cuckoo Sandbox
 - 1.2-dev
- Yara
 - 1.7 => 3.1

#エラー内容と解決策
##Yaraのエラー
`cuckoo.py`を実行したら怒られました。
以下がその内容です。

```shell-session
$ python cuckoo/cuckoo.py

  _____________________________________/\/\_______________________________
  ___/\/\/\/\__/\/\__/\/\____/\/\/\/\__/\/\__/\/\____/\/\/\______/\/\/\___
  _/\/\________/\/\__/\/\__/\/\________/\/\/\/\____/\/\__/\/\__/\/\__/\/\_
  _/\/\________/\/\__/\/\__/\/\________/\/\/\/\____/\/\__/\/\__/\/\__/\/\_
  ___/\/\/\/\____/\/\/\/\____/\/\/\/\__/\/\__/\/\____/\/\/\______/\/\/\___
  ________________________________________________________________________

 Cuckoo Sandbox 1.2-dev
 www.cuckoosandbox.org
 Copyright (c) 2010-2014

 Checking for updates...
 Good! You have the latest version available.

2014-10-11 17:13:09,487 [lib.cuckoo.core.scheduler] INFO: Using "kvm" machine manager
2014-10-11 17:13:09,919 [lib.cuckoo.core.scheduler] INFO: Loaded 1 machine/s
2014-10-11 17:13:09,925 [lib.cuckoo.core.scheduler] INFO: Waiting for analysis tasks.
2014-10-11 17:13:30,206 [lib.cuckoo.core.scheduler] INFO: Starting analysis of FILE "/home/cuckoo/ZeuS_binary_9498ff82a64ff445398c8426ed63ea5b.exe" (task=2)
2014-10-11 17:13:30,218 [lib.cuckoo.core.scheduler] INFO: File already exists at "/home/cuckoo/cuckoo/storage/binaries/8b2e701e91101955c73865589a4c72999aeabc11043f712e05fdb1c17c4ab19a"
2014-10-11 17:13:30,331 [lib.cuckoo.core.scheduler] INFO: Task #2: acquired machine Windows7_default_1412852245584_47636 (label=Windows7_default_1412852245584_47636)
2014-10-11 17:13:30,339 [modules.auxiliary.sniffer] INFO: Started sniffer with PID 14069 (interface=hostonly0, host=192.168.124.2, dump path=/home/cuckoo/cuckoo/storage/analyses/2/dump.pcap)
2014-10-11 17:13:39,623 [lib.cuckoo.core.guest] INFO: Starting analysis on guest (id=Windows7_default_1412852245584_47636, ip=192.168.124.2)
2014-10-11 17:14:06,404 [lib.cuckoo.core.guest] INFO: Windows7_default_1412852245584_47636: analysis completed successfully
2014-10-11 17:14:08,420 [modules.processing.behavior] WARNING: Analysis results folder does not contain any file.
2014-10-11 17:14:08,748 [lib.cuckoo.common.objects] WARNING: Unable to import pydeep (install with `pip install pydeep`)
2014-10-11 17:14:08,749 [lib.cuckoo.common.objects] WARNING: Unable to match Yara signatures: 'error_on_warning' is an invalid keyword argument for this function
2014-10-11 17:14:09,797 [lib.cuckoo.core.scheduler] INFO: Task #2: reports generation completed (path=/home/cuckoo/cuckoo/storage/analyses/2)
2014-10-11 17:14:09,894 [lib.cuckoo.core.scheduler] INFO: Task #2: analysis procedure completed
```

WARNING二つ出てますがとりあえず置いておいて、先にYaraのWARNINGを解決したいと思います。

```console
2014-10-11 17:14:08,749 [lib.cuckoo.common.objects] WARNING: Unable to match Yara signatures: 'error_on_warning' is an invalid keyword argument for this function
```

ここです。
調べたところ、Yaraのバージョンが違うのではないかという話が出ています。
CuckooではYaraのv1.7以上を使うようにと書いてあったのでv1.7を使っていたのですが、最新版を試してみようと思います。

##Yaraの最新版を入れる
現在は、v3.1.0が最新のようです。
https://github.com/plusvic/yara/releases/tag/v3.1.0 
Yaraのドキュメントに従いたいと思います。
http://yara.readthedocs.org/en/latest/gettingstarted.html


```shell-session
$ wget https://github.com/plusvic/yara/archive/v3.1.0.tar.gz
$ tar zxvf v3.1.0.tar.gz
$ cd yara-3.1.0/
$ ./bootstrap.sh
== bootstraping yara
libtoolize...
Did not find a supported libtoolize
```

何か怒られました。
`libtoolize`がないっぽいので、`libtool`パッケージを入れてみます。

###libtoolを入れる

```shell-session
$ sudo apt-get install libtool
./bootstrap.sh
== bootstraping yara
libtoolize...
libtoolize: putting auxiliary files in `.'.
libtoolize: linking file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: linking file `m4/libtool.m4'
libtoolize: linking file `m4/ltoptions.m4'
libtoolize: linking file `m4/ltsugar.m4'
libtoolize: linking file `m4/ltversion.m4'
libtoolize: linking file `m4/lt~obsolete.m4'
aclocal...
Did not find a supported aclocal
```

さっきより進んだ気がしますが、今度は`aclocal`がないと言われます。
`aclocal`を入れるためには`automake`パッケージを入れれば良いようです（というか入ってなかったのか）。

###automakeを入れる

```shell-session
$ sudo apt-get install automake
$ ./bootstrap.sh
== bootstraping yara
libtoolize...
libtoolize: putting auxiliary files in `.'.
libtoolize: linking file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: linking file `m4/libtool.m4'
libtoolize: linking file `m4/ltoptions.m4'
libtoolize: linking file `m4/ltsugar.m4'
libtoolize: linking file `m4/ltversion.m4'
libtoolize: linking file `m4/lt~obsolete.m4'
aclocal...
autoheader...
automake...
autoconf...
```
お、いけたっぽいです。
ということでコンパイルしていきたいと思います。

###コンパイルする
まず、必要なライブラリを入れます。
cuckooの場合、JSONをparseするためにJanssonを使っているそうなので予め入れる必要がありますが、`libjansson-dev`に入っているようなのでインストールします。
さらにmagicには`libmagic-dev`が必要みたいなのでそれもインストールしておきます。
不必要かもしれませんが、あとでハマるの嫌なので（もう疲れたのです）。

```console
$ sudo apt-get install libjansson-dev libmagic-dev
```

インストールが終わったら、ドキュメントを見ます。
cuckooで使う場合は`--enable-cuckoo`をつけないといけないみたいです。
なのでオプションを付けて`make`します。

```console
$ ./configure --enable-cuckoo --enable-magic
（中略）
checking for pthread_create in -lpthread... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating libyara/Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands
$ make
$ sudo make install
```

特にエラーが出ていなければOKです。

###yara-pythonのインストール
Cuckooではyaraを入れたあとyara-pythonも必要なので、入れておきます。
先ほどyaraを落としてきた時のディレクトリ内に入っているのでビルドしてインストールするだけ！
簡単！（だと思ってました）

```shell-session
$ cd yara-python/
$ python setup.py build
$ sudo python setup.py install
```

これで準備が整ったので再度cuckooを実行してみます。
`cuckoo.py`を実行したあと、適当なマルウェアを`submit.py`によりsubmitしています。

```console
$ python ~/cuckoo/cuckoo.py

            _       _                   _             _              _            _
          /\ \     /\_\               /\ \           /\_\           /\ \         /\ \
         /  \ \   / / /         _    /  \ \         / / /  _       /  \ \       /  \ \
        / /\ \ \  \ \ \__      /\_\ / /\ \ \       / / /  /\_\    / /\ \ \     / /\ \ \
       / / /\ \ \  \ \___\    / / // / /\ \ \     / / /__/ / /   / / /\ \ \   / / /\ \ \
      / / /  \ \_\  \__  /   / / // / /  \ \_\   / /\_____/ /   / / /  \ \_\ / / /  \ \_\
     / / /    \/_/  / / /   / / // / /    \/_/  / /\_______/   / / /   / / // / /   / / /
    / / /          / / /   / / // / /          / / /\ \ \     / / /   / / // / /   / / /
   / / /________  / / /___/ / // / /________  / / /  \ \ \   / / /___/ / // / /___/ / /
  / / /_________\/ / /____\/ // / /_________\/ / /    \ \ \ / / /____\/ // / /____\/ /
  \/____________/\/_________/ \/____________/\/_/      \_\_\\/_________/ \/_________/

 Cuckoo Sandbox 1.2-dev
 www.cuckoosandbox.org
 Copyright (c) 2010-2014

 Checking for updates...
 Good! You have the latest version available.

2014-10-11 21:54:13,566 [lib.cuckoo.core.scheduler] INFO: Using "kvm" machine manager
2014-10-11 21:54:14,611 [lib.cuckoo.core.scheduler] INFO: Loaded 1 machine/s
2014-10-11 21:54:14,618 [lib.cuckoo.core.scheduler] INFO: Waiting for analysis tasks.
2014-10-11 21:54:22,819 [lib.cuckoo.core.scheduler] INFO: Starting analysis of FILE "/home/cuckoo/ZeuS_binary_9498ff82a64ff445398c8426ed63ea5b.exe" (task=7)
2014-10-11 21:54:22,830 [lib.cuckoo.core.scheduler] INFO: File already exists at "/home/cuckoo/cuckoo/storage/binaries/8b2e701e91101955c73865589a4c72999aeabc11043f712e05fdb1c17c4ab19a"
2014-10-11 21:54:22,959 [lib.cuckoo.core.scheduler] INFO: Task #7: acquired machine Windows7_default_1412852245584_47636 (label=Windows7_default_1412852245584_47636)
2014-10-11 21:54:22,967 [modules.auxiliary.sniffer] INFO: Started sniffer with PID 13437 (interface=hostonly0, host=192.168.124.2, dump path=/home/cuckoo/cuckoo/storage/analyses/7/dump.pcap)
2014-10-11 21:54:39,130 [lib.cuckoo.core.guest] INFO: Starting analysis on guest (id=Windows7_default_1412852245584_47636, ip=192.168.124.2)
2014-10-11 21:55:11,988 [lib.cuckoo.core.guest] INFO: Windows7_default_1412852245584_47636: analysis completed successfully
2014-10-11 21:55:13,435 [modules.processing.behavior] WARNING: Analysis results folder does not contain any file.
2014-10-11 21:55:13,843 [lib.cuckoo.common.objects] WARNING: Unable to import yara (please compile from sources)
2014-10-11 21:55:14,883 [lib.cuckoo.core.scheduler] INFO: Task #7: reports generation completed (path=/home/cuckoo/cuckoo/storage/analyses/7)
2014-10-11 21:55:15,028 [lib.cuckoo.core.scheduler] INFO: Task #7: analysis procedure completed
```

再びエラーが出ています。
悲しい...

```console
WARNING: Unable to import yara (please compile from sources)
```

`yara`をソースからコンパイルしろって？さっきやったよ！！
どうやらうまくimportできていないようです。

```console
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yara
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: libyara.so.3: cannot open shared object file: No such file or directory
```

確かにimportできてない。
https://github.com/styx/YARA/tree/master/yara-python
を見ると、エラーが出たら`ldconfig`しろと書いてある。

http://www.atmarkit.co.jp/flinux/rensai/linuxtips/300sharelib.html によれば
>/usr/local/libディレクトリが登録されていないので、ldconfigコマンドを実行する前に/etc/ld.so.confファイルを編集しなければならない。

ということらしい。
ということで

```shell-session
$ sudo su
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
```

してみる。
`ld.so.conf`に既に`/usr/local/lib`が書いてあれば恐らく`ldconfig`するだけで良い気がします。
ということで再挑戦。

```console
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yara
>>>
```

今度はエラーが出なくなりました。
この状態で実行するとエラーが出なくなるはずです。

```console
$ python ~/cuckoo/cuckoo.py
（中略）
2014-10-11 23:44:29,156 [lib.cuckoo.core.plugins] DEBUG: Running non-evented signatures
2014-10-11 23:44:29,156 [lib.cuckoo.core.plugins] DEBUG: Running signature "creates_exe"
2014-10-11 23:44:29,157 [lib.cuckoo.core.plugins] DEBUG: Running signature "generic_metrics"
2014-10-11 23:44:29,178 [lib.cuckoo.core.plugins] DEBUG: Executed reporting module "JsonDump"
2014-10-11 23:44:29,462 [lib.cuckoo.core.plugins] DEBUG: Executed reporting module "ReportHTML"
2014-10-11 23:44:29,462 [lib.cuckoo.core.scheduler] INFO: Task #18: reports generation completed (path=/home/cuckoo/cuckoo/storage/analyses/18)
2014-10-11 23:44:29,601 [lib.cuckoo.core.scheduler] INFO: Task #18: analysis procedure completed
```

これで良かったです。

#まとめ
試行錯誤してきた過程をそのまま載せましたが、まとめると
1. Yaraのバージョンが違っているので新しいバージョンを入れる
2. Yaraのコンパイルの際、必要なライブラリが足りていないのでそれらを入れる
3. ld.so.confに/usr/local/libが入っていない場合は加える
という感じです。
以下がコマンド一覧です。

```shell-session
#コンパイル時に必要なライブラリなど
$ sudo apt-get install libtool automake
#Cuckooなどで使う場合に必要なライブラリなど
$ sudo apt-get install libjansson-dev libmagic-dev
#yaraの最新版を入れてコンパイルする
$ wget https://github.com/plusvic/yara/archive/v3.1.0.tar.gz
$ tar zxvf v3.1.0.tar.gz
$ cd yara-3.1.0/
$ ./bootstrap.sh
$ ./configure --enable-cuckoo --enable-magic
$ make
$ sudo make install
#yara-pythonをコンパイルする
$ cd yara-python/
$ python setup.py build
$ sudo python setup.py install
#ldconfigする
$ sudo su
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
```

これらの操作によって私の環境ではエラーが発生しなくなりました。
他の方の環境では分かりませんので自己責任でお願いします。