OSS-Fuzz 基础设施镜像全量构建指南:从 base-image 到 base-runner 的 Docker 构建体系解析
OSS-Fuzz 基础设施镜像全量构建指南从 base-image 到 base-runner 的 Docker 构建体系解析【免费下载链接】oss-fuzzOSS-Fuzz - continuous fuzzing for open source software.项目地址: https://gitcode.com/gh_mirrors/oss/oss-fuzz本文围绕 infra/base-images/README.md 中唯一但核心的构建入口展开在项目根目录执行infra/base-images/all.sh即可一键构建 OSS-Fuzz 的全部基础设施镜像infra images。阅读本文后你将掌握 OSS-Fuzz 从基础镜像、编译器镜像、各语言 builder 镜像到 runner 镜像的完整构建顺序与依赖关系理解每个镜像在持续模糊测试流水线中的职责并能针对性地单独构建、传参或排查问题。一、构建入口all.sh 一键构建全部镜像原文档给出的操作方式非常简洁但它是整个 OSS-Fuzz 基础设施构建体系的唯一总入口# 从项目根目录执行 infra/base-images/all.sh打开 infra/base-images/all.sh 可以看到这个脚本按严格的依赖顺序依次执行了 9 条docker build命令构建结果全部推送到gcr.io/oss-fuzz-base/命名空间下构建顺序镜像 Tag构建上下文目录说明1gcr.io/oss-fuzz-base/base-imageinfra/base-images/base-image所有其他镜像的基石带--pull拉取最新基础层2gcr.io/oss-fuzz-base/base-clanginfra/base-images/base-clang内置 Clang/LLVM 工具链的编译器镜像3gcr.io/oss-fuzz-base/base-builderinfra/base-images/base-builder通用项目构建镜像预装 libFuzzer、AFL 等引擎4gcr.io/oss-fuzz-base/base-builder-goinfra/base-images/base-builder-goGo 语言变体 builder5gcr.io/oss-fuzz-base/base-builder-jvminfra/base-images/base-builder-jvmJVMJava语言变体 builder6gcr.io/oss-fuzz-base/base-builder-pythoninfra/base-images/base-builder-pythonPython 语言变体 builder7gcr.io/oss-fuzz-base/base-builder-rustinfra/base-images/base-builder-rustRust 语言变体 builder8gcr.io/oss-fuzz-base/base-builder-swiftinfra/base-images/base-builder-swiftSwift 语言变体 builder9gcr.io/oss-fuzz-base/base-runnerinfra/base-images/base-runner运行/复现/覆盖率镜像10gcr.io/oss-fuzz-base/base-runner-debuginfra/base-images/base-runner-debug带 valgrind、GDB 的调试版 runner脚本开头的#!/bin/bash -eux表明遇到任何一步失败-e都会立即终止并打印-x每一步执行的命令方便你观察构建进度与定位错误。需要留意脚本中的两个细节第一条命令带--pulldocker build --pull -t gcr.io/oss-fuzz-base/base-image ...表示 base-image 总是拉取最新的上游基础镜像其 Dockerfile 中的parent_image参数以保证安全更新其余镜像则依赖本地已构建的 base-image / base-clang / base-builder。$透传脚本把命令行参数原样透传给每条docker build。因此你可以这样给所有镜像追加构建参数例如指定平台架构# 为所有镜像显式指定构建平台x86_64 / aarch64 等 infra/base-images/all.sh --platform linux/amd64二、镜像依赖链谁构建在谁之上要正确使用 all.sh首先需要理解 10 个镜像之间严格的FROM继承关系这决定了脚本的构建顺序。从各镜像的 Dockerfile 中可以梳理出如下依赖链base-image (ubuntu:20.04) └── base-clang (预编译安装 LLVM/Clang、cmake、fuzz-introspector) └── base-builder (通用构建器sanitizer 标志、libFuzzer/AFL/honggfuzz/centipede、Python、Bazel) ├── base-builder-go (Go 工具链) ├── base-builder-jvm (JVM 工具链) ├── base-builder-python (Python 工具链) ├── base-builder-rust (Rust 工具链) └── base-builder-swift (Swift 工具链) base-image (复用同一基础层) ├── base-runner (复现、覆盖率、符号化工具) └── base-runner-debug (base-runner valgrind GDB)证据分别位于base-image/Dockerfile以ubuntu:20.04为底parent_image构建参数只安装最少的libc6-dev binutils libgcc-9-dev tzdata并统一声明OUT/out、SRC/src、WORK/work三个关键环境变量与目录把$PATH加上/out。base-runner 中运行的 fuzzer 也依赖这些约定。base-clang/DockerfileFROM gcr.io/oss-fuzz-base/base-image通过 checkout_build_install_llvm.sh 现场编译安装 LLVM设置CCclang、CXXclang与默认CFLAGS含-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION并针对旧代码把implicit-function-declaration等错误降级为警告。base-builder/DockerfileFROM gcr.io/oss-fuzz-base/base-clang在此基础上安装 Python 3.8.3、Bazelisk、AFL、honggfuzz、FuzzTest/centipede并把 compile、compile_libfuzzer、compile_afl 等脚本拷贝到/usr/local/bin/。base-builder-go/DockerfileFROM gcr.io/oss-fuzz-base/base-builder追加GOPATH/root/go并执行install_go.sh。base-runner/Dockerfile没有简单继承 base-builder而是使用多阶段构建——先从 base-image 临时构建rustfilt避免在最终镜像中保留 1GB 的 Rust 工具链再从 base-clang 阶段拷贝llvm-cov、llvm-profdata、llvm-symbolizer三个二进制最终镜像基于 base-image保证运行时镜像足够轻量。base-runner-debug/DockerfileFROM gcr.io/oss-fuzz-base/base-runner额外安装 valgrind、zip 并从源码编译 GDB 12.1用于崩溃调试场景。从源码结构看这种分层设计的核心价值是复用与隔离编译期重量级工具链集中在 builder 镜像中而生产运行期只依赖轻量的 runner 镜像。三、base-builder构建器的命令、环境变量与目录约定每个项目的 OSS-Fuzz 构建镜像都基于 base-builder。子目录 base-builder/README.md 明确了项目镜像对外暴露的接口。3.1 支持的命令任何项目镜像构建完成后都可以通过 docker 调用其内置命令docker run --rm -ti gcr.io/oss-fuzz/项目名 command arguments...命令说明compile默认构建全部 fuzz target/bin/bash进入 shell手动执行compile脚本启动构建这与 base-builder/Dockerfile 中的CMD [compile]相印证镜像默认入口就是 compile。3.2 构建配置环境变量同一个构建镜像可以通过环境变量产出不同配置的 fuzz 二进制环境变量默认值说明$SANITIZERaddress预设 sanitizer 配置address/memory/undefined/hwaddress/thread等$SANITIZER_FLAGS—直接指定 sanitizer 编译标志优先级高于$SANITIZER$COVERAGE_FLAGS—指定 fuzzer 反馈覆盖率用的编译标志$BUILD_UID—构建 fuzzers 时使用的用户 id一个典型用法示例原文档示例构建 sqlite3 的 UBSan 版本docker run --rm -ti -e SANITIZERundefined gcr.io/oss-fuzz/sqlite3从 base-builder/Dockerfile 可以看到这些配置在镜像内的完整预设。例如 address sanitizer 对应-fsanitizeaddress -fsanitize-address-use-after-scopeundefined 对应一组精确的-fsanitizearray-bounds,bool,builtin,enum,...列表并使用-fno-sanitize-recover还针对 aarch64 提供了去掉function的变体因为该选项在 aarch64 上不受支持。覆盖率构建SANITIZER_FLAGS_coverage为空字符串表示不加任何 sanitizerCOVERAGE_FLAGS默认是-fsanitizefuzzer-no-link而专门的覆盖率构建则使用-fprofile-instr-generate -fcoverage-mapping组合。3.3 镜像内目录布局位置环境变量用途/out/$OUT存放构建产物fuzz target、字典、options 文件、种子语料压缩包/src/$SRC检出项目源码/work/$WORK存放中间文件/usr/lib/libFuzzingEngine.a$LIB_FUZZING_ENGINE预构建的 fuzzing 引擎库如 libFuzzer所有 fuzz target 必须链接它目录在容器内是固定的但通过环境变量提供是为了让脚本可重定位。这一约定源自 base-image/Dockerfile 中mkdir -p $OUT $SRC $WORK chmod arwx的初始化。3.4 编译器标志约定子镜像构建 fuzzers 时必须使用以下环境变量提供的编译器与标志环境变量说明$CCC 编译器二进制$CXX、$CCCC 编译器二进制$CFLAGSC 编译标志$CXXFLAGSC 编译标志这些变量在 base-clang/Dockerfile 中完成初始化CCclang、CXXclangCFLAGS默认-O1 -fno-omit-frame-pointer -gline-tables-only ...C 额外追加-stdliblibc。绝大多数正规构建脚本会自动识别这些变量若不识别则需要手动把它们传给构建工具。3.5 子镜像项目镜像必须提供的文件源码子镜像需要把编译 fuzz targets 所需的全部源码检出到$SRC。运行时也可以用挂载方式覆盖本地检出docker run -v $HOME/my_project:/src/my_project ...。$SRC/build.sh构建脚本负责编译项目与 fuzz targets。这就是每个项目目录如 projects/sqlite3中 build.sh 的接口约定来源。四、base-runner运行、复现与覆盖率构建完镜像后base-runner 提供生产环境的执行能力。其用法为docker run -ti gcr.io/oss-fuzz-base/base-runner command argsbase-runner/README.md 列出四条核心命令命令说明reproduce fuzzer_name fuzzer_options构建全部 fuzz targets并用/testcase与给定参数运行指定 fuzzerrun_fuzzer fuzzer_name fuzzer_options运行指定 fuzzer自动合并.options文件中的参数test_all.py把/out下每个二进制当作 fuzzer 各运行一段时间验证其可用性coverage fuzzer_name为指定 fuzzer 生成覆盖率报告4.1 复现崩溃的两个典型用法使用最新 OSS-Fuzz 构建产物复现docker run --rm -ti -v testcase_path:/testcase \ gcr.io/oss-fuzz/PROJECT_NAME reproduce fuzzer_name使用本地源码检出复现挂载源码目录覆盖镜像内检出docker run --rm -ti \ -v source_path:/src/PROJECT_NAME \ -v testcase_path:/testcase \ gcr.io/oss-fuzz/PROJECT_NAME reproduce fuzzer_name对应实现位于 base-runner/reproduce、base-runner/run_fuzzer 与 base-runner/test_all.py仓库中还带有对应的测试 test_all_test.py。4.2 runner 镜像内的运行时默认值base-runner/Dockerfile 中预设了与 ClusterFuzz 侧保持一致的关键运行时选项理解这些有助于排查复现结果不一致的问题FUZZER_ARGS-rss_limit_mb2560 -timeout25默认内存上限 2560MB、单次执行超时 25 秒ASAN_OPTIONS包含detect_leaks1、detect_stack_use_after_return1、symbolize1、strip_path_prefix/workspace/等一整套与 ClusterFuzz 对齐的配置MSAN_OPTIONS/UBSAN_OPTIONS同样带有symbolize1与dedup_token_length3AFL_FUZZER_ARGS-m noneAFL 模式下不限制内存。五、独立构建单个镜像的三种方式all.sh面向全量构建但日常开发更常见的需求是单独构建某一个镜像仓库给出了灵活的实现路径直接对子目录执行 docker build使用 all.sh 中对应的 tag 与目录docker build -t gcr.io/oss-fuzz-base/base-builder infra/base-images/base-builder利用 all.sh 的参数透传构建全部但附加平台等参数见上文。从单个子镜像的 Dockerfile 追溯其全部依赖由于 base-builder、base-runner 等都FROM上游镜像本地若缺少这些上游 tagdocker build 会失败——此时可先执行 all.sh 中的前几步或单独构建对应依赖镜像这正是 all.sh 按依赖顺序排列各条命令的原因。六、构建前的环境要求与注意事项本流程基于 Docker请确保本地 Docker 守护进程可用且有足够磁盘空间base-clang 需现场编译 LLVMbase-runner 亦需多阶段构建磁盘占用通常达数 GB。all.sh使用bash -eux模式任一步docker build失败即中止失败时可先确认对应子目录 Dockerfile 中的依赖镜像 tag 是否已在本机存在。各镜像的 tag 固定为gcr.io/oss-fuzz-base/*如果构建机无法访问gcr.io镜像仓库或目标 registry 不同需要自行替换 all.sh 中的 tag。除文档外仓库还在 infra/base-images/base-builder-fuzzbench/ 提供了面向 FuzzBench 的扩展 builder 变体其包含fuzzbench_build、fuzzbench_measure、fuzzbench_run_fuzzer等独立脚本可在理解基础体系后进一步探索。七、小结从一条命令读懂整套构建体系回到起点infra/base-images/all.sh虽然只有十行 docker build 命令但它背后是 OSS-Fuzz 精心设计的镜像分层体系base-image 提供统一目录与基础运行时base-clang 提供模糊测试专用的编译器工具链base-builder 及各语言变体承载构建 fuzzers的全部能力base-runner 系列则负责运行、复现、覆盖率与调试。掌握这一链条无论是要为本仓库新增语言支持、调试构建失败还是复用这套基础设施搭建自己的模糊测试流水线都有了清晰的着手点。【免费下载链接】oss-fuzzOSS-Fuzz - continuous fuzzing for open source software.项目地址: https://gitcode.com/gh_mirrors/oss/oss-fuzz创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

