“syzbot”と”syzkaller”について (Part 2) 「Azure上でsyzkallerは動くのか」

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面 和毅です。

今回はsyzbotを見る前に、検証環境としても便利ですので「Azure上でsyzkallerは動くのか」を検証してみたいと思います。



syzkaller

syzkallerに関しては、前回(“syzbot”と”syzkaller”について (Part 1))に説明したので、細かな説明は省きます。

実際にはsyzkallerは常に廻し続けてなければならないため、自宅のPCなどでやるよりは、やはりクラウド上に置いて実行したくなります。そこで、今回はAzure上でsyzkallerは動くのかを検証しました。

syzkallerが動くかどうかは、結局「Azure上でKVMが使えるかどうか」という事になります。そこで、大まかに下記のような手順で検証を行いました。

  1. KVMが使えるかどうかを確認する(インストール含む)
  2. syzkallerが動くかどうかを確認する(インストール含む)

検証

  1. KVMが使えるかどうかを確認する(インストール含む)
  2. Azure上でKVMを使って仮想マシンを動かすことが出来るかを確認します。ここが一番問題になるところだと思います。Azure上で動作しているマシン自体もVMゲストなので(Hyper-Vで提供されています)、VM on VMのいわゆる「Nested VM」が出来るかどうかという事になります。

    まず、Web上の情報ですと、Azure VM で入れ子になった仮想化を有効にする方法等、方法はあるようです。実際にKVMが使えるかを確認してみます。

    検証環境

    • VM: Dv3のVM(HDDで標準で作成)
    • OS: Ubuntu 18.04
    • ポート: リモートから作業するためsshでアクセスできるように設定
    1. まず、VMにログインして、Nested VMが出来るかどうかを確認してみます。/proc/cpuinfoの情報を見て、vmx(Intel)/svm(AMD)が見える化を確認します。
      
      root@Ubuntu1804:~# egrep '(vmx|svm)' /proc/cpuinfo
      flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti tpr_shadow vnmi ept vpid fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt
      flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti tpr_shadow vnmi ept vpid fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt
      

      で、「vmx」が見えますので、このVM上ではKVMを使ってVMが作れそうです。

    2. KVMでVMが作れそうなので、必要なパッケージをインストールします。
      
      root@Ubuntu1804:~# apt install qemu-kvm libvirt-bin virtinst virt-manager linux-kvm
      
    3. virt-installコマンドで仮想マシンを作ってみます
      
      root@Ubuntu1804:~# virt-install --connect qemu:///system -n vm10 -r 512 --vcpus=2 --disk path=/var/lib/libvirt/images/vm10.img,size=12 -c /dev/cdrom --vnc --noautoconsole --os-type linux --os-variant debiansqueeze --accelerate --hvm
      

  3. syzkallerが動くかどうかを確認する(インストール含む)
  4. 基本的には“How to setup syzkaller”にある「Setup: Ubuntu host, QEMU vm, x86-64 kernel」を参考にすれば殆ど問題なく出来ます。前回と同じ手順になります。

    1. gitでLinux Kernelをダウンロードする。
    2. .configでKASAN等のオプションを有効にする
    3. 作成したKernelイメージでQEMUを立ち上げる(立ち上げられるかをテストする)
    4. syzkallerのインストールのためにgo言語をインストール。
      
      root@Ubuntu1804:~# apt install golang
      
    5. Go言語でsyzkallerをGetしてインストールする。
      Go言語でsyzkallerをGetしてインストールする際に、.bashrcファイルでGOROOT・GOPATH・PATHをきちんと環境変数として登録しておかないと、エラーが出てGetに失敗する点です。今回は、/root/以下にgopathディレクトリを作成しましたが

      
      export GOROOT=/usr/lib/go
      export GOPATH=/root/gopath
      export PATH=$GOROOT/bin:$PATH
      

      と、Ubuntu標準のgolangを使う場合には、GOROOTを/usr/lib/goに設定しておかないとエラーになってGet以降が進まなくなりました。

    6. syz-managerでsyzkallerを起動する。
      syz-managerを動作させる時には、gopath/src/github.com/google/syzkaller以下にmy.cfgファイルを作成します。今回は

      
      root@Ubuntu1804:~/gopath/src/github.com/google/syzkaller# cat my.cfg
      {
      "target": "linux/amd64",
      "http": "127.0.0.1:56741",
      "workdir": "/root/gopath/src/github.com/google/syzkaller/workdir",
      "kernel_obj": "/root/linux",
      "image": "/root/stretch.img",
      "sshkey": "/root/stretch.id_rsa",
      "syzkaller": "/root/gopath/src/github.com/google/syzkaller",
      "procs": 8,
      "type": "qemu",
      "vm": {
      "count": 4,
      "kernel": "/root/linux/arch/x86/boot/bzImage",
      "cpu": 2,
      "mem": 2048
      }
      }
      

      のようにしてあります。

      
      root@Ubuntu1804:~/gopath/src/github.com/google/syzkaller# ./bin/syz-manager -config=my.cfg
      2019/01/24 03:33:46 loading corpus...
      2019/01/24 03:33:46 serving http on http://127.0.0.1:56741
      2019/01/24 03:33:46 serving rpc on tcp://[::]:41439
      2019/01/24 03:33:46 booting test machines...
      2019/01/24 03:33:46 wait for the connection from test machine...
      2019/01/24 03:35:53 machine check:
      2019/01/24 03:35:53 syscalls                : 1339/2558
      2019/01/24 03:35:53 code coverage           : enabled
      2019/01/24 03:35:53 comparison tracing      : CONFIG_KCOV_ENABLE_COMPARISONS is not enabled
      2019/01/24 03:35:53 extra coverage          : extra coverage is not supported by the kernel
      2019/01/24 03:35:53 setuid sandbox          : enabled
      2019/01/24 03:35:53 namespace sandbox       : /proc/self/ns/user does not exist
      2019/01/24 03:35:53 Android sandbox         : enabled
      2019/01/24 03:35:53 fault injection         : CONFIG_FAULT_INJECTION is not enabled
      2019/01/24 03:35:53 leak checking           : CONFIG_DEBUG_KMEMLEAK is not enabled
      2019/01/24 03:35:53 net packet injection    : /dev/net/tun does not exist
      2019/01/24 03:35:53 net device setup        : enabled
      2019/01/24 03:35:53 corpus                  : 3135 (0 deleted)
      2019/01/24 03:35:56 VMs 4, executed 13, cover 0, crashes 0, repro 0
      2019/01/24 03:36:06 VMs 4, executed 32, cover 0, crashes 0, repro 0
      2019/01/24 03:36:16 VMs 4, executed 215, cover 8133, crashes 0, repro 0
      2019/01/24 03:36:26 VMs 4, executed 757, cover 15466, crashes 0, repro 0
      2019/01/24 03:36:36 VMs 4, executed 1354, cover 20155, crashes 0, repro 0
      
    7. w3m等でsyzkallerの状態を確認する。
      Azure上ですので、w3m(CUIのWebブラウザ)で状態を確認します(下図)。




まとめ

という事で、無事Azure上でsyzkallerをインストール/動かすことが出来ました。これを用いてsyzbotの方も動作させることができると思います。

タイトルとURLをコピーしました