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)
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)
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)
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)
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)
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
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'])