AI安全扫描实战:用Semgrep+自定义规则搭建代码漏洞自动检测流水线
为什么你需要这个
Hugging Face最近的AI入侵事件(见今天另一篇文章)揭示了一个残酷真相:现代开发流水线中的安全漏洞,无论是AI发现的还是人类利用的,根源都一样——不安全的数据集处理、权限配置过宽、长期有效凭证。
与其等入侵发生后再修补,不如把安全扫描嵌入日常开发流程。这篇教程教你用开源工具Semgrep搭建一套自动化的代码安全检测流水线。
前置条件
– Python 3.9+
– Git仓库(任意语言)
– GitHub Actions(或其他CI工具)的基础知识
– 一个愿意被扫描的项目
Step 1:安装Semgrep
# macOS
brew install semgrep
# Linux
python3 -m pip install semgrep
# 验证安装
semgrep --version
Step 2:编写你的第一条安全规则
Semgrep使用类似代码的语法定义规则。创建文件 `rules/sql-injection.yaml`:
rules:
- id: python-sql-injection
patterns:
- pattern-either:
- pattern: |
cursor.execute("..." % ...)
- pattern: |
cursor.execute(f"...")
message: "检测到潜在的SQL注入风险,请使用参数化查询"
languages: [python]
severity: ERROR
运行:
semgrep --config rules/sql-injection.yaml .
Step 3:添加更多通用安全规则
Semgrep官方提供了丰富的规则库,覆盖常见漏洞类型:
# 一键载入Python安全规则集
semgrep --config "p/python" .
# 扫描硬编码密钥(今天就要加这一条)
semgrep --config "p/secrets" .
# Dockerfile安全检查
semgrep --config "p/dockerfile" .
Step 4:集成到GitHub Actions
创建 `.github/workflows/semgrep.yml`:
name: Semgrep Security Scan
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
semgrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Semgrep
uses: semgrep/semgrep-action@v1
with:
config: >-
p/python
p/secrets
rules/
env:
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
Step 5:自定义业务安全规则
通用规则只能覆盖基础漏洞。对于业务特有的安全问题,需要自定义规则。例如检测内部API密钥泄漏:
rules:
- id: internal-api-key-exposed
patterns:
- pattern-regex: "sk-[a-zA-Z0-9]{32,}"
message: "疑似内部API密钥暴露在代码中"
languages: [generic]
severity: ERROR
常见失败处理
| 问题 | 原因 | 解决 |
|——|——|——|
| Semgrep扫描超时 | 项目太大 | 加 `–max-target-bytes 3MB` 限制 |
| 误报太多 | 规则太宽泛 | 用 `// nosemgrep: rule-id` 注释排除 |
| CI集成报错 | Token未配置 | 在GitHub Settings中创建Secret |
| 扫描结果为空 | 规则不匹配语言 | 检查 `languages` 字段是否与项目一致 |
| 内存不足 | 大文件扫描 | 加 `–max-memory 2048` 限制内存使用 |
进阶:结合AI做智能审计
Semgrep擅长模式匹配。对于需要理解上下文的复杂漏洞(如业务逻辑缺陷、权限绕过),可以结合LLM做第二层审查。思路是:
1. Semgrep先做第一轮快速扫描,筛选出可疑代码片段
2. 将筛选出的片段批量发送给LLM,附加上下文说明:这段代码所在模块的功能、调用链路、权限模型
3. LLM逐段分析是否存在人工审查才容易发现的深层问题(如:这个API虽然检查了用户权限,但没有检查用户所属的租户——跨租户数据泄露风险)
这种”Semgrep粗筛 + LLM精审”的混合模式已经在多个大型项目中验证有效——既能保持规则引擎的高效率,又能获得AI的深度理解能力。成本方面,一个中等规模项目(10万行代码)每月LLM API调用费用约$5-15。
Step 6:实际场景演练
将上述所有步骤整合起来,你可以创建一个完整的CI安全检查流水线。以下是一个真实可运行的GitHub Actions配置,每次PR自动执行三重检查:
name: Full Security Pipeline
on: [pull_request]
jobs:
secrets-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install semgrep
- run: semgrep --config "p/secrets" --error .
code-vuln-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install semgrep
- run: semgrep --config "p/python" --config rules/ --error .
dependency-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install safety
- run: safety check
第一步检查密钥泄露,第二步检查代码漏洞,第三步检查依赖库是否有已知CVE——三层防御,总运行时间通常不超过2分钟。
多语言支持
Semgrep支持30+种编程语言。如果你用JavaScript/TypeScript:
semgrep --config "p/typescript" .
semgrep --config "p/javascript" .
如果是Java项目:
semgrep --config "p/java" .
进阶玩法:将Semgrep的发现结果与你的团队IM(Slack/飞书/企业微信)集成,严重漏洞即时通知,中低风险汇总成日报——让安全问题在进入生产环境之前就被拦截。
**最低成本方案**:即使在个人项目中,只跑 `p/secrets` 规则集,成本为零,5分钟搭建,从今天起再也不会把API密钥提交到仓库里。
🔥 关注LC智趣厅,每周学一招实用的AI时代安全技能。
👇 关注不错过
— END —
LC 智趣厅 · 科技与生活的交点
ihygg.cn