lego 集成 DirectAdmin DNS 提供商:配置详解与 TXT 挑战实现原理

lego 集成 DirectAdmin DNS 提供商:配置详解与 TXT 挑战实现原理

网络安全密码学 【免费下载链接】lego Lets Encrypt/ACME client and library written in Go 项目地址: https://gitcode.com/gh_mirrors/le/lego 点击查看 免费下载 本文是一份面向开发者的 DirectAdmin DNS 提供商(Provider)使用指南。基于…

2026/9/24 14:58:13 阅读更多 →
openFrameworks 四元数 ArcBall 交互示例解析:基于 glm 的拖拽旋转实现原理

openFrameworks 四元数 ArcBall 交互示例解析:基于 glm 的拖拽旋转实现原理

图形学音视频 【免费下载链接】openFrameworks openFrameworks is a community-developed cross platform toolkit for creative coding in C. 项目地址: https://gitcode.com/gh_mirrors/op/openFrameworks 点击查看 免费下载 导读 本文围绕 openFrameworks 官方…

2026/9/24 14:58:13 阅读更多 →
每次卡顿重启光猫路由器就好?别自欺欺人了!这才是根治网速卡顿的真相

每次卡顿重启光猫路由器就好?别自欺欺人了!这才是根治网速卡顿的真相

