NVlabs/cuFuzz

GitHub: NVlabs/cuFuzz

cuFuzz是一款面向GPU的覆盖引导模糊测试工具,能够在主机端和设备端同时收集覆盖信息,用于发现CUDA应用程序中的安全漏洞。

Stars: 20 | Forks: 0

# cuFuzz 本仓库包含 **cuFuzz** 的相关资源,这是一款面向 GPU 的覆盖引导模糊测试工具,用于用户空间 CUDA 应用程序。cuFuzz 将主机端和设备端覆盖收集与清理相结合,能够有效发现 CUDA 程序中的漏洞。 ![概述](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/96cc6a9ac2105524.jpg) ## 仓库结构 ``` cufuzz-artifacts/ ├── src/ # Core cuFuzz components │ ├── cufuzz_cov_nvbit/ # NVBit-based device-side coverage collection tool │ └── cufuzz_sand/ # Sanitizer wrappers for SAND integration ├── targets/ # Example fuzzing targets │ └── sampleApp/ # Simple CUDA app with intentional bug for testing ├── scripts/ # Evaluation and analysis scripts ├── Tools/ # External dependencies │ ├── AFLplusplus/ # AFL++ fuzzer (git submodule) │ └── AFLplusplus.patch # cuFuzz patches for AFL++ ├── third-party-licenses/ # Third-party license files │ ├── LICENSE_from_aflplusplus # AFL++ Apache 2.0 license │ └── LICENSE_from_nvbit # NVBit NVIDIA EULA ├── images/ # Documentation images ├── build.sh # Automated build script ├── verify_build.sh # Quick verification test ├── Dockerfile # Docker container definition ├── LICENSE # Apache License 2.0 └── CONTRIBUTING.md # Contribution guidelines and DCO ``` ## 需求 ### 硬件需求 cuFuzz 在以下硬件配置上进行了测试: | 组件 | 规格 | |-----------|---------------| | **GPU** | NVIDIA A40(48GB 显存,计算能力 8.6) | | **CPU** | Intel Xeon Platinum 8362(64 核心,每核心 2 线程) | | **内存** | 建议 120GB+ RAM | | **存储** | Docker 镜像和模糊测试输出需要 50GB+ 可用空间 | **其他 GPU**:cuFuzz 应该可以在其他计算能力 ≥ 7.0 的 NVIDIA GPU 上运行。请相应调整 `GPU_ARCH` 环境变量(请参阅 [GPU 架构配置](#gpu-architecture-configuration)))。 ### 软件需求 | 组件 | 版本 | |-----------|---------| | Ubuntu | 22.04 LTS | | NVIDIA 驱动程序 | 570.144 或兼容版本 | | CUDA 工具包 | 12.9 | | Docker | 20.10+(推荐) | | nvidia-container-toolkit | 需要支持 `--gpus` 标志 | | clang | 14 | ## 快速开始:Docker 说明 试用 cuFuzz 最快的方式是使用 Docker 容器。我们的 Dockerfile 使用官方 NVIDIA CUDA 12.9 开发镜像。 ### 1. 提取资源并设置 AFL++ ``` tar -xzvf cufuzz-artifacts.tar.gz cd cufuzz-artifacts # 克隆 AFL++(必需依赖项) git clone https://github.com/AFLplusplus/AFLplusplus.git Tools/AFLplusplus cd Tools/AFLplusplus git checkout 9cac7ced05eb9f36c1d0b02ad594b3b09cd3938b cd ../.. ``` ### 2. 构建 Docker 镜像 构建 Docker 镜像,指定您的 GPU 架构: ``` sudo docker build --build-arg GPU_ARCH= -t cufuzz . ``` **GPU 架构参考:** | GPU 系列 | 架构 | 示例 | |------------|--------------|----------| | Ampere(数据中心) | `sm_80` | A100 | | Ampere(消费级/专业级) | `sm_86` | A40、RTX 3090、RTX 3060 | | Hopper | `sm_90` | H100 | | Ada Lovelace | `sm_89` | RTX 4090、L40 | | Turing | `sm_75` | RTX 2080、T4 | 完整列表请参阅:https://developer.nvidia.com/cuda-gpus A40/RTX 3090 示例: ``` sudo docker build --build-arg GPU_ARCH=sm_86 -t cufuzz . ``` ### 3. 运行 Docker 容器 ``` sudo docker run --rm --gpus all -it -v /:/my_workspace cufuzz bash ``` ### 4. 验证安装 Docker 容器运行后,验证构建: ``` root@container:~/cufuzz# ./verify_build.sh ``` ## 详细构建说明(不使用 Docker) ### 前置条件 在 Ubuntu 22.04 上安装所需的依赖项: ``` apt-get update && apt-get install -y build-essential python3-dev automake cmake git flex \ bison libglib2.0-dev libpixman-1-dev python3-setuptools cargo libgtk-3-dev lld llvm llvm-dev \ clang ninja-build cpio libcapstone-dev wget curl python3-pip vim less libxxhash-dev bc zlib1g-dev ``` ### 设置 GPU 架构 为您的 GPU 设置 `GPU_ARCH` 环境变量(请参阅上面的架构表): ``` export GPU_ARCH=sm_86 # Change to match your GPU ``` ### 构建 AFL++ ``` cd Tools/AFLplusplus patch -N -p1 < ../AFLplusplus.patch export CXX=/usr/bin/clang++-14 export CC=/usr/bin/clang-14 make -j8 &> build.log ``` ### 构建 NVBit 覆盖工具 下载 NVBit 版本 1.7.5: ``` mkdir -p Tools/NVBit wget https://github.com/NVlabs/NVBit/releases/download/v1.7.5/nvbit-Linux-x86_64-1.7.5.tar.bz2 tar -xvf nvbit-Linux-x86_64-1.7.5.tar.bz2 mv nvbit_release_x86_64/* Tools/NVBit/ rm -rf nvbit_release_x86_64 nvbit-Linux-x86_64-1.7.5.tar.bz2 ``` 构建我们的 NVBit 覆盖工具: ``` cd src/cufuzz_cov_nvbit/ export GPU_ARCH=sm_86 # Adjust for your GPU ARCH=$GPU_ARCH make ``` ### 构建清理器包装器 ``` cd src/cufuzz_sand AFL_SAN_NO_INST=1 ../../Tools/AFLplusplus/afl-clang-fast -O2 wrapper_san.c -o wrapper_memcheck.out AFL_SAN_NO_INST=1 ../../Tools/AFLplusplus/afl-clang-fast -DSAN_MODE_INIT -O2 wrapper_san.c -o wrapper_initcheck.out AFL_SAN_NO_INST=1 ../../Tools/AFLplusplus/afl-clang-fast -DSAN_MODE_RACE -O2 wrapper_san.c -o wrapper_racecheck.out AFL_SAN_NO_INST=1 ../../Tools/AFLplusplus/afl-clang-fast -DSAN_MODE_ASAN -O2 wrapper_san.c -o wrapper_asan.out ``` ## 使用方法 构建 cuFuzz 后,使用以下命令启动模糊测试: ``` CUFUZZ_MAP_SIZE=65536 AFL_SKIP_CPUFREQ=1 AFL_PRELOAD=/PATH/TO/cufuzz_cov.so \ ./Tools/AFLplusplus/afl-fuzz -x sample.dict -i input_samples/ -o output_dir/ \ -t 1000000 ./cuda_app.out @@ ``` ### cuFuzz 环境变量 #### AFL++ 标准变量 | 变量 | 描述 | 示例 | |----------|-------------|---------| | `AFL_SKIP_CPUFREQ` | 跳过 CPU 调频策略检查 | `AFL_SKIP_CPUFREQ=1` | | `AFL_PRELOAD` | NVBit 覆盖工具路径 | `AFL_PRELOAD=/path/to/cufuzz_cov.so` | #### cuFuzz 覆盖变量 | 变量 | 描述 | 示例 | |----------|-------------|---------| | `CUFUZZ_MAP_SIZE` | 覆盖映射大小(字节) | `CUFUZZ_MAP_SIZE=65536` | | `COV_PERSISTENT` | 启用 AFL 持久模式支持(0=否,1=是) | `COV_PERSISTENT=1` | | `GPU_ARCH` | 构建目标 GPU 架构 | `GPU_ARCH=sm_86` | #### cuFuzz 清理变量 | 变量 | 描述 | 示例 | |----------|-------------|---------| | `ORIGINAL_APP` | 原始(未插桩)应用程序路径 | `ORIGINAL_APP=./cuda_app` | | `SANITIZER_PATH` | compute-sanitizer 二进制文件路径 | `SANITIZER_PATH=/usr/local/cuda/bin/compute-sanitizer` | | `SANITIZER_ARG` | memcheck 清理器参数 | `SANITIZER_ARG="--tool=memcheck --error-exitcode 99"` | | `SANITIZER_ARG_RACE` | racecheck 清理器参数 | `SANITIZER_ARG_RACE="--tool=racecheck --error-exitcode 99"` | | `SANITIZER_ARG_INIT` | initcheck 清理器参数 | `SANITIZER_ARG_INIT="--tool=initcheck --error-exitcode 99"` | #### AFL_SAN_ABSTRACTION 模式 `AFL_SAN_ABSTRACTION` 变量控制哪些输入被传递给清理器: | 值 | 描述 | 灵敏度 | 性能 | |-------|-------------|-------------|-------------| | `all_trace` | 将**所有**输入传递给清理器 | 最高 | 最慢 | | `simplify_trace` | 将具有**唯一执行路径**的输入传递给清理器 | 高 | 平衡 | | `unique_trace` | 将具有**唯一覆盖签名**的输入传递给清理器 | 中 | 较快 | | `coverage_increase` | 仅将导致**覆盖增加**的输入传递给清理器 | 最低 | 最快 | **推荐**:`AFL_SAN_ABSTRACTION=simplify_trace`(默认) ## 示例 ### 基本模式 在此模式下,cuFuzz 使用设备端覆盖收集,并在一部分输入(具有唯一跟踪的输入)上运行计算清理器。此模式利用 AFL++ 的 SAND 功能将覆盖收集与清理分离。 ``` cd src/cufuzz_sand # 构建 sanitizer 包装器 AFL_SAN_NO_INST=1 ../../Tools/AFLplusplus/afl-clang-fast -O2 wrapper_san.c -o wrapper_memcheck.out AFL_SAN_NO_INST=1 ../../Tools/AFLplusplus/afl-clang-fast -DSAN_MODE_INIT -O2 wrapper_san.c -o wrapper_initcheck.out AFL_SAN_NO_INST=1 ../../Tools/AFLplusplus/afl-clang-fast -DSAN_MODE_RACE -O2 wrapper_san.c -o wrapper_racecheck.out AFL_SAN_NO_INST=1 ../../Tools/AFLplusplus/afl-clang-fast -DSAN_MODE_ASAN -O2 wrapper_san.c -o wrapper_asan.out cd ../../targets/sampleApp/ export PATH=/usr/local/cuda/bin/:$PATH export GPU_ARCH=sm_86 # Adjust for your GPU # 构建 vanilla 版本(用于 sanitizer) nvcc sampleApp.cu -I/usr/local/cuda/include/ -O2 --ptxas-options "-v" \ --gpu-architecture=$GPU_ARCH -o sampleApp-vanilla.out # 构建插桩版本(用于模糊测试) nvcc sampleApp.cu -I/usr/local/cuda/include/ -O2 --ptxas-options "-v" \ --gpu-architecture=$GPU_ARCH --compiler-bindir ../../Tools/AFLplusplus/afl-clang-fast++ \ -o sampleApp.out # 运行 cuFuzz ORIGINAL_APP=./sampleApp-vanilla.out \ SANITIZER_PATH=/usr/local/cuda/bin/compute-sanitizer \ SANITIZER_ARG="--tool=memcheck --report-api-errors=no --error-exitcode 99" \ SANITIZER_ARG_RACE="--tool=racecheck --report-api-errors=no --error-exitcode 99" \ SANITIZER_ARG_INIT="--tool=initcheck --report-api-errors=no --error-exitcode 99" \ CUFUZZ_MAP_SIZE=65536 \ AFL_SKIP_CPUFREQ=1 \ AFL_PRELOAD=../../src/cufuzz_cov_nvbit/cufuzz_cov.so \ ../../Tools/AFLplusplus/afl-fuzz -x sample.dict -i in/ -o out/ \ -w ../../src/cufuzz_sand/wrapper_memcheck.out \ -w ../../src/cufuzz_sand/wrapper_racecheck.out \ -w ../../src/cufuzz_sand/wrapper_initcheck.out \ -t 1000000 ./sampleApp.out @@ ``` ![清理器模式示例输出](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/121146e0f9105525.jpg) **不运行清理器**(不推荐):移除 `-w` 参数和 `SANITIZER_*` 变量。 **不运行设备端覆盖**(可选):移除 `AFL_PRELOAD=...cufuzz_cov.so`。 ### 持久模式 在此模式下,cuFuzz 利用 AFL++ 的持久模式,在单个进程内测试多个输入。这通过分摊 CUDA 初始化开销显著提高了吞吐量。 持久模式需要对模糊测试工具源代码进行修改。详情请参阅 [AFL++ 持久模式文档](https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md)。 ``` cd targets/sampleApp/ export PATH=/usr/local/cuda/bin/:$PATH export GPU_ARCH=sm_86 # Adjust for your GPU # 构建持久模式二进制文件 nvcc sampleApp_persistent.cu -I/usr/local/cuda/include/ -O2 --ptxas-options "-v" \ --gpu-architecture=$GPU_ARCH --compiler-bindir ../../Tools/AFLplusplus/afl-clang-fast++ \ -o sampleApp_persistent.out # 以持久模式运行 cuFuzz COV_PERSISTENT=1 \ CUFUZZ_MAP_SIZE=65536 \ AFL_SKIP_CPUFREQ=1 \ AFL_PRELOAD=../../src/cufuzz_cov_nvbit/cufuzz_cov.so \ ./../../Tools/AFLplusplus/afl-fuzz -x sample.dict -i in/ -o out/ \ -t 1000000 ./sampleApp_persistent.out @@ ``` ![持久模式示例输出](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/f880e67d75105526.jpg) 持久模式还支持使用 `src/cufuzz_sand/wrapper_persistent_san.c` 的清理器选项。 ## 故障排除 ### 常见问题 1. **未检测到 GPU**:确保已安装 NVIDIA 驱动程序且 `nvidia-smi` 可正常工作 2. **架构不匹配**:设置 `GPU_ARCH` 以匹配您 GPU 的计算能力 3. **模糊测试速度慢**:启用持久模式以获得更好的吞吐量 ## 贡献 欢迎贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解贡献指南,包括: - 报告问题 - 提交拉取请求 - 开发者来源证书 (DCO) 要求 - 代码风格指南 ## 引用 如果您在研究中使用 cuFuzz,请引用我们的 OOPSLA 2026 论文: ``` @article{cufuzz2026, title={Hunting CUDA Bugs at Scale with cuFuzz}, author={Mohamed Tarek Ibn Ziad and Christos Kozyrakis}, journal={Proceedings of the ACM on Programming Languages}, volume={10}, number={OOPSLA1}, article={123}, month={4}, year={2026}, doi={10.1145/3798231} } ``` ## 许可证 本项目基于 **Apache License 2.0** 许可 - 详见 [LICENSE](LICENSE) 文件。 ``` Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 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 ``` ### 第三方组件 本项目使用以下第三方组件: | 组件 | 许可证 | 许可证文件 | |-----------|---------|--------------| | AFL++ | Apache License 2.0 | [third-party-licenses/LICENSE_from_aflplusplus](third-party-licenses/LICENSE_from_aflplusplus) | | NVBit | NVIDIA EULA | [third-party-licenses/LICENSE_from_nvbit](third-party-licenses/LICENSE_from_nvbit) |
标签:AFL++, CUDA安全, GPU fuzzing, GPU安全, NVBit, SOC工具, UML, Vectored Exception Handling, 二进制安全, 可配置连接, 安全测试, 攻击性安全, 漏洞发现, 程序分析, 网络安全, 覆盖率引导, 请求拦截, 逆向工具, 隐私保护