aboutsummaryrefslogtreecommitdiffstats

Setup: Linux host, Android virtual device, x86-64 kernel

This document details the steps involved in setting up a syzkaller instance fuzzing an x86-64 linux kernel on an Android virtual device.

In the instructions below, the $VAR notation (e.g. $GSI, $GKI, etc.) is used to denote paths to directories that are either created when executing the instructions, or that you have to create yourself before running the instructions. Substitute the values for those variables manually.

Note: - All commands below assume root privileges. - It is recommended to have at least 64 GB of RAM and 500 GB of free disk space.

Install prerequisites

Command:

apt update
apt install sudo git wget curl repo libncurses5 vim gcc make bison bc zip rsync language-pack-en-base

Cuttlefish

It is recommended to use Cuttlefish to emulate Android devices. Build and install it from source (v1.16.0 as an example):

Command:

apt install git devscripts equivs config-package-dev debhelper-compat golang curl
git clone -b v1.16.0 https://github.com/google/android-cuttlefish
cd android-cuttlefish
tools/buildutils/build_packages.sh
dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -y -f
dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -y -f
usermod -aG kvm,cvdnetwork,render root
reboot

Generic System Images (GSI)

Checkout GSI source

The GSI source checkout is close to 90 GB, and the build can take up about 300 GB of disk space.

Command:

mkdir android13-gsi
cd android13-gsi
repo init -u https://android.googlesource.com/platform/manifest -b android13-gsi
repo sync -c

Build GSI

Refresh the build environment and select the build target:

Command:

source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug

The output should be as follows (may vary depending on the host):

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=13
TARGET_PRODUCT=aosp_cf_x86_64_phone
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=silvermont
TARGET_2ND_ARCH=x86
TARGET_2ND_ARCH_VARIANT=silvermont
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-6.8.0-65-generic-x86_64-Ubuntu-22.04.4-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=TP1A.220624.019
OUT_DIR=out
PRODUCT_SOONG_NAMESPACES=device/generic/goldfish-opengl device/generic/goldfish device/generic/goldfish-opengl hardware/google/camera hardware/google/camera/devices/EmulatedCamera device/google/cuttlefish/apex/com.google.cf.wifi_hwsim external/mesa3d vendor/google_devices/common/proprietary/confirmatioui_hal
============================================

Start building:

Command:

m

You can test your setup by launching the virtual device:

Command:

launch_cvd

Open http://localhost:8443 in your browser, you should see a virtual device. Click Connect to interact with it as you would with a real phone. Press Ctrl-C in the terminal to stop the simulator.

Kernel

Checkout Android Generic Kernel Image (GKI) source

Command:

mkdir common-android13-5.15
cd common-android13-5.15
repo init -u https://android.googlesource.com/kernel/manifest -b common-android13-5.15
repo sync -c

Build GKI

We need to build the Android Kernel with KASAN and KCOV so that syzkaller can get coverage and bug information during fuzzing.

Command:

BUILD_CONFIG=common/build.config.gki_kasan.x86_64 build/build.sh

Build vendor modules with KASAN and KCOV:

Command:

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device_kasan.x86_64 build/build.sh

syzkaller

Build syzkaller

Build syzkaller as described here. Then create a manager config like the following, replacing the environment variables $GOPATH and $GKI with their actual values.

{
    "target": "linux/amd64",
    "http": "127.0.0.1:56741",
    "workdir": "$GOPATH/src/github.com/google/syzkaller/workdir/android/out",
    "kernel_obj": "$GKI/out/android13-5.15/dist",
    "syzkaller": "$GOPATH/src/github.com/google/syzkaller",
    "cover": true,
    "type": "adb",
    "vm": {
        "devices": ["0.0.0.0:6520"],
        "battery_check": true
    }
}

Launch the virtual device

Launch the Android system with the KASAN and KCOV kernel.

Command:

cd $GSI
source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
launch_cvd -daemon -kernel_path=$GKI/out/android13-5.15/dist/bzImage -initramfs_path=$GKI/out/android13-5.15/dist/initramfs.img

Connect to the virtual device with adb:

Command:

adb connect 0.0.0.0:6520

List available virtual devices:

Command:

adb devices

Run syzkaller

Run syzkaller manager:

Command:

cd $GOPATH/src/github.com/google/syzkaller
./bin/syz-manager -config=android.cfg

Now syzkaller should be running, you can check manager status with your web browser at 127.0.0.1:56741.

If you get issues after syz-manager starts, consider running it with the -debug flag.

Here are some useful links: