
فازر موجَّه لوحدات معالجة الرسوميات (GPU) ويسترشد بالتغطية لتطبيقات CUDA في فضاء المستخدم.
يحتوي هذا المستودع على القطع البرمجية (Artifacts) الخاصة بـ cuFuzz، وهي أداة تشويش موجّهة بالتغطية (Coverage-Guided Fuzzer) تعمل بوحدة معالجة الرسوميات (GPU) لتطبيقات CUDA في فضاء المستخدم. تجمع cuFuzz بين جمع التغطية من جهة المضيف (Host) ومن جهة الجهاز (Device) مع التعقيم (Sanitization) لاكتشاف الأخطاء في برامج 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، قدرة حوسبة 8.6) |
| المعالج (CPU) | Intel Xeon Platinum 8362 (64 نواة، خيطان لكل نواة) |
| الذاكرة | يُوصى بذاكرة RAM بسعة 120GB أو أكثر |
| التخزين | مساحة خالية 50GB+ لصورة Docker ومخرجات التشويش |
وحدات GPU أخرى: يجب أن تعمل cuFuzz على وحدات NVIDIA GPU أخرى بقدرة حوسبة (Compute Capability) ≥ 7.0. اضبط متغير البيئة GPU_ARCH وفقًا لذلك (انظر تكوين بنية GPU).
| المكوّن | الإصدار |
|---|---|
| Ubuntu | 22.04 LTS |
| NVIDIA Driver | 570.144 أو ما يتوافق معه |
| CUDA Toolkit | 12.9 |
| Docker | 20.10+ (موصى به) |
| nvidia-container-toolkit | مطلوب لدعم علم --gpus |
| clang | 14 |
أسرع طريقة لتجربة 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 ../..
قم ببناء صورة Docker مع تحديد بنية GPU الخاصة بك:
sudo docker build --build-arg GPU_ARCH=<your_arch> -t cufuzz .
مرجع بنيات GPU:
| عائلة GPU | البنية (Architecture) | أمثلة |
|---|---|---|
| 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 .
ملاحظة: قد تستغرق هذه الخطوة عدة دقائق اعتمادًا على جهازك واتصال الشبكة.
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_ARCH لوحدة GPU الخاصة بك (انظر جدول البنيات أعلاه):
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 scaling) | AFL_SKIP_CPUFREQ=1 |
AFL_PRELOAD | المسار إلى أداة تغطية NVBit | AFL_PRELOAD=/path/to/cufuzz_cov.so |
| المتغير | الوصف | مثال |
|---|---|---|
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" |
يتحكم المتغير AFL_SAN_ABSTRACTION في المدخلات التي يتم تغذيتها إلى المُعقِّمات:
| القيمة | الوصف | الحساسية | الأداء |
|---|---|---|---|
all_trace | تغذية جميع المدخلات إلى المُعقِّمات | الأعلى | الأبطأ |
simplify_trace | تغذية المدخلات ذات مسارات التنفيذ الفريدة | عالية | متوازن |
unique_trace | تغذية المدخلات ذات توقيعات التغطية الفريدة | متوسطة | أسرع |
coverage_increase | تغذية المدخلات التي تسبب زيادة في التغطية فقط | الأدنى | الأسرع |
موصى به: AFL_SAN_ABSTRACTION=simplify_trace (الافتراضي)