Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Build a self-contained Docker image for fuzzing OSS-Fuzz projects with FuzzBench fuzzing engines. #13185

Open
wants to merge 55 commits into
base: oss_fuzz_on_demand_builds
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
d64b3f0
Add fuzzer runtime build step to OSS-Fuzz on Demand
decoNR Mar 21, 2025
946062a
Add Dockerfile to build self-contained OSS-Fuzz on Demand image
decoNR Mar 22, 2025
8ac1de9
Fix OSS-Fuzz on Demand dockerfile build_image argument
decoNR Mar 22, 2025
f9b663e
Fix OSS-Fuzz on Demand dockerfile args order
decoNR Mar 22, 2025
a19b503
Add OUT arg to ood.Dockerfile
decoNR Mar 24, 2025
dad79ba
Add log to ood.Dockerfile
decoNR Mar 24, 2025
ac367c4
Fix ood.Dockerfile syntax error
decoNR Mar 24, 2025
1a37c0e
Fix ood.Dockerfile args
decoNR Mar 24, 2025
c730796
Test volume usage in ood.Dockerfile
decoNR Mar 24, 2025
252b863
Add log to ood.Dockerfile
decoNR Mar 24, 2025
e9e0d8d
Add log to ood.Dockerfile
decoNR Mar 24, 2025
1a01990
Add compile commands to ood.Dockerfile
decoNR Mar 24, 2025
c3ed3d3
Add ENV_STRING arg to ood.Dockerfile
decoNR Mar 24, 2025
54c1d96
ood.Dockerfile ENV setup
decoNR Mar 24, 2025
3e25bf5
ood.Dockerfile ENV setup
decoNR Mar 24, 2025
22e38a4
Add log to ood.Dockerfile
decoNR Mar 24, 2025
82fc37f
ood.Dockerfile ENV setup
decoNR Mar 24, 2025
1ba27a8
Fix ood.Dockerfile OUT copy path
decoNR Mar 24, 2025
63ef41e
Remove log from ood.Dockerfile
decoNR Mar 25, 2025
f0f352c
Add ARG to ood.Dockerfile
decoNR Mar 25, 2025
96e843e
Fix ood.Dockerfile OUT copy path
decoNR Mar 25, 2025
2be6c4d
Add pwd command to ood.Dockerfile
decoNR Mar 25, 2025
956917f
Add log to ood.Dockerfile
decoNR Mar 25, 2025
7738667
Restructure ood.Dockerfile to use GCB volume for OSS-Fuzz on Demand i…
decoNR Mar 25, 2025
7696844
Add log to ood.Dockerfile
decoNR Mar 25, 2025
f445881
Test ood.Dockerfile copy from /workspace
decoNR Mar 25, 2025
1751a25
Test ood.Dockerfile copy from /workspace
decoNR Mar 26, 2025
7b46784
Successfully copy files to ood.Dockerfile
decoNR Mar 26, 2025
05b6dbf
Copy fuzzing files to ood.Dockerfile
decoNR Mar 26, 2025
3c09d54
Copy fuzzing files to ood.Dockerfile
decoNR Mar 26, 2025
ad4d5ad
Add log to ood.Dockerfile
decoNR Mar 26, 2025
c5224bd
Add log to ood.Dockerfile
decoNR Mar 26, 2025
ab24c6d
Copy fuzzing files to ood.Dockerfile
decoNR Mar 26, 2025
3647490
Implement initial code for building self-contained OSS-Fuzz on-demand…
decoNR Mar 26, 2025
fc19fc6
Add OUT env variable to ood.Dockerfile
decoNR Mar 26, 2025
1e7ce24
Add OUT env variable to ood.Dockerfile
decoNR Mar 26, 2025
d22b6d2
Add FUZZING_ENGINE env variable to ood.Dockerfile
decoNR Mar 26, 2025
a85b4a2
Set workdir to /ood
decoNR Mar 26, 2025
04cab86
Fix OUT env variable in ood.Dockerfile
decoNR Mar 26, 2025
1db9ced
Add FUZZBENCH_PATH env variable to ood.Dockerfile
decoNR Mar 26, 2025
6686399
Copy FUZZBENCH_PATH to ood.Dockerfile
decoNR Mar 26, 2025
68af21d
Organize ood.Dockerfile ARGS
decoNR Mar 26, 2025
78b6b08
Organize ood.Dockerfile ARGS
decoNR Mar 26, 2025
55be581
Adjust FUZZBENCH_PATH in ood.Dockerfile
decoNR Mar 26, 2025
726c0ea
Adjust FUZZBENCH_PATH in ood.Dockerfile
decoNR Mar 26, 2025
516c1a2
Adjust FUZZBENCH_PATH in ood.Dockerfile
decoNR Mar 26, 2025
dd984fd
Add BENCHMARK env variable to ood.Dockerfile
decoNR Mar 26, 2025
1504830
Add BENCHMARK env variable to ood.Dockerfile
decoNR Mar 26, 2025
fa21b76
Successful build steps for building OSS-Fuzz on Demand image
decoNR Mar 26, 2025
f25f31a
Refactor fuzzbench.py
decoNR Mar 26, 2025
6560d57
Remove unnecessary build steps
decoNR Mar 27, 2025
6d7b1e9
Fix copyright year
decoNR Mar 28, 2025
c300c38
Add missing function docstrings
decoNR Mar 28, 2025
286bfc9
Remove log from ood.Dockerfile
decoNR Mar 28, 2025
18b51db
Remove unnecessary GCB volume usage
decoNR Mar 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 114 additions & 46 deletions infra/build/functions/fuzzbench.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,47 @@ def get_env(project, build):
return env


