Sushmit94/Securify

GitHub: Sushmit94/Securify

一个结合静态分析、微调机器学习分类器和 LLM 推理的源代码漏洞自动化检测框架,旨在比单一方法实现更高精度和更丰富的漏洞解释。

Stars: 0 | Forks: 0

# 基于AI的源代码漏洞自动化检测框架 这是一个混合多层系统,通过结合**静态分析**、**微调的机器学习分类器**和**基于LLM的推理**来检测源代码中的安全漏洞。 ## 目录 1. [概述](#overview) 2. [动机](#motivation) 3. [系统设计](#system-design) 4. [架构层级详解](#architecture-layers-explained) 5. [语言支持策略](#language-support-strategy) 6. [技术栈](#tech-stack) 7. [文件夹结构](#folder-structure) 8. [数据集](#datasets) 9. [设置与安装](#setup--installation) 10. [用法](#usage) 11. [模型训练(微调)](#model-training-fine-tuning) 12. [评估指标](#evaluation-metrics) 13. [API参考](#api-reference) 14. [项目时间线](#project-timeline) 15. [局限性与未来工作](#limitations--future-work) 16. [参考](#references) ## 概述 本项目构建了一个框架,该框架将源代码(单个文件、多个文件或完整的 GitHub repository)作为输入,并生成结构化的漏洞报告,识别以下内容: - **是什么**漏洞(例如:SQL注入、XSS、缓冲区溢出、硬编码凭据、不安全的反序列化) - **在哪里**定位(文件、行号、函数) - 系统对该发现的**置信度** - **为什么**它是一个漏洞(通俗的英文解释) - **如何修复**(建议的修复方案) 与纯基于规则的静态分析器或纯基于LLM的工具不同,该框架结合了三个独立的检测层并协调它们的输出,旨在实现**比任何单一方法更高的精度和更丰富的解释。** ## 动机 现有的方法通常分为两大阵营: - **静态分析器**(Semgrep、Bandit、SonarQube)速度快且具有确定性,但它们是基于规则的——它们会遗漏新型或上下文相关的漏洞,并且经常产生误报。 - **纯基于LLM的工具**很灵活,能够推理上下文,但它们是不确定的,可能会产生幻觉,并且在对大型代码库进行分析时,如果没有事先过滤,运行成本会很高。 本项目结合了这两者,外加一个在标记的漏洞数据上训练的监督式机器学习分类器,以便: - 静态分析提供快速、确定性的首轮检测。 - 机器学习分类器为存在标记数据集的语言添加了一个学习到的、数据驱动的信号。 - LLM推理层解释发现,建议修复方法,过滤误报,并将覆盖范围扩展到没有训练分类器的语言。 ## 系统设计 ``` ┌─────────────────────────┐ │ Code Input (any lang) │ │ file / repo / snippet │ └───────────┬─────────────┘ │ ┌───────────▼─────────────┐ │ Language Detector │ │ (extension + guesslang) │ └───────────┬─────────────┘ │ ┌───────────▼─────────────┐ │ Language-specific │ │ Parser / Router │ └───────────┬─────────────┘ │ ┌───────────────────────┼───────────────────────┐ │ │ │ ┌───────▼────────┐ ┌─────────▼─────────┐ ┌─────────▼─────────┐ │ Layer 1: │ │ Layer 2: │ │ Layer 3: │ │ Static Analysis │ │ ML Classifier │ │ LLM Reasoning │ │ Semgrep ruleset │ │ (runs only if a │ │ (works regardless │ │ per language │ │ trained model │ │ of language) │ │ (30+ languages) │ │ exists for lang) │ │ │ └───────┬────────┘ └─────────┬─────────┘ └─────────┬─────────┘ │ (skipped for unsupported langs) │ └───────────────────────┼────────────────────────┘ │ ┌───────────▼─────────────┐ │ Aggregator / Scorer │ │ merges findings, dedupes│ │ weights confidence based│ │ on which layers ran │ └───────────┬─────────────┘ │ ┌───────────▼─────────────┐ │ Report Generator │ │ (JSON, HTML, PDF) │ └───────────┬─────────────┘ │ ┌───────────▼─────────────┐ │ Web Dashboard (React) │ │ upload, view, export │ └─────────────────────────┘ ``` ### 数据流,逐步说明 1. **输入** — 用户上传文件、粘贴代码片段或提供 repo URL。 2. **语言检测器** — 通过扩展名识别每个文件的语言,对于模棱两可或无扩展名的文件,回退到轻量级分类器(`guesslang`)。 3. **解析器/路由器** — 将代码解析为 AST(如果存在该语言的解析器),并提取用于分析的函数/代码单元;将代码路由到相应的规则集和模型。 4. **第1层(静态分析)** — Semgrep(以及专门用于 Python 的 Bandit)针对特定语言的规则集进行扫描,并返回确定性的、基于模式的发现。 5. **第2层(ML分类器)** — 对于拥有训练模型的语言(最初是 Python、Java、C/C++),每个函数都会被标记化,并传递给微调过的 CodeBERT/GraphCodeBERT 模型,该模型输出一个漏洞概率得分。不支持的语言会跳过此步骤。 6. **第3层(LLM推理)** — 代码连同第1层和第2层的发现一起,通过结构化的 prompt 经由 API 发送给 LLM。LLM 确认/驳回发现,对其进行解释,并建议修复方法。此层适用于任何语言。 7. **聚合器** — 跨层合并并去重发现结果,分配最终的置信度得分(根据该语言实际运行的层级进行不同的加权),并按严重程度对结果进行排名。 8. **报告生成器** — 生成结构化的 JSON 报告以及人类可读的 HTML/PDF 版本。 9. **Dashboard** — React 前端,用于上传代码、浏览发现和导出报告。 ## 架构层级详解 ### 第1层 — 静态分析 - **工具:** Semgrep(主要工具,支持 30+ 种语言)、Bandit(专用于 Python,更深入的基于 AST 的检查) - **输出:** 确定性的发现,包含规则 ID、文件、行号、严重程度、CWE 参考 - **角色:** 快速的第一轮扫描,捕获众所周知的漏洞模式 ### 第2层 — ML分类器(微调) - **基础模型:** CodeBERT 或 GraphCodeBERT(HuggingFace,约 125M 参数) - **微调数据来源:** Devign、Big-Vul 和/或 SARD/Juliet Test Suite(带有标记的漏洞/安全函数对) - **输出:** 每个函数的漏洞概率得分 (0–1) - **角色:** 学习到的、数据驱动的信号,能够捕获静态规则遗漏的模式;仅适用于具有充足标记训练数据的语言 - **注意:** 这是唯一涉及实际模型训练(微调)的层;第1层和第3层按原样使用现有的工具/模型 ### 第3层 — LLM推理 - **模型:** 通过 API 访问的现有大型语言模型(例如:Claude 或 GPT-4)— 未经过训练或微调 - **输入:** 代码片段 + 第1层的发现 + 第2层的得分(如果可用) - **输出:** 包含已确认/驳回的发现、通俗易懂的英文解释和建议修复方案的结构化 JSON - **角色:** 上下文推理、误报过滤,以及无论是否有 ML/静态工具支持都能覆盖任何语言 ### 聚合器 - 对来自不同层中指向同一行/函数的重叠发现进行去重 - 根据**实际贡献的层级**对置信度进行加权 — 例如,由所有三层确认的发现,其权重要高于仅来自静态分析的发现 - 生成每个文件的最终漏洞排名列表 ## 语言支持策略 由于第2层实际上无法针对每种语言进行训练(除了少数几种语言外,几乎没有现成的标记数据集),其覆盖范围被有意进行了分级: | 级别 | 语言 | 启用的层级 | |---|---|---| | 第1级 (深度覆盖) | Python, Java, C/C++ | 静态分析 + ML分类器 + LLM推理 | | 第2级 (广泛覆盖) | JavaScript/TypeScript, Go, PHP, Ruby, C#, Kotlin, Rust 和其他受 Semgrep 支持的语言 | 静态分析 + LLM推理 | | 第3级 (回退) | 任何其他语言 | 仅 LLM推理(无静态规则集或训练模型) | 这种分级方法在报告输出中都有透明的记录——该框架从不会针对未训练过的语言声称具有基于机器学习的置信度。 ## 技术栈 | 组件 | 技术 | 用途 | |---|---|---| | 静态分析 | Semgrep, Bandit | 基于规则的漏洞检测 | | ML框架 | PyTorch, HuggingFace Transformers | 微调 CodeBERT/GraphCodeBERT | | 数据集处理 | Pandas, HuggingFace Datasets | 加载/预处理 Devign, Big-Vul | | LLM集成 | Claude API / OpenAI API | 推理、解释、修复建议 | | 后端 | Python, FastAPI | 协调编排、REST API | | 语言检测 | 文件扩展名映射 + `guesslang` | 将代码路由到正确的 pipeline | | 代码解析 | `ast` (Python)、`esprima`/`@babel/parser` (JS)、`javalang` (Java)、`pycparser`/`clang` 绑定 (C/C++) | 提取用于分析的函数 | | 前端 | React, Tailwind CSS | Dashboard UI | | 数据库 | PostgreSQL | 扫描历史、发现结果存储 | | 报告生成 | WeasyPrint / ReportLab | PDF 导出 | | 实验追踪 | Weights & Biases (可选) | 记录微调运行 | | 容器化 | Docker, Docker Compose | 可复现部署 | | 测试 | Pytest | 单元和集成测试 | ## 文件夹结构 ``` vuln-detection-framework/ ├── README.md ├── requirements.txt ├── docker-compose.yml ├── .env.example │ ├── data/ │ ├── raw/ │ │ ├── python/ │ │ ├── java/ │ │ └── cpp/ │ ├── processed/ │ └── dataset_loader.py │ ├── language_support/ │ ├── detector.py # detects language of input file │ ├── language_registry.py # maps language -> {ruleset, ml_model?, parser} │ └── parsers/ │ ├── python_parser.py │ ├── js_parser.py │ ├── java_parser.py │ ├── cpp_parser.py │ └── generic_fallback.py │ ├── ml_model/ │ ├── train.py # fine-tuning script │ ├── evaluate.py # precision/recall/F1 on test set │ ├── model_config.py │ ├── inference.py │ └── checkpoints/ │ ├── python_model/ │ ├── java_model/ │ └── cpp_model/ │ ├── static_analysis/ │ ├── semgrep_runner.py │ ├── bandit_runner.py │ └── rulesets/ │ ├── python.yml │ ├── javascript.yml │ ├── java.yml │ ├── cpp.yml │ └── go.yml │ ├── llm_reasoning/ │ ├── prompt_templates.py │ ├── llm_client.py │ └── response_parser.py │ ├── aggregator/ │ ├── merge_findings.py │ └── scorer.py │ ├── backend/ │ ├── main.py │ ├── routes/ │ │ ├── scan.py │ │ └── report.py │ ├── models/ │ └── services/ │ └── pipeline.py │ ├── frontend/ │ ├── src/ │ │ ├── components/ │ │ ├── pages/ │ │ └── App.jsx │ └── package.json │ ├── reports/ │ └── generator.py │ ├── tests/ │ ├── test_static_analysis.py │ ├── test_ml_model.py │ ├── test_llm_reasoning.py │ └── test_pipeline.py │ └── docs/ ├── system_design.md ├── language_coverage.md ├── dataset_notes.md └── evaluation_results.md ``` ## 数据集 | 数据集 | 语言 | 描述 | |---|---|---| | **Devign** | C/C++ | 来自真实开源项目的函数级别的漏洞/非漏洞标签 | | **Big-Vul** | C/C++ | 带有 CVE 映射的大规模漏洞数据集 | | **SARD / Juliet Test Suite** | C/C++, Java | 涵盖多种 CWE 类别的合成测试用例 | | **CVEfixes** | 多种 | 将真实世界的 CVE 修复提交映射到漏洞/已修补代码对 | 这些用于为第1级语言微调第2层 ML 分类器。 ## 设置与安装 ``` # 克隆仓库 git clone cd vuln-detection-framework # 创建虚拟环境 python -m venv venv source venv/bin/activate # or venv\Scripts\activate on Windows # 安装依赖 pip install -r requirements.txt # 安装 frontend 依赖 cd frontend && npm install && cd .. # 设置环境变量 cp .env.example .env # 将你的 LLM API key 和 database URL 添加到 .env # 使用 Docker Compose 运行(推荐) docker-compose up --build ``` ## 用法 ``` # 对单个文件运行扫描 python backend/services/pipeline.py --input path/to/file.py # 对完整仓库运行扫描 python backend/services/pipeline.py --repo https://github.com/user/repo # 启动 API 服务器 uvicorn backend.main:app --reload # 启动 frontend dashboard cd frontend && npm start ``` 示例 JSON 输出: ``` { "file": "app/routes/login.py", "language": "python", "findings": [ { "line": 42, "type": "SQL Injection", "cwe": "CWE-89", "confidence": 0.93, "sources": ["static_analysis", "ml_classifier", "llm_reasoning"], "explanation": "User input is concatenated directly into a SQL query without parameterization.", "suggested_fix": "Use parameterized queries via the database driver's placeholder syntax." } ] } ``` ## 模型训练(微调) 只有第2层涉及实际训练。高层步骤: 1. 下载并预处理 Devign/Big-Vul/SARD 数据集 (`data/dataset_loader.py`) 2. 使用 CodeBERT tokenizer 对函数进行标记化 3. 使用 `ml_model/train.py` 微调 CodeBERT 以进行二分类(有漏洞 / 无漏洞) 4. 使用 Weights & Biases 追踪实验(loss、accuracy、F1) 5. 在预留的测试集上进行评估 (`ml_model/evaluate.py`) 6. 将每种语言的检查点保存在 `ml_model/checkpoints/` 下 针对每种第1级语言(Python、Java、C/C++)单独重复此操作,因为每种语言都需要其自己微调的检查点。 ## 评估指标 该框架使用以下指标进行评估: - **Precision, Recall, F1-score** — 按语言、按漏洞类别 - **误报率** — LLM 推理层过滤静态分析输出之前与之后对比 - **层级贡献分析** — 每层独立捕获了多少真阳性 - **延迟** — 每个文件/repo 大小的平均扫描时间 结果记录在 `docs/evaluation_results.md` 中。 ## API参考 | 端点 | 方法 | 描述 | |---|---|---| | `/scan/file` | POST | 上传单个文件进行扫描 | | `/scan/repo` | POST | 提交 GitHub repo URL 进行扫描 | | `/report/{scan_id}` | GET | 检索已完成扫描的发现结果 | | `/report/{scan_id}/pdf` | GET | 下载 PDF 报告 | | `/history` | GET | 列出过去的扫描 | ## 项目时间线 | 阶段 | 周数 | 交付物 | |---|---|---| | 文献回顾 + 数据集选择 | 1–2 | 确定数据集选择、repo 框架 | | 静态分析层 | 3–4 | 可工作的 Semgrep/Bandit 集成 | | ML分类器微调 | 5–8 | 训练好的 CodeBERT 检查点(第1级语言) | | LLM推理层 | 9–10 | Prompt 设计、结构化输出解析 | | 聚合器 + 评分 | 11–12 | 合并、加权的发现 pipeline | | 后端 + 前端 | 13–14 | 可工作的 API 和 dashboard | | 评估 + 撰写报告 | 15+ | 指标、最终报告、文档 | ## 局限性与未来工作 - ML 分类器的覆盖范围仅限于具有充足标记数据的语言;扩展到更多语言需要新的标记数据集或迁移学习方法。 - LLM 推理层依赖于外部 API —— 在大规模应用时会引入成本和延迟方面的考虑。 - 目前的设计分析的是函数级别的上下文;整个程序/跨文件的数据流漏洞(例如:跨文件的污点追踪)是未来可能的扩展方向。 - 未来的工作可以探索微调单一的多语言分类器(例如,使用 UniXcoder 或 CodeT5+),以减少对特定语言检查点的需求。 ## 参考 - Zhou et al., "Devign: Effective Vulnerability Identification by Learning Comprehensive Program Semantics via Graph Neural Networks" - Fan et al., "A C/C++ Code Vulnerability Dataset with Code Changes and CVE Summaries" (Big-Vul) - Feng et al., "CodeBERT: A Pre-Trained Model for Programming and Natural Languages" - Guo et al., "GraphCodeBERT: Pre-training Code Representations with Data Flow" - Semgrep documentation: https://semgrep.dev/docs/ - NIST SARD / Juliet Test Suite: https://samate.nist.gov/SARD/
标签:DLL 劫持, 人工智能安全, 代码安全审计, 凭据扫描, 合规性, 大语言模型, 机器学习分类器, 测试用例, 请求拦截, 逆向工具, 错误基检测, 静态代码分析