几乎所有人遇到网速卡顿、加载转圈、延迟变高,第一操作就是重启光猫和路由器。神奇的是,重启完瞬间网速满血、测速满分、上网丝滑,很多人就此以为网络没问题,只是偶尔抽风。但过不了半天、最多一天,卡顿、掉速、缓冲问…

2026/9/24 14:57:11 阅读更多 →

最新新闻

第9章:提交项目到GitHub

第9章:提交项目到GitHub

第9章:提交项目到GitHub 本章目标 完整走一遍把项目提交到 GitHub 远程仓库的流程,包括 GitHub 特有的 Personal Access Token(PAT) 认证、代理配置、以及命令行 / TortoiseGit 两套操作。与 第8章:提交项目到Gitee 对…

2026/9/24 17:46:43 阅读更多 →
第 3 篇 · p2m 内存类型分类

第 3 篇 · p2m 内存类型分类

p2m 表项不只记"对应哪个 MFN",还带一个类型标签(p2m_type),决定访问它时的行为。这一篇把 Xen 的 p2m 类型讲透:完整枚举 各自用例,以及它们之上两个容易混淆的"分组/空间"概念——类…

2026/9/24 17:46:43 阅读更多 →
计算机毕业设计之基于MySQL的校园二手商城的设计及实现

