Setting up bots

This page walks you through the process of setting up bots on each of the supported platforms: Linux, Windows and macOS.


Platforms

Linux

Linux is the preferred platform for fuzzing because of its comprehensive support for all sanitizer and fuzzing engine types.

It is recommended to use each sanitizer its own build and job definition (except LeakSanitizer), as there are performance and bug finding efficiency issues with combining them.

By default, the ClusterFuzz configuration file creates 1 regular Linux bot and 2 preemptible Linux bots on Google Compute Engine. You can configure them by following the instructions provided here and here.

We recommend that you use preemptibles for most of your bots because they are much cheaper and perform almost as well. You still need some regular bots (non-preemptibles) to execute other tasks, such as the tasks that run after a crash is discovered (minimization, regression, etc).

Windows

Windows is a supported platform for fuzzing. The only sanitizer supported on Windows is AddressSanitizer. The only fuzzing engine supported on Windows is libFuzzer.

By default, ClusterFuzz configuration files do not enable any Windows bots. You can enable them easily by following the instructions provided here and here.

You also need to set a password for the administrator account on the bots.

macOS

Mac is a supported platform for fuzzing. The sanitizers supported on Mac are AddressSanitizer, LeakSanitizer, UndefinedBehaviorSanitizer and ThreadSanitizer. The only fuzzing engine supported on Mac is libFuzzer.

Mac is not a supported platform on Google Compute Engine, so you would need to run it on physical hardware or some sort of virtualization running on top of it.

Below are the steps to set up and run ClusterFuzz:

  • Create a service account key following the instructions provided here.
    • Choose “Compute Engine” service account type.
    • Choose “JSON” key type.
  • Securely transfer the downloaded key file to the macOS computer.
  • Run the provided startup script.
export CLOUD_PROJECT_ID=<your project id>
export CONFIG_DIR=/path/to/myconfig
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
export INSTALL_DIRECTORY=/path/where/to/install/clusterfuzz-and-dependencies/to
$CONFIG_DIR/bot/setup/mac.bash

Configuration

Google Compute Engine Cluster

You can configure a cluster of bots on Google Compute Engine by modifying the configuration file $CONFIG_DIR/gce/clusters.yaml. The clusters definition is in the <your project id>/clusters attribute of this yaml file. Below are example definitions for preemptible and regular Linux bots:

# Regular bots run all task types (e.g fuzzing, minimize, etc).
clusterfuzz-linux:
  gce_zone: gce-zone
  instance_count: 1
  instance_template: clusterfuzz-linux
  distribute: False

# Pre-emptible bots must have '-pre-' in name. They only run fuzzing tasks.
clusterfuzz-linux-pre:
  gce_zone: gce-zone
  instance_count: 2
  instance_template: clusterfuzz-linux-pre
  distribute: False

You can configure the bots by first uncommenting the cluster definition, and then changing the values in the gce_zone (e.g. us-central1-a) and instance_count attributes. You can also create your own instance template and then define a new cluster section here.

Note:

  • Make sure to deploy new changes. Otherwise, they will not be reflected in production.

Google Compute Engine Instance Template

You can read more about instance templates here. Instance templates define the properties of a bot (e.g. source image, disk space, network config). They are defined after the clusters configuration section in $CONFIG_DIR/gce/clusters.yaml. Below is an example for a regular Linux bot:

instance_templates:
  - name: clusterfuzz-linux
    description: '{"version": 1}'
    properties:
      machineType: n1-standard-1
      disks:
        - boot: true
          autoDelete: true
          initializeParams:
            sourceImage: projects/cos-cloud/global/images/family/cos-stable
            diskSizeGb: 100
            diskType: pd-standard
      metadata:
        items:
          - key: docker-image
            value: gcr.io/clusterfuzz-images/base:c44bf3f-201902112042
          - key: user-data
            value: file://linux-init.yaml
      serviceAccounts:
        - email: my-project-id-service-account-email
          scopes:
            - https://www.googleapis.com/auth/cloud-platform
            - https://www.googleapis.com/auth/prodxmon
      networkInterfaces:
        - network: global/networks/default
          accessConfigs:
            - type: ONE_TO_ONE_NAT
              name: 'External NAT'

For example, you can configure the size of the disk using diskSizeGb attribute.

Note:

  • After making a change in the instance template, you must increment the version by 1.
  • Make sure to deploy new changes. Otherwise, they will not be reflected in production.

Windows password setup

Before enabling windows bots on Google Compute Engine, you need to set the administrator password in the windows-password metadata attribute. The password must satisfy the windows password policy requirements. To set it, run:

gcloud compute project-info add-metadata \
  --metadata-from-file=windows-password=/path/to/password-file --project=$CLOUD_PROJECT_ID

This allows you to connect via remote desktop into your windows bots with the clusterfuzz username (admin) and your configured password.

Deploying new changes

Read the instructions here to deploy new changes.

Verification

Google Compute Engine bots

Once deployed, bots are automatically created via an App Engine cron task that runs every 30 minutes. For faster results, you can manually force it by visiting the Cron jobs page here and running the /manage-vms cron job.

After the cron job finishes, check this page to ensure that all instances are created for this particular instance group.

If you see a spinning circle next to the instance group, for longer than a few minutes, it can indicate that an error occurred. You can click the instance group name to see the error message (e.g. insufficient resource quota).

Note: The default quota for compute resources such as “CPUs”, “In-use IP addresses” and “Persistent Disk Standard (GB)” might be insufficient for your fuzzing cluster needs. You can check your current quota here and request more resources as needed.

Non-Google Compute Engine bots

These bots should start within a minute after the startup script finishes execution (e.g. $CONFIG_DIR/bot/setup/mac.bash for macOS).

You can verify the bots started by checking that their hostnames show up on the Bots page.