AI代码安全 — 四个代理捕捉AI生成代码中SAST遗漏的问题。基于GitLab Duo Agent平台构建。
AI 代码安全 — 捕获 SAST 在 AI 生成代码中遗漏的问题 基于 GitLab Duo Agent 平台
40-62% 的 AI 生成代码存在安全漏洞。 传统 SAST 能捕获 CVE。而我们能捕获 SAST 遗漏的问题 — 提示注入、LLM 输出执行、不安全的 ML 反序列化。
AI 加速了代码生成,但也带来了新的安全瓶颈:
| 问题 | 影响 |
|---|---|
| 安全审查使 MR 堵塞数小时甚至数天 | 每位团队成员每周浪费 7 小时 |
| AI 使合规管理更加困难 | 70% 的团队报告此问题 |
| 部署后才发现的合规问题 | 76% 的组织 |
| 传统 SAST 工具遗漏 AI 特定风险 | 提示注入、LLM 输出到执行、不安全的 ML 反序列化 |
| 40-62% 的 AI 生成代码存在漏洞 | 现有工具无法检测 AI 特定的威胁模式 |
来源:GitLab 2025 全球 DevSecOps 报告
AgentFlow Auditor — 四个 AI 代理,能够捕获传统 SAST 在 AI 生成代码中遗漏的安全风险。包含 41 条检测规则,涵盖 LLM 提示注入、输出到执行、不安全反序列化、SQL 注入、SSRF 和路径遍历。发布可扫描报告、生成修复补丁、追踪风险漂移。只需一个 @提及 即可触发所有操作。
Developer opens MR │ ▼ @duo-agentflow-auditor review this MR │ ▼ ┌───────────────────────────────────────────────────────┐ │ │ │ ┌─────────────┐ ┌──────────────────┐ │ │ │ Scanner │──────▶│ Reporter │ │ │ │ Agent │ │ Agent │ │ │ │ │ │ │ │ │ │ Read diffs │ │ Grade risk │ │ │ │ Match 34 │ │ Risk heatmap │ │ │ │ rules │ │ Post MR comment │ │ │ │ Score risk │ │ Create issue │ │ │ └─────────────┘ └────────┬─────────┘ │ │ │ │ │ ┌───────┴────────┐ │ │ │ SAFE? │ │ │ │ ├─ Yes ──────────────┐ │ │ │ └─ No ───┐ │ │ │ │ └───────────┘ │ │ │ │ │ │ │ │ │ ┌─────────────┐ ┌────────▼───────┘┐ │ │ │ │ Metrics │◀──────│ Fixer │ │ │ │ │ Agent │ │ Agent │ │ │ │ │ │◀──────────────────────────────┘ │ │ │ Baseline │ │ Confidence-scored│ │ │ │ Cross-MR │ │ patches │ │ │ │ Green │ │ Fix branch + MR │ │ │ │ Posture │ │ │ │ │ └─────────────┘ └─────────────────┘ │ │ │ │ GitLab Duo Agent Platform (ambient) │ │ │ │ ┌───────────────────────────────────────────┐ │ │ │ External SAST Agent (CI/CD container) │ │ │ │ bandit + semgrep + custom rules merge │ │ │ └───────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────┘
### 智能体名录
| 智能体 | 角色 | 工具 | 关键能力 |
|:------|:-----|:------|:---------------|
| **Scanner** | 分析MR差异 | 10个工具 | 41条规则(26条正则 + 15条Semgrep),AI特定威胁检测,漏洞集成 |
| **Reporter** | 发布审计报告 | 7个工具 | 10秒内可扫描(等级 + 热力图 + 前5项),漏洞链接,DANGER时自动创建Issue |
| **Fixer** | 生成代码修复 | 8个工具 | 置信度评分补丁(高/中/低),自动创建修复MR |
| **Metrics** | 跟踪风险基线 | 6个工具 | 跨MR学习,团队态势,基线漂移,能源/碳追踪 |
| **SAST Scanner** | 外部SAST | CI/CD | 运行bandit + semgrep,通过Python脚本合并自定义规则 |
---
## 功能特性
<table>
<tr>
<td width="50%">
### 安全扫描
- **41条检测规则** — 26条正则 + 15条Semgrep自定义规则
- **8个风险类别** — 从破坏性命令到提示注入
- **AI特定检测** — LLM提示注入、输出到执行、不安全反序列化
- **风险评分** — 每个发现0-100分(严重性 × 上下文 × 类别)
- **等级系统** — 安全 / 警告 / 危险
</td>
<td width="50%">
### 自动化
- **一键触发激活** — `@提及` 或指定审查者
- **条件路由** — 安全扫描跳过修复器,节约Token
- **结构化MR评论** — 风险表、修复建议、可折叠详情
- **自动修复生成** — 在新分支上生成代码补丁
- **自动创建Issue** — 危险等级时自动创建
</td>
</tr>
<tr>
<td width="50%">
### 基线追踪
- **风险漂移检测** — 比较随时间变化的扫描结果
- **趋势分析** — 改善 / 恶化 / 稳定
- **修复采纳率** — 追踪采纳了多少建议
- **历史日志** — 每次扫描追加JSONL
</td>
<td width="50%">
### 绿色指标
- **Token追踪** — 每次扫描的使用量
- **能量估算** — 每次扫描的kWh
- **碳足迹** — kg CO2及现实类比
- **优化建议** — 缩小扫描范围、缓存基线
</td>
</tr>
</table>
---
## 检测类别
### Semgrep自定义规则
涵盖6个类别的15条生产级Semgrep规则:
| 规则 | 类别 | 严重性 | 检测项 |
|:-----|:---------|:---------|:----------|
| `llm-prompt-injection` | AI安全 | WARNING | 用户输入流入LLM API调用 |
| `llm-output-code-exec` | AI安全 | ERROR | LLM输出传递给exec/eval |
| `unsafe-deserialization-ml` | AI安全 | WARNING | 对不可信模型使用pickle.load、torch.load |
| `sql-injection` | Web安全 | ERROR | 字符串格式的SQL查询(f-string、.format、concat) |
| `path-traversal` | Web安全 | ERROR | 文件路径操作中的用户输入(../遍历) |
| `ssrf-request-forgery` | Web安全 | ERROR | HTTP请求中的用户控制URL |
| `open-redirect` | Web安全 | WARNING | 重定向函数中的用户输入 |
| `missing-input-validation` | Web安全 | WARNING | 未经验证的请求数据直接使用 |
| `dangerous-eval-exec` | Python | WARNING | 使用动态内容的eval/exec |
| `subprocess-shell-true` | Python | WARNING | 使用shell=True的子进程 |
| `dangerous-os-system` | Python | WARNING | os.system/popen(已弃用) |
| `insecure-random-python` | 密码学 | WARNING | 使用random模块生成安全令牌 |
| `insecure-random-javascript` | 密码学 | WARNING | 使用Math.random()生成安全令牌 |
| `hardcoded-credentials` | 机密 | WARNING | 硬编码密码、API密钥、令牌 |
| `insecure-http` | 网络 | INFO | HTTP URL(可自动修复为HTTPS) |
### 正则检测类别
| 类别 | 严重性 | 示例模式 |
|:---------|:---------|:-----------------|
| 破坏性命令 | 🚨 Danger | `rm -rf /`, `mkfs`, `dd to disk` |
| 凭证泄露 | 🚨 Danger | `curl` posting secrets to external URLs |
| 提示注入(严重) | 🚨 Danger | "Ignore previous instructions", role overrides |
| 混淆执行 | 🚨 Danger | `base64 -d \| bash`, remote pipe to shell |
| Shell执行 | ⚠️ Warning | `shell=True`, `eval()`, `exec()`, `os.system()` |
| 网络调用 | ⚠️ Warning | `curl`/`wget`/`fetch` to external URLs |
| 不安全传输 | ⚠️ Warning | `http://` where `https://` should be used |
| 硬编码凭证 | ⚠️ Warning | Passwords, API keys, tokens in source |
### 风险评分公式```
score = severity_weight + category_weight + executable_context + actionable + risk_modifier
= clamp(0, 100)
severity_weight: danger=50, warning=25
category_weight: destructive-command=15, credential-exfil=15, prompt-injection=10, ...
executable_context: +20 if file is .sh/.py/.js/.ts
actionable: +15 if executable AND not in trusted domain allowlist
risk_modifier: per-rule adjustment (0-15)
| 等级 | 条件 | 操作 |
|---|---|---|
| 🚨 危险 | max_risk >= 90 OR high_risk_findings >= 3 | 阻止合并 + 创建问题 |
| ⚠️ 警告 | max_risk >= 70 OR high_risk_findings >= 1 | 合并前审查 |
| ✅ 安全 | 无有意义的风险信号 | 可安全合并 |