第 6 课 · 现代软件开发者(斯坦福 CS146S)
AI Testing and Security
本篇听书与视频
AI 测试与安全:SAST、DAST、SCA 与智能体的新攻击面
第六周讲安全。讲师的出发点很直接:软件出错会毁掉用户对产品的信任,还会造成巨大的经济损失。当大部分代码由大模型写出来时,就更需要大量的防护措施来拦住这些错误。本周先复习传统的漏洞检测方法,再看智能体带来的新攻击方式,最后讨论大模型用在安全检测上能做什么、做不到什么。周五的嘉宾是 Semgrep 的 CEO Isaac Evans。
学习目标
- 区分 SAST、DAST、SCA 三类检测,知道它们各自覆盖代码、运行时还是依赖。
- 认识针对智能体的五类新攻击方式。
- 了解大模型做安全检测时的主要局限,尤其是误报和结果不稳定。
- 会用 Semgrep 扫描一个项目,并分类处理扫出来的问题。
核心概念
传统威胁依然存在。 课上列出的常见问题包括:SQL 注入、跨站脚本、身份认证缺陷、不安全的直接对象引用、安全配置错误、敏感数据泄露。
三类检测手段,合起来覆盖代码、运行时和依赖。
- SAST(静态应用安全测试):白盒测试,直接分析源代码或二进制文件。它在开发早期就能发现问题,修复成本最低,擅长找 SQL 注入、命令注入、跨站脚本。主要方法是对整个代码库做模式匹配。代表工具有 Bandit、Semgrep,以及 ESLint 加安全插件。
- DAST(动态应用安全测试):黑盒测试,模仿真实攻击者对运行中的应用下手。它在整个开发周期里都能用,误报更少,常用方法有输入模糊测试、篡改会话令牌、检查配置和响应头、测试暴力破解的限流。
- SCA(软件成分分析):深入检查项目用到的开源包,包括包管理文件、基础设施即代码、容器镜像。方法是解析依赖元数据、展开传递依赖,再和漏洞数据库比对。
智能体带来的五类新攻击。
- 提示词注入:用隐藏或误导性的指令让 AI 系统偏离原本的行为。课上举了从编码智能体里套出系统提示词的例子。
- 工具滥用:用欺骗性的提示词操纵智能体,让它滥用自己手上的工具,比如修改系统配置。
- 意图劫持:篡改智能体的计划,把它的行动引向别的目标。
- 身份冒充:利用被攻破的身份认证,冒充合法的智能体。
- 代码攻击:利用智能体能执行代码这一点,拿到执行环境的未授权访问。
好消息:安全左移变得更容易了。 “安全左移”指在开发流程更早的阶段处理安全问题。现在可以直接在工作流里加入大模型来发现问题,也能做自动化渗透测试。
但局限也很明显。 课上提到,用 Claude Code、Codex 做 AI 静态扫描时,误报率依漏洞类型不同在 50% 到 100% 之间,而传统 SAST 的误报率也在 50% 以上。现有的评测基准往往不贴近实际,很难衡量模型的真实水平。结果也不稳定:同一个提示词跑几次,结论可能不同,你没法确认是否真的找全了。再加上“上下文腐烂”问题,即上下文越长,模型对其中信息的利用越差,压缩上下文时还可能丢掉关键细节。
课上留下的开放问题。 怎样降低漏洞检测中的误报和幻觉?怎样确认大模型生成的补丁既安全又没引入新问题?模型能否解释它为什么标记一个漏洞?什么才是合适的应用安全评测基准?怎样把大模型接进 CI/CD 又不让团队被噪音淹没?如果 AI 生成的补丁引入了漏洞,责任由谁承担?
实践步骤
第六周的作业是用 Semgrep 扫描一个带漏洞的 FastAPI + 原生 JavaScript 应用,并修复其中的问题:
- 按 Semgrep 的说明安装,命令行工具或 AppSec 平台任选其一。
- 在作业仓库根目录运行
semgrep ci --subdir week6,同时扫代码规则和密钥规则。扫描范围包括后端 Python、前端 JavaScript、依赖文件,以及配置和环境文件里的密钥。 - 先汇总扫出了哪几类问题(代码、密钥、依赖),记下你判定为误报或噪音、准备忽略的规则,并写明理由。
- 任选 3 个问题,用 AI 编程工具来修。每个问题都要写清:文件和行号、触发的规则、风险是什么、具体改了什么、为什么这样改能消除风险。常见的修法有参数化 SQL、换用更安全的 API、加强加密、清洗写入 DOM 的内容、收紧 CORS、升级依赖。
- 每修一个就重新扫一遍,确认这个问题消失了,也没有引入新的问题;同时确保应用还能正常运行、测试仍然通过。
常见误区
- 把 AI 扫描结果当最终结论。 误报率很高,而且每次结果可能不同。每一条都需要人来分类处理,关键的问题最好用传统工具交叉验证。
- 修完不复扫。 安全补丁本身也可能引入新问题,所以修复后必须重新扫描并跑测试。
- 只防代码,不防智能体。 一旦智能体能读外部内容、能执行命令,提示词注入和工具滥用就成了新的攻击入口,需要用权限隔离和人工确认来防护。
动手练习
在你自己的项目上跑一次 Semgrep,把结果分成三堆:确认是问题、判定为误报、拿不准。再让一个 AI 编程工具对同一个项目做一次安全审查,对比两边的结果:哪些问题只有一方发现了?AI 发现的问题里有多少经不起复核?
要点回顾
代码越多由 AI 来写,安全防护就越要自动化,并且覆盖代码、运行时和依赖三个层面。大模型让安全左移变得更容易,但它的误报和结果不稳定意味着最终判断仍然要靠人。智能体本身也是新的攻击面,权限设计和人工确认环节不能省。
参考来源
- CS146S Fall 2025 课程大纲(Week 6):themodernsoftware.dev/fall2025,核验日期:2026-10-23。
- 讲义幻灯片:AI Testing and Security(Google Slides)。
- 作业 Week 6 — Scan and Fix Vulnerabilities with Semgrep:week6/assignment.md。