Example #1
0
def get_coverage_binary(benchmark: str) -> str:
    """Get the coverage binary for benchmark."""
    coverage_binaries_dir = build_utils.get_coverage_binaries_dir()
    fuzz_target = benchmark_utils.get_fuzz_target(benchmark)
    return fuzzer_utils.get_fuzz_target_binary(coverage_binaries_dir /
                                               benchmark,
                                               fuzz_target_name=fuzz_target)
Example #2
0
def render_startup_script_template(instance_name: str, fuzzer: str,
                                   benchmark: str, trial_id: int,
                                   experiment_config: dict):
    """Render the startup script using the template and the parameters
    provided and return the result."""
    docker_image_url = benchmark_utils.get_runner_image_url(
        benchmark, fuzzer, experiment_config['docker_registry'])
    fuzz_target = benchmark_utils.get_fuzz_target(benchmark)

    local_experiment = experiment_utils.is_local_experiment()
    template = JINJA_ENV.get_template('runner-startup-script-template.sh')
    kwargs = {
        'instance_name': instance_name,
        'benchmark': benchmark,
        'experiment': experiment_config['experiment'],
        'fuzzer': fuzzer,
        'trial_id': trial_id,
        'max_total_time': experiment_config['max_total_time'],
        'experiment_filestore': experiment_config['experiment_filestore'],
        'report_filestore': experiment_config['report_filestore'],
        'fuzz_target': fuzz_target,
        'docker_image_url': docker_image_url,
        'docker_registry': experiment_config['docker_registry'],
        'local_experiment': local_experiment
    }

    if not local_experiment:
        kwargs['cloud_compute_zone'] = experiment_config['cloud_compute_zone']
        kwargs['cloud_project'] = experiment_config['cloud_project']

    return template.render(**kwargs)
Example #3
0
def add_oss_fuzz_corpus(benchmark, oss_fuzz_corpora_dir):
    """Add latest public corpus from OSS-Fuzz as the seed corpus for various
    fuzz targets."""
    project = benchmark_utils.get_project(benchmark)
    fuzz_target = benchmark_utils.get_fuzz_target(benchmark)

    if not fuzz_target.startswith(project):
        full_fuzz_target = '%s_%s' % (project, fuzz_target)
    else:
        full_fuzz_target = fuzz_target

    src_corpus_url = _OSS_FUZZ_CORPUS_BACKUP_URL_FORMAT.format(
        project=project, fuzz_target=full_fuzz_target)
    dest_corpus_url = os.path.join(oss_fuzz_corpora_dir, f'{benchmark}.zip')
    gsutil.cp(src_corpus_url, dest_corpus_url, parallel=True, expect_zero=False)
Example #4
0
def render_startup_script_template(instance_name: str, benchmark: str,
                                   fuzzer: str, trial_id: int,
                                   experiment_config: dict):
    """Render the startup script using the template and the parameters
    provided and return the result."""
    fuzzer_config = fuzzer_config_utils.get_by_variant_name(fuzzer)
    underlying_fuzzer_name = fuzzer_config['fuzzer']
    docker_image_url = benchmark_utils.get_runner_image_url(
        benchmark, underlying_fuzzer_name, experiment_config['cloud_project'])
    fuzz_target = benchmark_utils.get_fuzz_target(benchmark)

    # Convert additional environment variables from configuration to arguments
    # that will be passed to docker.
    additional_env = ''
    if 'env' in fuzzer_config:
        additional_env = ' '.join([
            '-e {k}={v}'.format(k=k, v=shlex.quote(v))
            for k, v in fuzzer_config['env'].items()
        ])

    local_experiment = experiment_utils.is_local_experiment()
    template = JINJA_ENV.get_template('runner-startup-script-template.sh')
    kwargs = {
        'instance_name': instance_name,
        'benchmark': benchmark,
        'experiment': experiment_config['experiment'],
        'fuzzer': underlying_fuzzer_name,
        'fuzzer_variant_name': fuzzer,
        'trial_id': trial_id,
        'max_total_time': experiment_config['max_total_time'],
        'cloud_project': experiment_config['cloud_project'],
        'cloud_compute_zone': experiment_config['cloud_compute_zone'],
        'cloud_experiment_bucket':
        experiment_config['cloud_experiment_bucket'],
        'fuzz_target': fuzz_target,
        'docker_image_url': docker_image_url,
        'additional_env': additional_env,
        'local_experiment': local_experiment
    }
    if local_experiment:
        kwargs['host_gcloud_config'] = os.environ['HOST_GCLOUD_CONFIG']

    return template.render(**kwargs)
