|
| 1 | +# 项目分析报告:OSS-Fuzz-Gen |
| 2 | + |
| 3 | +## 1. 项目概览 |
| 4 | + |
| 5 | +**项目名称:** oss-fuzz-gen |
| 6 | +**目的:** 一个用于自动化生成 C/C++、Java 和 Python 项目模糊测试(Fuzz)目标的框架。它利用大语言模型(LLM)并结合 OSS-Fuzz 基础设施来基准测试和评估生成的目标。 |
| 7 | +**核心目标:** 通过利用 AI 创建能够发现真实漏洞的有效且高覆盖率的模糊测试目标,从而打破“漏洞挖掘障碍”。 |
| 8 | + |
| 9 | +## 2. 架构与设计 |
| 10 | + |
| 11 | +该项目设计为一个模块化框架,协调以下组件之间的交互: |
| 12 | +1. **Benchmarks(基准)**:需要进行模糊测试的代码库(函数或现有测试)。 |
| 13 | +2. **LLMs(大语言模型)**:用于生成代码的智能核心。 |
| 14 | +3. **Agents(代理)**:指导 LLM 的逻辑(如原型生成器、增强器等)。 |
| 15 | +4. **OSS-Fuzz**:用于构建和运行模糊测试目标的执行环境。 |
| 16 | + |
| 17 | +### 高层工作流程 |
| 18 | +1. **初始化**:`run_all_experiments.py` 读取基准配置。 |
| 19 | +2. **分发**:实验被分发(可能并行)到 `run_one_experiment.py`。 |
| 20 | +3. **管道执行**:对每个基准执行代理管道。 |
| 21 | + * **Prototyper(原型生成器)**:生成初始模糊测试目标。 |
| 22 | + * **Builder/Fixer(构建/修复器)**:尝试编译目标,如果编译失败,则要求 LLM 修复错误。 |
| 23 | + * **Evaluator(评估器)**:使用 OSS-Fuzz 基础设施运行目标,以测量覆盖率并检测崩溃。 |
| 24 | +4. **报告**:汇总结果,将覆盖率与现有的人工编写目标进行比较。 |
| 25 | + |
| 26 | +## 3. 目录结构分析 |
| 27 | + |
| 28 | +* **`agent/`**:包含不同类型代理的核心逻辑。 |
| 29 | + * `prototyper.py`:生成初始模糊测试目标原型。 |
| 30 | + * `enhancer.py`:改进现有目标(例如,增加覆盖率)。 |
| 31 | + * `analyzer.py`:分析代码或结果。 |
| 32 | + * `base_agent.py`:代理的抽象基类。 |
| 33 | +* **`benchmark-sets/`**:定义要进行模糊测试的项目和函数。按语言或实验类型组织(例如 `all`, `c-specific`, `jvm-all`)。YAML 文件定义了具体目标。 |
| 34 | +* **`llm_toolkit/`**:LLM 提供商的抽象层。 |
| 35 | + * `models.py`:Vertex AI, OpenAI, Anthropic 模型的封装。 |
| 36 | + * `prompt_builder.py`:用于从模板构建提示词(Prompt)的工具。 |
| 37 | +* **`ossfuzz_py/`**:与 OSS-Fuzz 交互的工具,可能处理 Docker 交互和构建过程。 |
| 38 | +* **`prompts/`**:用于指导 LLM 的基于 XML 的提示词模板。 |
| 39 | +* **`report/`**:用于从实验结果生成 HTML/JSON 报告的脚本。 |
| 40 | +* **`tool/`**:外部工具的抽象。 |
| 41 | + * `container_tool.py`:管理 Docker 容器以进行安全的执行/编译。 |
| 42 | +* **`run_all_experiments.py`**:批量处理的主要入口点。 |
| 43 | +* **`run_one_experiment.py`**:单个实验迭代的驱动程序。 |
| 44 | + |
| 45 | +## 4. 核心组件 |
| 46 | + |
| 47 | +### 4.1. 实验运行器 (`run_all_experiments.py`) |
| 48 | +* **并行性**:使用 `multiprocessing.Pool` 并发运行多个实验 (`NUM_EXP`)。 |
| 49 | +* **基准发现**:可以从目录加载基准 (`--benchmarks-directory`) 或动态生成它们 (`--generate-benchmarks`)。 |
| 50 | +* **报告**:使用后台进程实时汇总覆盖率增益。 |
| 51 | + |
| 52 | +### 4.2. 实验管道 (`run_one_experiment.py`) |
| 53 | +* **阶段**: |
| 54 | + 1. **生成**:调用 `Prototyper`(或 `OnePromptPrototyper`)从 LLM 获取代码。 |
| 55 | + 2. **构建与修复循环**:编译代码。如果失败,错误日志将反馈给 LLM 以请求修复。 |
| 56 | + 3. **评估**:运行编译后的二进制文件以测量覆盖率 (`textcov`) 并检测崩溃。 |
| 57 | +* **配置**:处理诸如 `NUM_SAMPLES`, `MAX_TOKENS`, 和 `TEMPERATURE` 等参数。 |
| 58 | + |
| 59 | +### 4.3. 代理 (`agent/`) |
| 60 | +* **Prototyper**:创建新目标的主要代理。它构建的提示词包括: |
| 61 | + * 项目上下文(如果启用)。 |
| 62 | + * 有效模糊测试目标的示例。 |
| 63 | + * 如何调用待测函数的说明。 |
| 64 | +* **交互**:某些代理 (`FunctionToolPrototyper`) 似乎使用带工具(如容器工具)的聊天循环来迭代编写和验证代码。 |
| 65 | + |
| 66 | +### 4.4. LLM 工具包 (`llm_toolkit/`) |
| 67 | +* **模型支持**: |
| 68 | + * **Google Vertex AI**: Gemini (Pro, Ultra, 1.5), Code-bison. |
| 69 | + * **OpenAI**: GPT-3.5, GPT-4, GPT-4o. |
| 70 | + * **Anthropic**: Claude 3 (Haiku, Sonnet, Opus). |
| 71 | +* **弹性**:为 API 错误实现了带指数退避的重试逻辑。 |
| 72 | +* **提示词处理**:管理令牌(Token)限制和截断策略。 |
| 73 | + |
| 74 | +## 5. 技术栈与依赖 |
| 75 | + |
| 76 | +* **语言**:Python 3.11+ |
| 77 | +* **云提供商**:Google Cloud Platform (Vertex AI, Cloud Build, Cloud Storage), Azure (用于 OpenAI)。 |
| 78 | +* **LLM 库**:`google-cloud-aiplatform`, `openai`, `anthropic`. |
| 79 | +* **数据处理**:`pandas`, `pydantic`. |
| 80 | +* **容器化**:Docker(对于隔离构建和模糊测试执行至关重要)。 |
| 81 | +* **构建工具**:`clang`, `libFuzzer`(通过 OSS-Fuzz 镜像)。 |
| 82 | + |
| 83 | +## 6. 使用与工作流 |
| 84 | + |
| 85 | +### 先决条件 |
| 86 | +* Python 3.11 环境。 |
| 87 | +* 已安装并运行 Docker。 |
| 88 | +* GCP 凭据 (`gcloud auth login`) 或 OpenAI API 密钥。 |
| 89 | + |
| 90 | +### 运行实验 |
| 91 | +1. **选择基准**:例如 `benchmark-sets/comparison/tinyxml2.yaml`。 |
| 92 | +2. **运行命令**: |
| 93 | + ```bash |
| 94 | + ./run_all_experiments.py \ |
| 95 | + --model=vertex_ai_gemini-1-5-chat \ |
| 96 | + --benchmark-yaml=benchmark-sets/comparison/tinyxml2.yaml \ |
| 97 | + --work-dir=results/my-experiment |
| 98 | + ``` |
| 99 | +3. **输出**:结果保存在 `results/my-experiment` 中,包括源代码、构建日志和覆盖率报告。 |
| 100 | + |
| 101 | +### 可视化 |
| 102 | +* `report.web` 模块可以启动本地服务器以查看结果: |
| 103 | + ```bash |
| 104 | + python -m report.web -r results/my-experiment -o report_output |
| 105 | + ``` |
| 106 | + |
| 107 | +## 7. 关键发现与观察 |
| 108 | + |
| 109 | +* **现实世界的影响**:该项目声称在 `cJSON`, `sqlite3`, 和 `openssl` 等主要项目中发现了超过 30 个新的错误/漏洞。 |
| 110 | +* **反馈循环**:尝试编译、捕获错误并要求 LLM 修复它们的能力(`run_one_experiment.py` 中的 `fix_code`)是生成有效 C++ 代码的关键特性。 |
| 111 | +* **可扩展性**:`BaseAgent` 和 `LLM` 类使得添加新策略或模型相对容易。 |
| 112 | +* **容器化**:严重依赖 Docker 确保了可能不安全的生成代码不会危害主机,并在与 OSS-Fuzz 匹配的一致环境中运行。 |
0 commit comments