def _get_cross_pollinate_fuzzers(engine_name, current_fuzzer_name, method,
                                 tag):
    """Return a list of fuzzer objects to use for cross pollination."""
    cross_pollinate_fuzzers = []

    selected_targets_and_jobs = _select_targets_and_jobs_for_pollination(
        engine_name, current_fuzzer_name, method, tag)

    default_backup_bucket = utils.default_backup_bucket()
    for target, target_job in selected_targets_and_jobs:
        job = data_types.Job.query(data_types.Job.name == target_job.job).get()
        if not job:
            continue

        job_environment = job.get_environment()
        backup_bucket_name = job_environment.get('BACKUP_BUCKET',
                                                 default_backup_bucket)
        if not backup_bucket_name:
            continue
        corpus_engine_name = job_environment.get('CORPUS_FUZZER_NAME_OVERRIDE',
                                                 engine_name)

        cross_pollinate_fuzzers.append(
            CrossPollinateFuzzer(
                target,
                backup_bucket_name,
                corpus_engine_name,
            ))

    return cross_pollinate_fuzzers
Esempio n. 2
0
def _get_cross_pollinate_fuzzers(engine_name, current_fuzzer_name):
    """Return a list of fuzzer objects to use for cross pollination."""
    cross_pollinate_fuzzers = []

    target_jobs = list(
        fuzz_target_utils.get_fuzz_target_jobs(engine=engine_name))
    targets = fuzz_target_utils.get_fuzz_targets_for_target_jobs(target_jobs)

    targets_and_jobs = [(target, target_job)
                        for target, target_job in zip(targets, target_jobs)
                        if target_job.fuzz_target_name != current_fuzzer_name]
    selected_targets_and_jobs = random.SystemRandom().sample(
        targets_and_jobs,
        min(len(targets_and_jobs), CROSS_POLLINATE_FUZZER_COUNT))

    default_backup_bucket = utils.default_backup_bucket()
    for target, target_job in selected_targets_and_jobs:
        job = data_types.Job.query(data_types.Job.name == target_job.job).get()
        if not job:
            continue

        job_environment = job.get_environment()
        backup_bucket_name = job_environment.get("BACKUP_BUCKET",
                                                 default_backup_bucket)
        if not backup_bucket_name:
            continue
        corpus_engine_name = job_environment.get("CORPUS_FUZZER_NAME_OVERRIDE",
                                                 engine_name)

        cross_pollinate_fuzzers.append(
            CrossPollinateFuzzer(target, backup_bucket_name,
                                 corpus_engine_name))

    return cross_pollinate_fuzzers
Esempio n. 3
0
    def get(self):
        """Handle a GET request."""
        jobs = ndb_utils.get_all_from_model(data_types.Job)
        default_backup_bucket = utils.default_backup_bucket()
        for job in jobs:
            job_environment = job.get_environment()
            if utils.string_is_true(job_environment.get("EXPERIMENTAL")):
                # Don't use corpus backups from experimental jobs. Skip.
                continue

            if not utils.string_is_true(job_environment.get("CORPUS_PRUNE")):
                # There won't be any corpus backups for these jobs. Skip.
                continue

            corpus_backup_bucket_name = job_environment.get(
                "BACKUP_BUCKET", default_backup_bucket)
            if not corpus_backup_bucket_name:
                # No backup bucket found. Skip.
                continue

            corpus_fuzzer_name_override = job_environment.get(
                "CORPUS_FUZZER_NAME_OVERRIDE")

            target_jobs = list(
                fuzz_target_utils.get_fuzz_target_jobs(job=job.name))
            fuzz_targets = fuzz_target_utils.get_fuzz_targets_for_target_jobs(
                target_jobs)

            for target in fuzz_targets:
                if not target:
                    # This is expected if any fuzzer/job combinations become outdated.
                    continue

                _make_corpus_backup_public(target, corpus_fuzzer_name_override,
                                           corpus_backup_bucket_name)