Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions PROJECT_ANALYSIS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# 项目分析报告:OSS-Fuzz-Gen

## 1. 项目概览

**项目名称:** oss-fuzz-gen
**目的:** 一个用于自动化生成 C/C++、Java 和 Python 项目模糊测试(Fuzz)目标的框架。它利用大语言模型(LLM)并结合 OSS-Fuzz 基础设施来基准测试和评估生成的目标。
**核心目标:** 通过利用 AI 创建能够发现真实漏洞的有效且高覆盖率的模糊测试目标,从而打破“漏洞挖掘障碍”。

## 2. 架构与设计

该项目设计为一个模块化框架,协调以下组件之间的交互:
1. **Benchmarks(基准)**:需要进行模糊测试的代码库(函数或现有测试)。
2. **LLMs(大语言模型)**:用于生成代码的智能核心。
3. **Agents(代理)**:指导 LLM 的逻辑(如原型生成器、增强器等)。
4. **OSS-Fuzz**:用于构建和运行模糊测试目标的执行环境。

### 高层工作流程
1. **初始化**:`run_all_experiments.py` 读取基准配置。
2. **分发**:实验被分发(可能并行)到 `run_one_experiment.py`。
3. **管道执行**:对每个基准执行代理管道。
* **Prototyper(原型生成器)**:生成初始模糊测试目标。
* **Builder/Fixer(构建/修复器)**:尝试编译目标,如果编译失败,则要求 LLM 修复错误。
* **Evaluator(评估器)**:使用 OSS-Fuzz 基础设施运行目标,以测量覆盖率并检测崩溃。
4. **报告**:汇总结果,将覆盖率与现有的人工编写目标进行比较。

## 3. 目录结构分析

* **`agent/`**:包含不同类型代理的核心逻辑。
* `prototyper.py`:生成初始模糊测试目标原型。
* `enhancer.py`:改进现有目标(例如,增加覆盖率)。
* `analyzer.py`:分析代码或结果。
* `base_agent.py`:代理的抽象基类。
* **`benchmark-sets/`**:定义要进行模糊测试的项目和函数。按语言或实验类型组织(例如 `all`, `c-specific`, `jvm-all`)。YAML 文件定义了具体目标。
* **`llm_toolkit/`**:LLM 提供商的抽象层。
* `models.py`:Vertex AI, OpenAI, Anthropic 模型的封装。
* `prompt_builder.py`:用于从模板构建提示词(Prompt)的工具。
* **`ossfuzz_py/`**:与 OSS-Fuzz 交互的工具,可能处理 Docker 交互和构建过程。
* **`prompts/`**:用于指导 LLM 的基于 XML 的提示词模板。
* **`report/`**:用于从实验结果生成 HTML/JSON 报告的脚本。
* **`tool/`**:外部工具的抽象。
* `container_tool.py`:管理 Docker 容器以进行安全的执行/编译。
* **`run_all_experiments.py`**:批量处理的主要入口点。
* **`run_one_experiment.py`**:单个实验迭代的驱动程序。

## 4. 核心组件

### 4.1. 实验运行器 (`run_all_experiments.py`)
* **并行性**:使用 `multiprocessing.Pool` 并发运行多个实验 (`NUM_EXP`)。
* **基准发现**:可以从目录加载基准 (`--benchmarks-directory`) 或动态生成它们 (`--generate-benchmarks`)。
* **报告**:使用后台进程实时汇总覆盖率增益。

### 4.2. 实验管道 (`run_one_experiment.py`)
* **阶段**:
1. **生成**:调用 `Prototyper`(或 `OnePromptPrototyper`)从 LLM 获取代码。
2. **构建与修复循环**:编译代码。如果失败,错误日志将反馈给 LLM 以请求修复。
3. **评估**:运行编译后的二进制文件以测量覆盖率 (`textcov`) 并检测崩溃。
* **配置**:处理诸如 `NUM_SAMPLES`, `MAX_TOKENS`, 和 `TEMPERATURE` 等参数。

### 4.3. 代理 (`agent/`)
* **Prototyper**:创建新目标的主要代理。它构建的提示词包括:
* 项目上下文(如果启用)。
* 有效模糊测试目标的示例。
* 如何调用待测函数的说明。
* **交互**:某些代理 (`FunctionToolPrototyper`) 似乎使用带工具(如容器工具)的聊天循环来迭代编写和验证代码。

### 4.4. LLM 工具包 (`llm_toolkit/`)
* **模型支持**:
* **Google Vertex AI**: Gemini (Pro, Ultra, 1.5), Code-bison.
* **OpenAI**: GPT-3.5, GPT-4, GPT-4o.
* **Anthropic**: Claude 3 (Haiku, Sonnet, Opus).
* **弹性**:为 API 错误实现了带指数退避的重试逻辑。
* **提示词处理**:管理令牌(Token)限制和截断策略。

## 5. 技术栈与依赖

* **语言**:Python 3.11+
* **云提供商**:Google Cloud Platform (Vertex AI, Cloud Build, Cloud Storage), Azure (用于 OpenAI)。
* **LLM 库**:`google-cloud-aiplatform`, `openai`, `anthropic`.
* **数据处理**:`pandas`, `pydantic`.
* **容器化**:Docker(对于隔离构建和模糊测试执行至关重要)。
* **构建工具**:`clang`, `libFuzzer`(通过 OSS-Fuzz 镜像)。

## 6. 使用与工作流

### 先决条件
* Python 3.11 环境。
* 已安装并运行 Docker。
* GCP 凭据 (`gcloud auth login`) 或 OpenAI API 密钥。

### 运行实验
1. **选择基准**:例如 `benchmark-sets/comparison/tinyxml2.yaml`。
2. **运行命令**:
```bash
./run_all_experiments.py \
--model=vertex_ai_gemini-1-5-chat \
--benchmark-yaml=benchmark-sets/comparison/tinyxml2.yaml \
--work-dir=results/my-experiment
```
3. **输出**:结果保存在 `results/my-experiment` 中,包括源代码、构建日志和覆盖率报告。

### 可视化
* `report.web` 模块可以启动本地服务器以查看结果:
```bash
python -m report.web -r results/my-experiment -o report_output
```

## 7. 关键发现与观察

* **现实世界的影响**:该项目声称在 `cJSON`, `sqlite3`, 和 `openssl` 等主要项目中发现了超过 30 个新的错误/漏洞。
* **反馈循环**:尝试编译、捕获错误并要求 LLM 修复它们的能力(`run_one_experiment.py` 中的 `fix_code`)是生成有效 C++ 代码的关键特性。
* **可扩展性**:`BaseAgent` 和 `LLM` 类使得添加新策略或模型相对容易。
* **容器化**:严重依赖 Docker 确保了可能不安全的生成代码不会危害主机,并在与 OSS-Fuzz 匹配的一致环境中运行。