Example #5
0
def create_trial_instance(benchmark: str, fuzzer: str, trial_id: int,
                          experiment_config: dict) -> bool:
    """Create or start a trial instance for a specific
    trial_id,fuzzer,benchmark."""
    instance_name = experiment_utils.get_trial_instance_name(
        experiment_config['experiment'], trial_id)
    fuzzer_config = fuzzer_config_utils.get_by_variant_name(fuzzer)
    underlying_fuzzer_name = fuzzer_config['fuzzer']
    docker_image_url = benchmark_utils.get_runner_image_url(
        benchmark, underlying_fuzzer_name, experiment_config['cloud_project'])
    fuzz_target = benchmark_utils.get_fuzz_target(benchmark)

    # Convert additional environment variables from configuration to arguments
    # that will be passed to docker.
    additional_env = ''
    if 'env' in fuzzer_config:
        additional_env = ' '.join([
            '-e {k}={v}'.format(k=k, v=shlex.quote(v))
            for k, v in fuzzer_config['env'].items()
        ])

    startup_script = '''#!/bin/bash
echo 0 > /proc/sys/kernel/yama/ptrace_scope
echo core >/proc/sys/kernel/core_pattern

while ! docker pull {docker_image_url}
do
  echo 'Error pulling image, retrying...'
done

docker run --privileged --cpuset-cpus=0 --rm \
-e INSTANCE_NAME={instance_name} -e FUZZER={fuzzer} -e BENCHMARK={benchmark} \
-e FUZZER_VARIANT_NAME={fuzzer_variant_name} -e EXPERIMENT={experiment} \
-e TRIAL_ID={trial_id} -e MAX_TOTAL_TIME={max_total_time} \
-e CLOUD_PROJECT={cloud_project} -e CLOUD_COMPUTE_ZONE={cloud_compute_zone} \
-e CLOUD_EXPERIMENT_BUCKET={cloud_experiment_bucket} \
-e FUZZ_TARGET={fuzz_target} {additional_env} \
--cap-add SYS_NICE --cap-add SYS_PTRACE --name=runner-container \
{docker_image_url} 2>&1 | tee /tmp/runner-log.txt'''.format(
        instance_name=instance_name,
        benchmark=benchmark,
        experiment=experiment_config['experiment'],
        fuzzer=underlying_fuzzer_name,
        fuzzer_variant_name=fuzzer,
        trial_id=trial_id,
        max_total_time=experiment_config['max_total_time'],
        cloud_project=experiment_config['cloud_project'],
        cloud_compute_zone=experiment_config['cloud_compute_zone'],
        cloud_experiment_bucket=experiment_config['cloud_experiment_bucket'],
        fuzz_target=fuzz_target,
        docker_image_url=docker_image_url,
        additional_env=additional_env)

    startup_script_path = '/tmp/%s-start-docker.sh' % instance_name
    with open(startup_script_path, 'w') as file_handle:
        file_handle.write(startup_script)

    return gcloud.create_instance(instance_name,
                                  gcloud.InstanceType.RUNNER,
                                  experiment_config,
                                  startup_script=startup_script_path,
                                  write_to_stdout=False)
Example #6
0
def test_get_fuzz_target(benchmark, expected_fuzz_target, oss_fuzz_benchmark):
    """Test that we can get the docker name of a benchmark."""
    assert benchmark_utils.get_fuzz_target(benchmark) == expected_fuzz_target
Example #7
0
def test_get_fuzz_target(oss_fuzz_benchmark):
    """Test that we can get the docker name of a benchmark."""
    assert (benchmark_utils.get_fuzz_target(conftest.OSS_FUZZ_BENCHMARK_NAME)
            == conftest.OSS_FUZZ_BENCHMARK_CONFIG['fuzz_target'])