Wazuh 代码库 Coverity 静态分析:容器化扫描工具链的使用与原理
2026/9/15 15:57:16 网站建设 项目流程

Wazuh 代码库 Coverity 静态分析:容器化扫描工具链的使用与原理

【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuh

导读

本文围绕 Wazuh 仓库tools/testing/coverity/目录下的扫描工具链展开,讲解如何借助 Coverity Scan 对 Wazuh 这个大型 C/C++ 安全平台代码库执行静态分析。读完本文,你将掌握coverity.sh帮助脚本与配套Dockerfile的完整用法——包括镜像构建、本地/CI 分析、结果打包与上传的全流程,并理解其背后的构建参数(COVERITY=YES)、元数据生成逻辑以及仓库内 GitHub Actions 工作流的真实调用方式。

目录组成与工具定位

tools/testing/coverity/目录下只有三个文件,职责非常清晰:

文件作用
coverity.sh主辅助脚本:负责下载 Coverity 分析工具、构建 Docker 镜像、在容器内运行分析、打包并上传结果
Dockerfile定义用于编译 Wazuh 的分析镜像,镜像内预置cov-build工具与编译依赖
README.md使用说明(即本文的骨架来源)

这套设计的关键点在于:本地与 CI 使用同一套容器化环境执行分析,从而保证分析结果的可复现性。CI 场景下仓库提供了对应的 GitHub Actions 工作流(见下文"与 CI 集成"一节)。

快速上手:命令与参数

脚本的调用格式如下:

./coverity.sh [--build-image] [--build] [--upload] [--clean] [--jobs N]

不带任何参数运行时,脚本会依次执行"编译分析"和"结果上传"两个阶段(即等价于--build --upload)。

各选项的语义如下:

选项行为
--build-image下载 Coverity 分析工具并构建 Docker 镜像,完成后脚本立即退出;必须设置COVERITY_TOKEN
--build使用 Coverity Docker 镜像编译项目,生成分析输出wazuh.tgz
--uploadwazuh.tgz上传至 Coverity Scan;必须设置COVERITY_TOKEN,且 tarball 不存在时直接报错退出
--clean清理生成物:删除cov-int/目录与wazuh.tgz压缩包
--jobs N指定编译时并行任务数,默认取系统nproc
--help打印使用信息

另外,从 coverity.sh 的源码可以看到,脚本还额外支持--tag <tag>选项,用于指定所使用分析镜像的 tag(默认latest);该选项虽未写入 README,但在脚本的参数解析与帮助文本中均已实现。

环境变量

变量说明
PROJECTCoverity 项目名,必须是wazuhossec-wazuh,默认wazuhossec-wazuh通常用于开发分支的分析,避免污染正式项目的缺陷统计
COVERITY_TOKENCoverity 项目令牌,--build-image--upload阶段的必填项
EMAIL与 Coverity 账号关联的邮箱,默认devel@wazuh.com,用于接收分析报告通知

注意:README 中以TOKEN指代令牌,但脚本实际读取的环境变量名为COVERITY_TOKEN(见 coverity.sh 中的COVERITY_TOKEN="${COVERITY_TOKEN:-}")。实际使用时请以COVERITY_TOKEN为准。

构建产物

  • 分析结果生成在项目根目录下的cov-int目录中;
  • 项目根目录会生成压缩包wazuh.tgz,随后被上传至 Coverity。

一次完整扫描的执行流程(源码级解析)

下面结合 coverity.sh 的源码,拆解每个阶段在底层究竟做了什么。

1. 构建分析镜像:--build-image

wget -q https://scan.coverity.com/download/linux64 \ --post-data "token=${COVERITY_TOKEN}&project=wazuh%2F${PROJECT}" \ -O "$TOOL_TGZ" docker build -t "$IMAGE" "$COVERITY_DIR"

