跳到主内容

AI 生成代码怎么过安全审计:SAST、依赖检查与人工复核的完整闭环

100%
AI 生成代码怎么过安全审计:SAST、依赖检查与人工复核的完整闭环

AI 生成代码的安全审计不能靠”人眼看一遍”,真正可行的做法是:把 SAST 、依赖漏洞检查、密钥扫描固定成每一次 PR 的必跑项,再给认证、授权、加密、支付这几类文件单独加一道人工门槛。 GitHub 官方给出的数字是,Copilot 驱动的 code scanning autofix 已能为 90% 以上的漏洞类型生成修复建议,其中超过三分之二几乎不用改就能合并——缺的从来不是修复能力,而是把检查钉进流程的那道闸门。

为什么 AI 生成代码需要单独一套审计

  • 模型会复现训练语料里的漏洞模式:字符串拼接的 SQL 、未校验的文件路径、不安全的反序列化,这些在 AI 输出里出现的频率并不比手写低。
  • 产出速度让人工复核失效:一个下午能开十几个 PR,逐行读根本不现实,最后退化成”看起来能跑就合并”。
  • 依赖选择成了新的风险面:编码智能体在 PR 时选到”当时已知有漏洞”的包版本的概率高于人类,因为它的知识快照滞后于 Advisory 数据库。
  • 模式匹配的 SAST 抓不到越权:跨函数数据流、对象级权限缺失这类问题需要上下文判断,静态规则覆盖不到。

三类必须自动化的检查

检查类型抓什么典型工具建议策略
SAST注入、 XSS 、路径遍历、不安全反序列化CodeQL 、 Semgrep每次 PR 必跑,高危阻断
SCA依赖版本已知漏洞、恶意包Dependabot 、 Advisory DB高危阻断,低危自动提 PR
密钥扫描硬编码 token 、私钥、连接串Secret scanning发现即阻断,无例外
IaC / DAST部署清单、可访问服务的运行时问题Checkov 、 DAST 工具视团队成熟度选配

落地:把门槛写进 CI

关键不是装了什么工具,而是合并前必须过闸。以 GitHub Actions 为例,最小可用配置大致是这样:

# .github/workflows/security.yml
name: security-gate
on: [pull_request]
jobs:
  codeql:
    runs-on: ubuntu-latest
    permissions: { security-events: write, contents: read }
    steps:
      - uses: actions/checkout@v4
      - uses: github/codeql-action/init@v3
        with: { languages: javascript-typescript, python }
      - uses: github/codeql-action/analyze@v3
  deps:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm audit --audit-level=high   # 返回非 0 即失败
  secrets:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - uses: gitleaks/gitleaks-action@v2

然后在分支保护里把这三个 job 设为 required status checks 。阈值建议直接写死:CVSS ≥ 9.0 的告警阻断合并,绕过必须走书面例外并留痕;没有例外通道的闸门,最后一定会被人为绕过。

别只信”扫描器装了”这件事。用一条故意写坏的 PR 做一次验证,确认合并真的被拦下来,这才是闸门存在的证据。

人工复核只盯这四类改动

自动化覆盖不到的地方,人力要集中投在下面这几类文件上:

  • 认证、会话、权限判断逻辑
  • 支付与金额计算
  • 密码学相关代码(不要让 AI 自选算法,更不要让它自己实现)
  • 会触碰生产数据的数据迁移脚本

这里还有一条容易被忽略的规则:请求者不能是审阅者。让写提示词的人自己审 AI 产出,或者让一个 AI 去批另一个 AI 的 PR,等于没有审。分支保护要排除 bot/agent 身份,至少要求一个真实 human approval 。

用 AI 审 AI 的正确姿势:先枚举,再审计

GitHub Security Lab 公开的 taskflow 框架给出了一个很值得抄的三段式结构:

  1. 信息收集:识别组件、入口点、 Web 入口点、预期用法,写进数据库供后续步骤复用。
  2. 风险建议(只建议,不审计):让模型基于”这个组件会不会吃不可信输入、是否涉及高权限动作”来提风险类型,并明确禁止它在这一步直接下结论。
  3. 逐条审计:换一份干净上下文,逐个验证上一步的建议,要求给出文件路径 + 行号 + 真实攻击场景,并明确允许得出”这里没有安全问题”。

把”建议”和”审计”拆成两个上下文,是抑制幻觉的关键;允许模型说”没问题”,是避免它硬凑漏洞的关键。我们在把 AI 编程接进 CI 流水线里讲的也是同一个思路——能自动化的交给机器,判断留给流程。

一份可复用的审计提示词骨架
你是安全审计员。针对组件 {component}:
1. 列出它可能接收的不可信输入来源;
2. 列出 3-5 个值得查的漏洞类型,只列不查;
3. 逐条查源码,每条必须给出 file:line 与具体攻击场景;
4. 如果确认不存在漏洞,明确写"未发现安全问题",不要编造。
禁止把"配置不当""系统已被攻陷"作为攻击前提。

三个常见坑

  • 只装一个扫描器:语言或规则集覆盖不到的地方就是盲区,至少 SAST + SCA 双开。
  • 告警当噪音关掉:高危被忽略等于没扫,要么修要么走例外流程,不要静默。
  • 把 autofix 当终审:自动修复同样需要人工复核,尤其是它顺手加进来的新依赖,必须确认在包注册表里存在且无已知漏洞。

延伸阅读


AI 生成的代码是不是比人写的更不安全?
不能一概而论。 AI 在样板代码、参数校验这类地方通常比人更规范,但它在依赖版本选择和跨函数权限判断上更容易出错。结论不是”AI 更危险”,而是”AI 的错误类型不同,需要配套的检查项也不同”。

小型团队也要上完整 SAST 吗?
至少要上免费那一层:CodeQL 对开源仓库免费,依赖检查接 Advisory 数据库,密钥扫描用开源工具即可。真正的成本不在工具费用,而在把 required status check 配好。

扫描告警太多怎么办?
先分级:密钥泄露和高危 CVSS 直接阻断;中低危改成自动生成修复 PR,不阻断合并。同时用”必须给出可复现证据”来过滤上下文类告警,能挤掉大部分噪音。

AI 自动修的漏洞能直接合并吗?
可以,但要看两个点:它是否引入了新依赖(确认存在且无已知漏洞),以及改动是否落在认证、支付、加密这类文件上(这类必须人工过)。

这篇有帮助吗?
云上的幻象
云上的幻象查看主页

七彩云博客,分享 WordPress 建站实战与 AI 工具测评,覆盖服务器运维、站长工具、软件资源与电商运营干货,专注原创实用的主题插件、网站加速与安全优化教程。

942文章4评论

相关文章

评论 (0)

欢迎你,新朋友,感谢参与互动!文明发言,理性交流 · 首次评论将在审核后展示