def get_build_fuzzers_step(fuzzing_engine, project, env, build):
def get_env_dict(env):
"""Converts a list of environment strings to a dictionary."""
env_dict = {}
for item in env:
item_list = item.split("=")
env_dict[item_list[0]] = item_list[1]
return env_dict


def get_fuzzbench_setup_steps():
"""Returns the build steps required to set up fuzzbench on oss-fuzz-on-demand
build."""
fuzzbench_setup_steps = [
{
'args': [
'clone', 'https://github.com/google/fuzzbench', '--depth', '1',
FUZZBENCH_PATH
],
'name': 'gcr.io/cloud-builders/git',
'volumes': [{
'name': 'fuzzbench_path',
'path': FUZZBENCH_PATH,
}],
},
{
'name': 'gcr.io/cloud-builders/docker',
'args': ['pull', 'gcr.io/oss-fuzz-base/base-builder-fuzzbench']
},
{ # TODO(metzman): Don't overwrite base-builder
'name':
'gcr.io/cloud-builders/docker',
'args': [
'tag', 'gcr.io/oss-fuzz-base/base-builder-fuzzbench',
'gcr.io/oss-fuzz-base/base-builder'
]
},
]
return fuzzbench_setup_steps


def get_build_fuzzers_steps(fuzzing_engine, project, env, build):
"""Returns the build_fuzzers step to build |project| with |fuzzing_engine|,
for fuzzbench/oss-fuzz-on-demand."""
steps = []
Expand All @@ -70,6 +110,7 @@ def get_build_fuzzers_step(fuzzing_engine, project, env, build):
},
]
steps.append(engine_step)

compile_project_step = {
'name':
get_engine_project_image(fuzzing_engine, project),
Expand All @@ -86,11 +127,76 @@ def get_build_fuzzers_step(fuzzing_engine, project, env, build):
# `cd /src && cd {workdir}` (where {workdir} is parsed from the
# Dockerfile). Container Builder overrides our workdir so we need
# to add this step to set it back.
(f'ls /fuzzbench && rm -r /out && cd /src && cd {project.workdir} && '
(f'rm -r /out && cd /src && cd {project.workdir} && '
f'mkdir -p {build.out} && compile'),
],
}
steps.append(compile_project_step)

return steps


def get_build_and_push_ood_image_steps(fuzzing_engine, project, env, build):
"""Returns the build steps to create and push the oss-fuzz-on-demand
self-contained image."""
steps = []

copy_runtime_essential_files_step = {
'name':
get_engine_project_image(fuzzing_engine, project),
'env':
env,
'volumes': [{
'name': 'fuzzbench_path',
'path': FUZZBENCH_PATH,
}],
'args': [
'bash', '-c', 'cp /usr/local/bin/fuzzbench_run_fuzzer '
'/workspace/fuzzbench_run_fuzzer.sh && '
f'cp -r {FUZZBENCH_PATH} /workspace && ls /workspace'
],
}
steps.append(copy_runtime_essential_files_step)

runtime_image_tag = f'us-central1-docker.pkg.dev/oss-fuzz/unsafe/ood/{fuzzing_engine}/{project.name}'
fuzzer_runtime_dockerfile_path = os.path.join('/workspace' + FUZZBENCH_PATH,
'fuzzers', fuzzing_engine,
'runner.Dockerfile')
build_runtime_step = {
'name':
'gcr.io/cloud-builders/docker',
'args': [
'build', '--tag', runtime_image_tag, '--file',
fuzzer_runtime_dockerfile_path,
os.path.join('/workspace' + FUZZBENCH_PATH, 'fuzzers')
]
},
steps.append(build_runtime_step)