该阶段用wgetPOST方式向 Coverity 官方下载站点请求 Linux 64 位分析工具包(保存为coverity_tool.tgz),随后调用docker build基于 Dockerfile 构建镜像。脚本通过trap机制保证退出时清理临时下载的工具包文件(coverity.sh)。

2. 编译分析:--build

make -C "$ROOT_DIR/src" clean-internals make -C "$ROOT_DIR/src" clean-windows rm -rf "$COV_DIR" docker run --rm \ -v "$ROOT_DIR:/src" \ -w /src \ -u "$(id -u):$(id -g)" \ "$IMAGE" \ make -C src TARGET=manager COVERITY=YES -j"$JOBS"

关键点逐条说明:

  • 先清理源码目录,确保分析从干净状态开始;
  • docker run将仓库根目录挂载到容器/src,以当前用户 UID/GID 运行(避免生成 root 属主的文件),并使用--rm在结束后自动删除容器;
  • 容器内执行的是make -C src TARGET=manager COVERITY=YES -j"$JOBS",即以 manager 为目标、开启 Coverity 插桩的编译COVERITY=YES这个开关在 src/Makefile 中有专门处理:它会导出COVERITY_UNSUPPORTED_COMPILER_INVOCATION=1,用于放宽 cov-build 对不常见编译器调用方式的检测,确保 Wazuh 复杂的构建脚本(多编译器包装、跨模块链接等)能正常插桩;
  • 由于镜像的ENTRYPOINT被设置为cov-build --dir cov-int(见下文),容器实际执行的命令等价于cov-build --dir cov-int make -C src TARGET=manager COVERITY=YES -jN——即所有编译动作都会把"发射(emit)"数据写入cov-int目录;
  • 编译结束后,用tar czf wazuh.tgz -C "$ROOT_DIR" cov-int将分析数据压缩为wazuh.tgz

3. 上传结果:--upload

curl -s -w "%{http_code}" \ --form token="$COVERITY_TOKEN" \ --form email="$EMAIL" \ --form file=@"$TARBALL" \ --form version="$VERSION" \ --form description="$DESCRIPTION" \ "https://scan.coverity.com/builds?project=wazuh%2F${PROJECT}"

上传通过curl以 multipart/form-data 方式提交,携带tokenemailfileversiondescription五个字段。脚本用-w "%{http_code}"把 HTTP 状态码拼在响应末尾,随后解析出响应体与状态码:状态码 ≥ 400 视为失败并退出(coverity.sh)。上传前还会检查wazuh.tgz是否存在,不存在则报错提示先执行--build

4. 清理:--clean

删除cov-int/目录与wazuh.tgz,用于在分析结束后释放磁盘空间。

Docker 镜像解析

Dockerfile 采用多阶段构建,基于ubuntu:24.04