计算机毕业设计之基于MySQL的校园二手商城的设计及实现

随着新世纪无纸化办公方式的普及,自动化信息处理和基于网络的信息交互方式已被广泛应用。现在很多行业基本上都是交由计算机进行管理和测试,网络与计算机已成为整个线上管理体系中的重要组成部分。虽然信息技术广泛应用和数据存取更加方便,但…

2026/9/24 17:46:43 阅读更多 →
检测链接的前端代码

检测链接的前端代码

##任务1:在WEB前端中,提取所有图片URL和图片绑定的响应跳转链接。##任务2:在WEB前端中,提取所有外站链接的地址。##任务3:在WEB前端中,提取所有带文字描述的内部链接及其对应的文字标题。##任务4&#xff1…

2026/9/24 17:46:43 阅读更多 →
第10章:常见问题与避坑指南

第10章:常见问题与避坑指南

第10章:常见问题与避坑指南 本章目标 汇总 Git / TortoiseGit 使用中最高频的 30 个问题:症状 → 原因 → 解决。建议遇到问题时用 CtrlF 搜索报错关键字。 1. 中文乱码问题 1.1 git log / git status 中文显示为八进制(\344\275\240&#x…

2026/9/24 17:46:43 阅读更多 →
宝塔菜农药残留检测试剂盒:国标限量、超标风险与快速检测方案

宝塔菜农药残留检测试剂盒:国标限量、超标风险与快速检测方案

宝塔菜农药残留辛硫磷、啶虫脒、腐霉利等超标风险突出。冠宇仪器制造(江苏)有限公司推出宝塔菜农药残留检测试剂盒,农药残留胶体金试剂盒能够快速检测宝塔菜中的地虫硫磷、丁硫克百威、毒虫畏、毒死蜱、对硫磷等农药残留,农药残留…

2026/9/24 17:45:42 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →