
यूज़रलैंड CUDA अनुप्रयोगों के लिए GPU-केंद्रित कवरेज-निर्देशित फ़ज़र
इस रिपॉजिटरी में cuFuzz के आर्टिफैक्ट्स शामिल हैं, जो यूज़रलैंड CUDA अनुप्रयोगों के लिए एक GPU-उन्मुख कवरेज-निर्देशित फ़ज़र है। cuFuzz होस्ट-साइड और डिवाइस-साइड कवरेज संग्रह को सैनिटाइज़ेशन के साथ जोड़ता है ताकि CUDA प्रोग्रामों में बग्स को प्रभावी ढंग से खोजा जा सके।

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 VRAM, Compute Capability 8.6) |
| CPU | Intel Xeon Platinum 8362 (64 cores, 2 threads/core) |
अन्य GPU: cuFuzz कंप्यूट क्षमता ≥ 7.0 वाले अन्य NVIDIA GPU पर काम करना चाहिए। GPU_ARCH पर्यावरण चर को तदनुसार समायोजित करें (देखें GPU आर्किटेक्चर कॉन्फ़िगरेशन)।
cuFuzz को आज़माने का सबसे तेज़ तरीका Docker कंटेनर का उपयोग करना है। हमारा Dockerfile आधिकारिक NVIDIA CUDA 12.9 डेवलपमेंट इमेज का उपयोग करता है।
tar -xzvf cufuzz-artifacts.tar.gz
cd cufuzz-artifacts
# Clone AFL++ (required dependency)
git clone https://github.com/AFLplusplus/AFLplusplus.git Tools/AFLplusplus
cd Tools/AFLplusplus
git checkout 9cac7ced05eb9f36c1d0b02ad594b3b09cd3938b
cd ../..
अपने GPU आर्किटेक्चर को निर्दिष्ट करते हुए Docker इमेज बनाएं:
sudo docker build --build-arg GPU_ARCH=<your_arch> -t cufuzz .
GPU आर्किटेक्चर संदर्भ:
पूरी सूची के लिए देखें: https://developer.nvidia.com/cuda-gpus
A40/RTX 3090 के लिए उदाहरण:
sudo docker build --build-arg GPU_ARCH=sm_86 -t cufuzz .
नोट: यह चरण आपकी मशीन और नेटवर्क कनेक्शन के आधार पर कई मिनट ले सकता है।
sudo docker run --rm --gpus all -it -v /:/my_workspace cufuzz bash
Docker कंटेनर चलने के बाद, बिल्ड सत्यापित करें:
root@container:~/cufuzz# ./verify_build.sh
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_ARCH पर्यावरण चर सेट करें (ऊपर आर्किटेक्चर तालिका देखें):
export GPU_ARCH=sm_86 # Change to match your GPU
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 संस्करण 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 @@
| वेरिएबल | विवरण | उदाहरण |
|---|---|---|
AFL_SKIP_CPUFREQ | CPU स्केलिंग पॉलिसी जाँच छोड़ें | AFL_SKIP_CPUFREQ=1 |
AFL_PRELOAD | NVBit कवरेज टूल का पथ | AFL_PRELOAD=/path/to/cufuzz_cov.so |
AFL_SAN_ABSTRACTION वेरिएबल नियंत्रित करता है कि सैनिटाइज़र को कौन से इनपुट दिए जाएँ:
अनुशंसित: AFL_SAN_ABSTRACTION=simplify_trace (डिफ़ॉल्ट)
इस मोड में, cuFuzz डिवाइस-साइड कवरेज का उपयोग करता है और इनपुट के एक उपसमुच्चय (अद्वितीय ट्रेस वाले इनपुट) पर compute sanitizer चलाता है। यह मोड कवरेज संग्रह को सैनिटाइज़ेशन से अलग करने के लिए AFL++ की SAND सुविधा का लाभ उठाता है।
cd src/cufuzz_sand
# Build sanitizer wrappers
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
# Build vanilla version (for sanitizer)
nvcc sampleApp.cu -I/usr/local/cuda/include/ -O2 --ptxas-options "-v" \
--gpu-architecture=$GPU_ARCH -o sampleApp-vanilla.out
# Build instrumented version (for fuzzing)
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
# Run 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 @@

सैनिटाइज़र के बिना चलाना (अनुशंसित नहीं): -w तर्क और SANITIZER_* वेरिएबल हटाएँ।
डिवाइस-साइड कवरेज के बिना चलाना (वैकल्पिक): AFL_PRELOAD=...cufuzz_cov.so हटाएँ।
इस मोड में, cuFuzz AFL++ पर्सिस्टेंट मोड का लाभ उठाता है, जहाँ एक ही प्रक्रिया के भीतर कई इनपुट का परीक्षण किया जाता है। यह CUDA इनिशियलाइज़ेशन ओवरहेड को समायोजित (amortize) करके थ्रूपुट में काफी सुधार करता है।
पर्सिस्टेंट मोड के लिए फ़ज़िंग हार्नेस सोर्स कोड में संशोधन की आवश्यकता होती है। विवरण के लिए देखें AFL++ पर्सिस्टेंट मोड दस्तावेज़।
cd targets/sampleApp/
export PATH=/usr/local/cuda/bin/:$PATH
export GPU_ARCH=sm_86 # Adjust for your GPU
# Build persistent mode binary
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
# Run cuFuzz in persistent mode
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 @@

पर्सिस्टेंट मोड इसका उपयोग करके सैनिटाइज़र विकल्पों का भी समर्थन करता है: src/cufuzz_sand/wrapper_persistent_san.c
nvidia-smi काम करता हैGPU_ARCH को अपने GPU की कंप्यूट क्षमता से मेल खाने के लिए सेट करेंहम योगदान का स्वागत करते हैं! योगदान कैसे करें इसके दिशानिर्देशों के लिए कृपया CONTRIBUTING.md देखें, जिनमें शामिल हैं:
यदि आप अपने शोध में 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 फ़ाइल देखें।
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 |
| NVBit | NVIDIA EULA | third-party-licenses/LICENSE_from_nvbit |
| मेमोरी | 120GB+ RAM अनुशंसित |
| स्टोरेज | Docker इमेज और फ़ज़िंग आउटपुट के लिए 50GB+ खाली स्थान |
| घटक | संस्करण |
|---|
| Ubuntu | 22.04 LTS |
| NVIDIA ड्राइवर | 570.144 या संगत |
| CUDA टूलकिट | 12.9 |
| Docker | 20.10+ (अनुशंसित) |
| nvidia-container-toolkit | --gpus फ़्लैग समर्थन के लिए आवश्यक |
| clang | 14 |
| 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 |
| वेरिएबल | विवरण | उदाहरण |
|---|
CUFUZZ_MAP_SIZE | कवरेज मैप का आकार बाइट्स में | CUFUZZ_MAP_SIZE=65536 |
COV_PERSISTENT | AFL पर्सिस्टेंट मोड समर्थन सक्षम करें (0=नहीं, 1=हाँ) | COV_PERSISTENT=1 |
GPU_ARCH | बिल्ड के लिए लक्षित GPU आर्किटेक्चर | GPU_ARCH=sm_86 |
| वेरिएबल | विवरण | उदाहरण |
|---|
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" |
| मान | विवरण | संवेदनशीलता | प्रदर्शन |
|---|
all_trace | सैनिटाइज़र को सभी इनपुट दें | सर्वोच्च | सबसे धीमा |
simplify_trace | अद्वितीय निष्पादन पथ वाले इनपुट दें | उच्च | संतुलित |
unique_trace | अद्वितीय कवरेज सिग्नेचर वाले इनपुट दें | मध्यम | तेज़ |
coverage_increase | केवल कवरेज वृद्धि का कारण बनने वाले इनपुट दें | न्यूनतम | सबसे तेज़ |