env_dict = get_env_dict(env)
oss_fuzz_on_demand_dockerfile_path = "/workspace/oss-fuzz/infra/build/functions/ood.Dockerfile"
build_out_path_without_workspace = build.out[10:]
build_ood_image_step = {
'name':
'gcr.io/cloud-builders/docker',
'args': [
'build', '--tag', runtime_image_tag, '--file',
oss_fuzz_on_demand_dockerfile_path, '--build-arg',
f'runtime_image={runtime_image_tag}', '--build-arg',
f'BUILD_OUT_PATH={build_out_path_without_workspace}', '--build-arg',
f'FUZZING_ENGINE={env_dict["FUZZING_ENGINE"]}', '--build-arg',
f'FUZZBENCH_PATH={FUZZBENCH_PATH}', '--build-arg',
f'BENCHMARK={env_dict["BENCHMARK"]}', '/workspace'
]
}
steps.append(build_ood_image_step)

push_ood_image_step = {
'name': 'gcr.io/cloud-builders/docker',
'args': ['push', runtime_image_tag]
}
steps.append(push_ood_image_step)

return steps


Expand All @@ -109,31 +215,7 @@ def get_build_steps( # pylint: disable=too-many-locals, too-many-arguments
upload=config.upload,
fuzzing_engine=config.fuzzing_engine)

steps = [
{
'args': [
'clone', 'https://github.com/google/fuzzbench', '--depth', '1',
FUZZBENCH_PATH
],
'name': 'gcr.io/cloud-builders/git',
'volumes': [{
'name': 'fuzzbench_path',
'path': FUZZBENCH_PATH,
}],
},
{
'name': 'gcr.io/cloud-builders/docker',
'args': ['pull', 'gcr.io/oss-fuzz-base/base-builder-fuzzbench']
},
{ # TODO(metzman): Don't overwrite base-builder
'name':
'gcr.io/cloud-builders/docker',
'args': [
'tag', 'gcr.io/oss-fuzz-base/base-builder-fuzzbench',
'gcr.io/oss-fuzz-base/base-builder'
]
},
]
steps = get_fuzzbench_setup_steps()

steps += build_lib.get_project_image_steps(project.name,
project.image,
Expand All @@ -143,25 +225,11 @@ def get_build_steps( # pylint: disable=too-many-locals, too-many-arguments
build = build_project.Build(config.fuzzing_engine, 'address', 'x86_64')
env = get_env(project, build)

steps += get_build_fuzzers_step(config.fuzzing_engine, project, env, build)
steps += get_build_fuzzers_steps(config.fuzzing_engine, project, env, build)

steps += get_build_and_push_ood_image_steps(config.fuzzing_engine, project,
env, build)

run_fuzzer_step = {
'name':
get_engine_project_image(config.fuzzing_engine, project),
'env':
env,
'volumes': [{
'name': 'fuzzbench_path',
'path': FUZZBENCH_PATH,
}],
'args': [
'bash',
'-c',
(f'ls /fuzzbench && cd {build.out} && ls {build.out} && '
'fuzzbench_run_fuzzer'),
],
}
steps.append(run_fuzzer_step)
return steps


Expand All @@ -172,4 +240,4 @@ def main():


if __name__ == '__main__':
sys.exit(main())
sys.exit(main())
38 changes: 38 additions & 0 deletions infra/build/functions/ood.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/usr/bin/env python3
#
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
################################################################################
ARG runtime_image
FROM $runtime_image

ARG BUILD_OUT_PATH
ARG FUZZING_ENGINE
ARG FUZZBENCH_PATH
ARG BENCHMARK

RUN mkdir -p /ood
RUN mkdir -p /ood$FUZZBENCH_PATH

COPY ./fuzzbench_run_fuzzer.sh /ood
COPY .$BUILD_OUT_PATH /ood
COPY .$FUZZBENCH_PATH /ood$FUZZBENCH_PATH

ENV OUT=/ood
ENV FUZZING_ENGINE=$FUZZING_ENGINE
ENV FUZZBENCH_PATH=/ood$FUZZBENCH_PATH
ENV BENCHMARK=$BENCHMARK

CMD ["bash", "-c", "/ood/fuzzbench_run_fuzzer.sh"]
Loading