FROM ubuntu:24.04 AS builder ARG COVERITY_HOME="/opt/cov-analysis" COPY coverity_tool.tgz /tmp/ RUN mkdir -p $COVERITY_HOME && \ tar -zxf /tmp/coverity_tool.tgz -C $COVERITY_HOME --strip-components=1 FROM ubuntu:24.04 ARG COVERITY_HOME="/opt/cov-analysis" ENV PATH="$COVERITY_HOME/bin:$PATH" RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y curl make cmake gcc g++ file && \ rm -rf /var/lib/apt/lists/* COPY --from=builder $COVERITY_HOME $COVERITY_HOME ENTRYPOINT ["cov-build", "--dir", "cov-int"]

设计要点:

  • 第一阶段解压coverity_tool.tgz/opt/cov-analysis--strip-components=1去除顶层目录);
  • 最终镜像安装 Wazuh 编译所需的最小依赖集:curlmakecmakegccg++file,并清理 apt 缓存控制镜像体积;
  • cov-build加入PATH,并把ENTRYPOINT固定为cov-build --dir cov-int——这正是--build阶段容器内编译能够自动产出cov-int分析数据的原因。

版本与描述元数据

每次上传的分析都会附带从项目提取的元数据:

  • VERSION取自仓库根目录的 VERSION.json:.version + "-" + .stage,例如当前仓库为5.1.0-alpha0
  • DESCRIPTION格式为Version $VERSION - Git ref <branch>,其中<branch>优先取最近的精确 tag(git describe --tags --exact-match),无 tag 时回退为当前分支名(coverity.sh)。

这些信息会展示在 Coverity Scan 的项目页面上,便于区分不同版本/分支的分析结果。

与 CI 的集成

README 提到同一扫描可以直接跑在 GitHub Actions 的4_codeanalysis_coverity工作流中。对照仓库当前内容,该工作流实际有两代实现:

  • 4_codeanalysis_coverity.yml 与 4_codeanalysis_coverity-image.yml:已标记为deprecated,仅在手动触发时打印警告,不应再使用;
  • 5_codeanalysis_coverity.yml:当前 5.X 分支的正式工作流,支持通过workflow_dispatch手动触发,可配置projectwazuh/ossec-wazuh)、threads、编译target(manager / agent)与镜像 tag。其内部流程与本地脚本高度一致:
    • preparejob 计算PROJECTwazuhwazuh/wazuhossec-wazuhwazuh/ossec-wazuh)、JOBSVERSIONDESCRIPTION
    • buildjob 执行make -C src deps下载依赖、登录容器仓库(ghcr.io)、调用.github/actions/coverity/build复合动作执行make -C src TARGET=<target> COVERITY=YES -j$JOBS,随后打包wazuh.tgz并上传到内部 S3 暂存;
    • uploadjob 从 S3 取回产物,调用.github/actions/coverity/upload复合动作完成上传,其中 token 按项目区分:正式项目使用COVERITY_SCAN_WAZUH_TOKEN,开发项目使用COVERITY_SCAN_OSSEC_TOKEN
  • 5_codeanalysis_coverity-image.yml:负责构建并发布分析镜像,触发条件为workflow_dispatch手动触发或push 到tools/testing/coverity/**路径(即工具目录内容变更时自动重建镜像),发布到ghcr.io/wazuh/coverity-scan:<tag>,默认 tag 为5.x

这意味着:一旦分析工具链或构建依赖有改动,CI 会自动重建并推送新镜像,本地与 CI 始终基于同一镜像版本,避免了"本地能跑、CI 报错"的环境漂移问题。

实战示例:完整工作流

以下是 README 给出的标准操作序列(令牌也可通过环境变量COVERITY_TOKEN注入):

# 1. 构建镜像(仅在首次或依赖变更时需要执行) COVERITY_TOKEN=your_token ./coverity.sh --build-image # 2. 运行分析并上传结果 COVERITY_TOKEN=your_token ./coverity.sh # 3. 仅将已生成的分析包上传到 ossec-wazuh 项目 COVERITY_TOKEN=your_token PROJECT=ossec-wazuh ./coverity.sh --upload # 4. 分析完成后清理生成物 ./coverity.sh --clean

若希望控制编译并行度,可追加--jobs 4等参数;若本地已构建好分析镜像并打了自定义 tag,可用--tag <tag>指定。

注意事项

  • --build-image需要从scan.coverity.com下载工具包,必须联网且持有有效令牌,否则wget拿到的不是合法压缩包,镜像构建会失败;
  • --upload依赖网络可达 Coverity 上传端点,上传失败时脚本会打印响应体并依据 HTTP 状态码退出非零,便于在 CI 中直接暴露失败;
  • 分析对象当前固定为manager 编译目标(本地脚本写死TARGET=manager),如需分析 agent 目标,可参照 5_codeanalysis_coverity.yml 工作流中的target参数用法调整命令;
  • 本地分析会占用较大磁盘空间(cov-int中的发射数据库),完成后记得执行./coverity.sh --clean回收空间。

【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询