jxn17/vulnerability_benchmark_ops

GitHub: jxn17/vulnerability_benchmark_ops

基于PyTorch和CUDA的漏洞基准测试工具,用于检测和验证机器学习模型中的安全漏洞。

Stars: 0 | Forks: 0

# 高性能机器学习系统工程与漏洞基准测试 ## 目录 1. [概述](#overview) 2. [项目架构](#project-architecture) 3. [项目结构](#project-structure) 4. [Google Colab 故障排除与修复](#google-colab-troubleshooting--fixes) 5. [环境设置](#environment-setup) 6. [构建与运行](#build--run) 7. [预期终端输出](#expected-terminal-output) 8. [AI 协作日志](#ai-collaboration-log) 9. [执行输出(PDF)](#execution-output-pdf) ## 概述 本项目作为机器学习系统的安全测试环境。当工程师编写自定义 C++ 操作以使 ML 模型在 GPU 上运行更快时,有时会引入内存管理缺陷。 为了展示这些缺陷如何发生以及如何检测它们,我们故意在自定义 PyTorch C++ 扩展中注入了一个经典漏洞——堆栈缓冲区溢出(CWE-120)。然后,我们使用 AddressSanitizer(ASAN)构建了一个自动化管道。这个管道证明我们的安全工具可以在将过大的“坏数据”输入系统时成功捕获该错误,同时验证在正常、安全数据的情况下,底层数学运算仍然可以完美执行。 ## 项目架构 本项目分为四个独立的层: ### 1. 核心操作 * `modules/custom_operator.cpp`:包含将我们的自定义矩阵乘法代码连接到 PyTorch 的核心逻辑。关键的是,此文件还包含故意注入的 CWE-120 堆栈缓冲区溢出漏洞。 * `modules/kernel.cu`:一个高度优化的 CUDA 脚本,允许数学运算直接在 GPU 上运行,以实现最大速度和性能。 ### 2. 构建系统与安全集成 * `scripts/build.sh`:在 C++ 代码可用于 Python 之前,必须对其进行编译。此脚本处理构建过程,但它在编译过程中还充当我们的安全执行者,通过在编译过程中将 **AddressSanitizer(ASAN)** 注入二进制文件来执行。 * **ASAN 如何集成:** ASAN 在编译器级别集成。在 `build.sh` 中,我们通过 `CXXFLAGS` 和 `LDFLAGS` 将特定标志(`-fsanitize=address -fno-omit-frame-pointer`)传递给编译器,这指示编译器在内存缓冲区周围放置不可见的“红色区域”。如果我们的程序试图超出其指定的内存限制,ASAN 就像警报系统一样,在真正的安全漏洞发生之前安全地终止程序。 ### 3. 测试套件(两阶段验证) 我们使用两个独立的 Python 脚本来验证系统: * `test_trigger.py`(攻击):向系统输入过大的“坏数据”,以证明 ASAN 警报功能正常,并捕获缓冲区溢出。 * `test_verification.py`(数学测试):向系统输入正常、安全的“好数据”,以验证核心逻辑在数学上与 PyTorch 的原生函数相同,同时测量执行速度。 ### 4. 管道自动化器 * `scripts/run_benchmark.sh`:将一切联系起来的主脚本。它系统地运行构建过程,依次执行两个测试脚本,汇总结果,并输出系统健康状况的最终彩色总结。 ## 项目结构 ``` vulnerability_benchmark_ops/ ├── modules/ │ ├── kernel.cu # CUDA element-wise multiplication kernel │ └── custom_operator.cpp # PyTorch C++ extension (with vuln) ├── scripts/ │ ├── build.sh # ASAN-enabled build script │ └── run_benchmark.sh # Full automation pipeline ├── test_trigger.py # Vulnerability trigger test ├── test_verification.py # Functional & performance verification ├── build/ # (generated) compiled extension artifacts └── README.md # This file ``` ## Google Colab 故障排除与修复 当将此项目迁移到新的 Google Colab 环境以运行时,我们遇到了几个运行时和环境问题。以下是遇到的问题和如何修复它们以实现 100% 通过基准测试的记录。 ### 1. 缺少的构建系统(Ninja) **错误:** PyTorch 抛出 `RuntimeError`,表示需要 Ninja 来编译 C++ 扩展。Colab 默认不包含它。 **修复:** 在管道开始时添加 `pip install ninja -q`。 ### 2. 路径解析错误(PROJECT_ROOT) **错误:** Python JIT 编译器抛出 `FileNotFoundError`,找不到 `custom_operator.cpp`。 **原因:** 在 `build.sh` 中,声明了 `PROJECT_ROOT` 变量,但没有将其导出到环境。内联 Python 脚本回退到默认相对路径,并检查了错误的文件夹。 **修复:** 使用 `sed` 自动将 `PROJECT_ROOT=` 重写为 `export PROJECT_ROOT=`,以便 Python 子进程可以继承正确的目录路径。 ### 3. ASAN 预加载崩溃(LD_PRELOAD) **错误:** 管道编译成功,但 PyTorch 尝试加载 `.so` 文件时立即崩溃,抱怨 ASAN 运行时没有首先加载。 **修复:** 使用 `find /usr/lib -name "libasan.so*"` 动态定位系统的 ASAN 库,并将其导出到 `LD_PRELOAD`,然后在执行任何 PyTorch 代码之前。 ### 4. 60 秒超时(假阳性泄漏) **错误:** `test_verification.py` 不断超时并失败重现性测试。 **原因:** PyTorch 的内部 C++ 代码包含杂乱的分配,这会在 ASAN 中触发数千个假阳性“内存泄漏”警告。这种大量的文本导致子进程挂起并超时。 **修复:** 将 `detect_leaks=0` 追加到 `ASAN_OPTIONS` 环境变量。这指示 ASAN 忽略标准内存泄漏,同时保持关键的堆栈缓冲区溢出检测活动。 ### 5. 吞没的退出代码 **错误:** 管道将步骤 2 标记为“失败”,因为它期望崩溃(非零退出代码),但它收到了退出代码 `0`。 **原因:** 在 `run_benchmark.sh` 中,将 `|| true`附加到触发脚本。在 bash 中,这强制命令返回成功代码(`0`),即使程序猛烈崩溃,也有效地吞没了 ASAN 警报。 **修复:** 移除 `|| true` 并直接捕获退出代码(`trigger_rc=$?`),使管道能够正确地将 ASAN 终止作为成功的漏洞捕获注册。 ## 环境设置 ### 先决条件 | 要求 | 最小版本 | |---|---| | Python | 3.8+ | | PyTorch | 1.10+(具有 C++ 扩展支持) | | GCC / G++ | 7+(具有 AddressSanitizer 支持) | | CUDA Toolkit | 11.0+(用于 kernel.cu;对于 C++ 扩展不是必需的) | | NVIDIA GPU | 可选(VRAM 跟踪使用 CPU 回退) | ### 安装(本地 Linux) ``` # 创建并激活虚拟环境 python3 -m venv venv source venv/bin/activate # 安装 PyTorch(根据需要调整 CUDA 版本) pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 # 验证设置 python3 -c "import torch; print(f'PyTorch {torch.__version__}, CUDA {torch.version.cuda}')" ``` ## 构建 & 运行 ### 选项 A:完整自动化管道(推荐) ``` chmod +x scripts/build.sh scripts/run_benchmark.sh bash scripts/run_benchmark.sh ``` 这将: 1. ✅ 使用 ASAN 标志编译扩展 2. 💥 运行 `test_trigger.py`(期望 ASAN 崩溃——**这是正确的行为**) 3. ✅ 运行 `test_verification.py`(功能 + 性能检查) 4. 📊 打印彩色总结 ### 编译 CUDA 内核(独立) ``` nvcc -O2 -arch=sm_70 -c modules/kernel.cu -o build/kernel.o ``` ## 预期终端输出 ### ASAN 崩溃跟踪(test_trigger.py) ``` ============================================================ test_trigger.py — Vulnerability Trigger ============================================================ [*] PyTorch version : 2.1.0+cu121 [*] CUDA available : True [*] Extension loaded successfully. [*] Adversarial input shape : [1, 512] [*] Tensor byte size : 2048 bytes [*] Stack buffer size : 256 bytes [*] Overflow amount : 1792 bytes [*] Calling linear_projection with oversized tensor... [*] ASAN should detect a stack-buffer-overflow and abort. [DEBUG] linear_projection: input tensor nbytes = 2048, stack buffer size = 256 ================================================================= ==12345==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffd... WRITE of size 2048 at 0x7ffd... thread T0 #0 0x... in __asan_memcpy #1 0x... in linear_projection(at::Tensor, at::Tensor) custom_operator.cpp:47 #2 0x... in pybind11::... ... Address 0x7ffd... is located in stack of thread T0 at offset 288 in frame #0 0x... in linear_projection custom_operator.cpp:33 This frame has 1 object(s): [32, 288) 'buf' (line 40) <== Memory access at offset 288 overflows this variable SUMMARY: AddressSanitizer: stack-buffer-overflow custom_operator.cpp:47 in linear_projection ==12345==ABORTING ``` ### 验证度量矩阵(test_verification.py) ``` ╔═══════════════════════════════════════════════════════════════╗ ║ Verification Metrics Matrix — Structured Metrics Summary ║ ╚═══════════════════════════════════════════════════════════════╝ ──────────────────────────────────────────────────────────── [1/4] Reproducibility Status Measure : Boolean Flag (True/False) Method : ASAN error boundary trigger confirmation ──────────────────────────────────────────────────────────── [*] Spawning test_trigger.py to confirm ASAN error boundary... [*] ASAN stack-buffer-overflow signature detected in stderr. → Result: True ──────────────────────────────────────────────────────────── [2/4] Numerical Error Bound Measure : Maximum Absolute Difference Method : Comparison against torch.nn.functional.linear ──────────────────────────────────────────────────────────── → Max Absolute Difference: 0.000000e+00 ──────────────────────────────────────────────────────────── [3/4] Processing Throughput Measure : Steps Completed per Second Method : 100 consecutive valid forward passes ──────────────────────────────────────────────────────────── → Throughput: 12,345.67 steps/sec ──────────────────────────────────────────────────────────── [4/4] VRAM Tracking Measure : Peak GPU Allocation in Megabytes Method : torch.cuda.max_memory_allocated() ──────────────────────────────────────────────────────────── → Peak Allocation: 0.50 MB ╔═══════════════════════════════════════════════════════════════╗ ║ VERIFICATION METRICS MATRIX — FINAL SUMMARY ║ ╚═══════════════════════════════════════════════════════════════╝ ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ Dimension │ Target Eval Measure │ Value │ Validation Method │ Status ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Reproducibility Status │ Boolean Flag (True/False) │ True │ Malformed input triggers ASAN error boundary │ ✅ PASS Numerical Error Bound │ Max Absolute Difference │ 0.000000e+00 │ Comparison against PyTorch reference layer │ ✅ PASS Processing Throughput │ Steps Completed / Second │ 12,345.67 steps/sec │ Time tracking over 100 consecutive forward passes │ ✅ PASS VRAM Tracking │ Peak GPU Alloc (MB) │ 0.50 MB │ torch.cuda.max_memory_allocated() monitoring │ ✅ PASS ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ ▶ ALL VERIFICATION DIMENSIONS PASSED. ``` ## AI 协作日志 ### 使用工具 | 工具 | 目的 | |---|---| | **Antigravity(Gemini 基础 IDE 代理)** | 端到端代码生成、架构设计和文件创建 | | **PyTorch C++ 扩展 API** | `torch.utils.cpp_extension.load()` 用于 JIT 编译 | | **AddressSanitizer(ASAN)** | 运行时内存安全性漏洞检测 | | **CUDA Toolkit** | GPU 内核开发(`nvcc`、`cuda_runtime.h`、`cuda_fp16.h`) | ### 提供的提示 1. **初始生成提示**:*"生成一个名为 '高性能机器学习系统工程和漏洞基准测试' 的技术评估的完整、提交就绪的项目"* — 指定所有 7 个文件、其要求以及故意漏洞的设计。 ### AI 生成的模块 | 文件 | AI 生成的? | 人工审查 | |---|---|---| | `modules/kernel.cu` | ✅ 是 | 验证了网格/块逻辑和错误宏 | | `modules/custom_operator.cpp` | ✅ 是 | 确认漏洞符合 CWE-120 规范 | | `scripts/build.sh` | ✅ 是 | 验证了 ASAN 标志注入机制 | | `scripts/run_benchmark.sh` | ✅ 是 | 测试了管道的预期崩溃处理 | | `test_trigger.py` | ✅ 是 | 验证了张量大小(2048 > 256 字节) | | `test_verification.py` | ✅ 是 | 与 `torch.nn.functional.linear` 进行了交叉检查 | | `README.md` | ✅ 是 | 审查了完整性和准确性 | ### 验证过程 1. **静态分析**:审查 `custom_operator.cpp` 以确认 `memcpy` 调用没有边界检查,并且对于大于 256 字节输入将溢出。 2. **动态验证**:设计 `test_trigger.py` 使用 `[1, 512]` float32 张量(2048 字节)以 1792 字节溢出——远高于红色区域阈值。 3. **数值正确性**:`test_verification.py` 使用 `torch.testing.assert_close(atol=1e-3)` 将输出与 `torch.nn.functional.linear` 进行比较。 4. **吞吐量基线**:100 次迭代的基准测试,包括预热遍历,以排除 JIT 开销。 5. **VRAM 跟踪**:使用 `torch.cuda.max_memory_allocated()` 并具有优雅的 CPU 回退。 ## 执行输出(PDF) 包含在此存储库中的文件 **`vulnerability_benchmark_ops - Colab.pdf`** 包含了在 Google Colab 中执行完整管道运行的原始终端输出。 ## 许可证 本项目仅用于教育和评估目的。故意注入的漏洞 **不得** 部署到生产系统中。
标签:AddressSanitizer, CUDA, CWE-120, C++扩展, GPU编程, PyTorch, Vectored Exception Handling, 内存管理, 凭据扫描, 安全测试环境, 性能优化, 数学运算, 机器学习系统安全, 栈溢出, 检测绕过, 自动化基准测试