iamdeborah-Q/ai-appsec-pipeline
GitHub: iamdeborah-Q/ai-appsec-pipeline
一个 AI 驱动的应用安全 pipeline,利用 LLM 对 Semgrep SAST 结果做智能分诊以消除误报,并提供强化 Docker 镜像与 CI/CD 安全门禁。
Stars: 0 | Forks: 0
# ai-appsec-pipeline
AI 驱动的 AppSec pipeline:具备基于 LLM 的分诊(Claude)的 Semgrep SAST、EPSS 优先的漏洞报告、强化的 Golden Docker 镜像,以及用于 CI/CD 和 AI 编程代理的安全门。
# ai-appsec-pipeline
一个 AI 驱动的应用安全 pipeline:具备基于 LLM 分诊的 Semgrep SAST
(Claude),一个强化的“golden”Docker 基础镜像,以及
CI/CD 和 AI 辅助开发中安全门的基础。
本项目展示了现代 AppSec 中的两个理念:
1. **AI 驱动的分诊** — 模式匹配扫描器负责寻找_嫌疑对象_;而 LLM
则通过推理判断其_可利用性_,以减少误报噪声。
2. **从一开始就安全** — 提供一个预先强化的 golden 镜像供团队在其基础上 `FROM` 构建,
从而使安全成为默认选项,而不是事后补救。
## 构建内容
### 1. LLM 漏洞分诊 (`scanner/triage.py`)
在目标上运行 Semgrep,然后针对每个发现,将其周围的代码发送给
Claude,由其决定攻击者控制的输入是否真的能够到达
危险操作(真阳性)或不能(假阳性),并提出修复建议。
最终会生成一份排好优先级的 Markdown 报告。
在开发过程中构建并调试的功能:
- **去重** — 合并命中相同文件和行的多条规则。
- **行号锚定** — 代码上下文包含真实行号并
标记出被标记的行,以便模型报告正确的位置。
- **常量检测** — 将隐藏在极长数据常量中的发现
标记为演示数据,从而防止一类假阳性。
- **污点源信号** — 标记用户输入 (`params[...]`)
到达被标记行的发现,用于确定优先级(绝不会默默丢弃)。
在 DSVW (Damn Small Vulnerable Web) 上的结果:**9/9 个发现被正确分诊**
— 8 个真阳性(SQL 注入、命令注入、不安全的反序列化、
SSRF、代码执行)和 1 个被正确识别的假阳性。值得注意的是,在
登录查询中,分诊发现了一个部分缓解的 bug:用户名被净化处理了,
但密码却是直接拼接的 — 这是一个纯模式匹配会遗漏的细节。
示例报告位于 `examples/sample-report.md` 中。
### 2. Golden 镜像 (`golden-image/Dockerfile`)
一个强化的 Python 3.12 基础镜像:
- 固定且精简的基础镜像 (`python:3.12-slim-bookworm`),以确保可重复性并
减小攻击面。
- 已应用 OS 安全补丁;移除了攻击者工具(如 wget)。
- 以 **非 root** 用户身份运行(CIS Docker Benchmark)。
- 安全的环境默认设置;升级了 pip 以修补已知的 pip CVE。
- 使用 Trivy 扫描:在任何严重程度上均有 **0 个可修复漏洞**。
`golden-image/build-and-scan.sh` 会构建镜像,如果存在任何可修复的
HIGH/CRITICAL CVE,则会失败 — 即“安全门”模式。
## 如何运行
前提条件:Python 3.12、Docker、Semgrep、Trivy 以及 Anthropic API 密钥。
```
# 设置
python3 -m venv .venv && source .venv/bin/activate
pip install anthropic
export ANTHROPIC_API_KEY=sk-ant-...
# Triage:扫描目标,然后使用 Claude 进行 triage
semgrep scan --config auto --json --quiet target-apps/DSVW > findings.json
python3 scanner/triage.py # writes report.md
# Golden image:构建 + 扫描
./golden-image/build-and-scan.sh
```
## 关键经验与观察
- **Prompt 校准是一种权衡。** 过于宽松会导致分诊对所有内容都一路绿灯;
过于严格则会漏报真实的 SQL 注入(假阴性,
这是更危险的错误)。Prompt 在不确定时会偏向于进行标记。
- **LLM 的能力仅取决于其上下文的质量。** 一个持续的假阳性结果
被证明是上下文提取的 bug:位于长达 9,800 个字符的常量内的发现
给模型提供了误导性的输入。修复提取器后,判定结果也随之修复。
- **总 CVE 数 ≠ 可操作的 CVE 数。** Golden 镜像显示有 142 个总 CVE,但有 0 个
_可修复的_ CVE — 大多数是无法在上游修复的 Debian 问题。基于可修复的
HIGH/CRITICAL 进行门禁拦截可以避免警报噪声,而这正是本项目致力于解决的问题。
- **扫描器的设计初衷就是过度报告。** 在 DSVW 上的 10 个原始 Semgrep 发现中,有两个
是同一行被不同的规则标记,还有一个是演示数据 — 因此
真正的信号是大约 8 个独立问题。去重和分诊才是将原始
输出转化为可操作列表的关键。
- **即使是官方基础镜像也会带有 CVE。** “安全的” python:slim 镜像
开箱即有 142 个漏洞。强化可以减少它们,但有些
漏洞是继承自上游且无法移除的 — 这就是为什么持续
扫描,而不是一次性强化,才是真正的实践。
- **Dockerfile 中的顺序很重要。** 在切换到非 root 用户_之后_升级 pip
会导致旧的易受攻击的 pip 留在原处(安装在用户的本地
文件夹中)。将升级操作移至切换用户之前可以干净地替换系统
pip — 这提醒我们,如果顺序排错,安全修复可能会在悄无声息中失效。
## 路线图
- EPSS 评分,按真实世界的利用概率对发现进行优先级排序
- CI pipeline:在每个 PR 上进行扫描 + 分诊,发布报告,并对严重问题进行门禁拦截
- Agentic 安全:安全编码规则文件 + pre-commit hook
- 向 AI 编程代理公开扫描工具的 MCP server
## 测试目标
- `DSVW` — 微型的单文件应用,用于验证分诊的正确性
- `PyGoat` — 真实的 Django 应用,用于更加嘈杂的真实世界演示
(两者都被克隆到 `target-apps/` 中,该目录已被 gitignored。)
标签:AI安全, Chat Copilot, CI/CD安全, Docker, Llama, LNA, 安全防御评估, 请求拦截, 逆向工具, 防御框架, 静态代码扫描