课程PPT笔记
CS146S 第六周笔记总结:AI Testing and Security
Stanford University · Fall 2025 · 讲师:Mihail Eric 课程网站:themodernsoftware.dev
📅 课程安排
| 日期 | 主题 | 内容 |
|---|---|---|
| Mon 10/27 | AI QA, SAST, DAST, and Beyond | 漏洞检测技术 + AI 新攻击面 + AI 安全新能力(22 slides) |
| Fri 10/31 | 🎤 Guest: Isaac Evans (CEO, Semgrep) | AI 安全工具的实际表现 |
第一讲:AI QA, SAST, DAST, and Beyond(10/27)
核心主题
"当 LLM 在写你大部分代码时,你需要大量的 guardrails 来防止错误。"
这是课程第一次从安全与质量保障角度审视 AI 开发。前五周讲的都是"如何用 AI 更快地写代码",这一讲讲的是**"如何确保 AI 写的代码不会出问题"**。
第一部分:既有威胁面(Existing Threat Landscape)
传统 Web 应用安全威胁——这些在 AI 时代不仅没有消失,反而因为 AI 生成代码可能引入更多这类漏洞:
- SQL 注入(SQL Injection)
- 跨站脚本(XSS)
- 身份认证缺陷(Broken Authentication)
- 不安全的直接对象引用(IDOR)
- 安全配置错误(Security Misconfigurations)
- 敏感数据暴露(Sensitive Data Exposure)
📚 课程关联: 这些是 OWASP Top 10 的核心内容(阅读 5),为后面讨论 AI 能否检测这些问题提供基础。
第二部分:三种漏洞检测技术
| 技术 | 类型 | 时机 | 覆盖范围 |
|---|---|---|---|
| SAST | 白盒(分析源代码/二进制) | SDLC 早期,成本低 | SQL 注入、命令注入、XSS |
| DAST | 黑盒(模拟真实攻击者) | SDLC 全程,误报更少 | SQL 注入、认证缺陷、XSS |
| SCA | 依赖分析(OSS 包深度分析) | 构建/部署时 | 包管理器、IaC、镜像漏洞 |
SAST 技术细节:
- 代码库扫描 + 模式匹配
- 工具示例:Bandit(Python)、Semgrep(多语言)、ESLint + 扩展
DAST 技术细节:
- 输入 fuzzing、会话令牌操作、配置/头部测试、暴力限速测试
SCA 技术细节:
- 分析包元数据、传递性依赖解析、匹配漏洞数据库、二进制/制品扫描
三者互补: 代码 + 运行时 + 依赖 = 全面覆盖
📚 课程关联: SAST/DAST 的"Shift Left"理念(尽早发现问题)与第四周的 TDD 工作流形成呼应——都是在开发早期建立质量保障。
第三部分:AI 带来的新攻击面
① Prompt Injection(提示注入)
向 AI 系统注入隐藏或误导性指令,使其偏离预期行为。
课堂演示了从 AI agent(如 Amp Code)中提取系统 prompt 的实例。
② Tool Misuse(工具滥用)
通过欺骗性 prompt 操纵 agent 滥用其集成工具。
课堂引用了 Amp Code 的配置修改攻击案例(embracethered.com)。
③ Code Attacks(代码攻击)
利用 agent 的代码执行能力获取对执行环境的未授权访问。
④ Intent Breaking(意图破坏)
操纵 agent 的计划,将行为重定向到偏离原始意图。
⑤ Identity Spoofing(身份伪造)
利用被攻破的身份认证,伪装为合法 agent。
📚 课程关联: 这五种攻击向量直接对应阅读 4(Palo Alto Unit 42 报告)。特别值得注意的是,第四周讨论的 Claude Code Hooks 和权限系统(generative command injection detection)正是为了防御这些攻击。
第四部分:AI 带来的安全新能力
"Shift Left 安全比以往任何时候都更容易实现。"
- LLM 可以引入工作流中发现安全问题
- 自动化渗透测试成为可能
第五部分:局限性(关键!)
AI SAST 的假阳性率极高:
- Claude Code / Codex 的假阳性率:50-100%(取决于漏洞类型)
- 对比传统 SAST:也是 50%+
- 所以 AI 并没有显著降低假阳性
非确定性分析问题:
- 相同 prompt 运行多次 → 不同结果
- 你怎么知道是否已捕获所有漏洞?
Context Rot(上下文腐烂):
- 不是所有上下文都是平等的
- 输入 token 越多,性能越不可靠
Compaction(压缩):
- 为了适应上下文窗口而进行的摘要会导致信息丢失
📚 课程关联: Context Rot 直接对应第三周阅读 2("How Long Contexts Fail")的四种失败模式,以及本周阅读 6(Chroma 的研究报告)。这也是为什么第四周讲的 subagent(隔离上下文)和 system-reminders(持久化关键信息)如此重要。
开放问题
- 如何降低漏洞检测中的假阳性和幻觉?
- 如何验证 LLM 生成的补丁是安全的、不引入回归?
- LLM 能否解释为什么标记某个漏洞或提出某个修复?
- 衡量 LLM AppSec 表现的正确基准是什么?
- 如何在 CI/CD 中嵌入 LLM 而不淹没团队?
- 如果 AI 生成的补丁引入了漏洞,谁来负责?
第二讲:Guest Lecture——Isaac Evans(CEO, Semgrep)(10/31)
⚠️ Isaac 的演讲没有公开 Slides。以下基于阅读 3(Semgrep 博客)和搜索结果。
Isaac Evans / Semgrep 背景
- Semgrep:领先的 SAST 工具,被 Gartner Magic Quadrant 认可
- 核心产品:Semgrep Code(SAST)、Supply Chain(SCA)、Secrets(密钥检测)、Assistant(AI 分流和修复建议)
- 推出 "Secure Vibe Coding" 解决方案——专门针对 AI 生成代码的安全问题
Semgrep 的 AI 安全评估(阅读 3 核心内容)
Semgrep 团队用 Claude Code 和 OpenAI Codex 扫描了 11 个大型 Python 开源 Web 应用,产生 400+ 安全发现:
| 指标 | Claude Code (Sonnet 4) | OpenAI Codex (o4-mini) |
|---|---|---|
| 真阳性数 | 46 | 21 |
| 真阳性率 | 14% | 18% |
| 假阳性率 | 86% | 82% |
| 高严重性漏洞 | ~20 | ~20 |
按漏洞类别的表现:
| 类别 | Claude Code TPR | Codex TPR |
|---|---|---|
| IDOR(不安全直接对象引用) | 22% (13/59) | 0% (0/5) |
| SQL 注入 | 5% (2/38) | 0% (0/5) |
| XSS | 16% (12/74) | 0% (0/28) |
| Path Traversal(路径遍历) | 低 | 47% (8/17) |
关键发现:
- AI 理解上下文的能力强(尤其是 IDOR),但跨文件/跨函数的**污点追踪(taint tracking)**能力很弱
- 非确定性是真正的困难: 同一应用、同一 prompt,三次运行分别产出 3、6、11 个发现
- Anthropic 内建的
/security-review命令效果一般("pretty mid")
📚 课程关联: 这些数据直接支持了第一讲 Slide 21 的观点——AI SAST 的假阳性率极高,非确定性是核心挑战。同时也呼应了 Context Rot 问题——输入 token 越多(更大的代码库),性能下降越明显。
🔗 两讲之间的联系
| 维度 | 第一讲(Mihail) | 第二讲(Isaac/Semgrep) |
|---|---|---|
| 视角 | AI 安全的理论框架(攻击面 + 技术 + 局限性) | AI 安全的实际表现(实验数据) |
| 层次 | SAST/DAST/SCA 三种技术全覆盖 | 深入 SAST 的 AI 增强效果 |
| 结论 | "假阳性率极高" | 用数据验证:86% 假阳性率 |
📚 第六周阅读材料速览
| # | 材料 | 核心主题 |
|---|---|---|
| 1 | SAST vs DAST (Splunk) | 三种安全测试方法对比 + RASP |
| 2 | Copilot RCE via Prompt Injection (CVE-2025-53773) | 本周最惊人的阅读 |
| 3 | Finding Vulns with Claude Code & Codex (Semgrep) | AI SAST 的实际评估 |
| 4 | Agentic AI Threats (Palo Alto Unit 42) | Agent 五大攻击向量 |
| 5 | OWASP Top Ten | Web 应用十大安全风险 |
| 6 | Context Rot (Chroma Research) | 长上下文性能退化研究 |
| 7 | O3 Finds CVE-2025-37899 | LLM 发现 Linux 内核 0-day |
🛠️ 第六周作业
Writing Secure AI Code — 编写安全的 AI 生成代码
阅读材料笔记
CS146S 第六周阅读材料笔记总结
Stanford University · Fall 2025 · 讲师:Mihail Eric
阅读材料一览
| # | 材料 | 类型 | 核心主题 | 获取质量 |
|---|---|---|---|---|
| 1 | SAST vs DAST vs RASP (Splunk) | 技术博客 | 安全测试方法全面对比 | ✅ 完整获取 |
| 2 | Copilot RCE via Prompt Injection (CVE-2025-53773) | 安全研究 | AI IDE 的远程代码执行漏洞 | ✅ 完整获取 |
| 3 | Finding Vulns with Claude Code & Codex (Semgrep) | 实验报告 | AI 漏洞发现的实际表现 | ✅ 完整获取 |
| 4 | Agentic AI Threats (Palo Alto Unit 42) | 威胁报告 | Agent 攻击面分类 | ✅ 搜索获取 |
| 5 | OWASP Top Ten | 行业标准 | Web 安全十大风险 | 📋 已知内容 |
| 6 | Context Rot (Chroma Research) | 技术报告 | 长上下文性能退化 | ✅ 完整获取 |
| 7 | O3 Finds CVE-2025-37899 (Sean Heelan) | 漏洞研究 | LLM 发现内核 0-day | ✅ 搜索获取 |
📖 阅读 1:SAST vs DAST vs RASP (Splunk)
来源: Splunk Blog
🔗 课堂关联: 直接对应第一讲 Slides 7-9 的三种检测技术。
核心对比表
| 维度 | SAST(静态) | DAST(动态) |
|---|---|---|
| 测试类型 | 白盒(有源代码访问权限) | 黑盒(无需源代码) |
| SDLC 阶段 | 早期开发阶段 | 部署前或部署后 |
| 检测范围 | SQL 注入、XSS、缓冲区溢出 | 服务器配置错误、DoS、运行时缺陷 |
| 修复成本 | 低(早期发现) | 高(晚期发现) |
| 误报 | 较高(深度分析导致) | 较低(但可能漏检) |
| 语言依赖 | 依赖编程语言和框架 | 与框架无关 |
SAST 方法
- 模式匹配(Pattern Matching): 扫描不安全的编码模式
- 数据流分析(Data Flow Analysis): 追踪不可信输入到敏感操作的路径(→ SQL 注入、缓冲区溢出)
- 控制流分析(Control Flow Analysis): 分析循环和条件结构 → 竞态条件
- 自定义规则(Custom Rules): 标记未净化的 SQL 输入、硬编码密钥等
- 依赖扫描(Dependency Scanning): 第三方库漏洞
- 机器学习模型: 高级工具用 ML 识别未知漏洞
RASP(运行时应用自我保护)
第三种选择: RASP 嵌入到应用运行时环境中,实时分析行为并主动阻止攻击。与 SAST(静态代码)和 DAST(模拟外部攻击)不同,RASP 在运行时操作并主动防御。
最佳实践: 将 SAST + DAST + RASP 组合形成多层安全策略,并自动化集成到 CI/CD 管道中。
📚 课程关联: 这种"多层防御"思路与第四周 StockApp 的"Backstop"原则一致——不依赖单一工具,而是通过多层保障确保质量。
📖 阅读 2:Copilot Remote Code Execution via Prompt Injection (CVE-2025-53773)
来源: Embrace The Red (wunderwuzzi) CVE: CVE-2025-53773(已修复,2025.8 Patch Tuesday)
🔗 课堂关联: 这是本周最重要的阅读——展示了 AI IDE 中 prompt injection 如何导致完整系统接管。直接对应第一讲 Slides 11-18 的新攻击面。
发现:Agent 能修改自己的配置 = 远程代码执行
核心漏洞: GitHub Copilot 在工作区中可以无需用户批准地创建和写入文件。这些修改立即持久化到磁盘。
攻击链
1. Prompt injection 植入源代码文件(或网页/GitHub issue/工具调用响应)
↓
2. 注入指令让 Copilot 向 .vscode/settings.json 添加:
"chat.tools.autoApprove": true
↓
3. GitHub Copilot 立即进入 YOLO 模式!
(所有用户确认被禁用)
↓
4. 攻击者运行终端命令(甚至可以根据操作系统条件执行不同命令)
↓
5. 远程代码执行达成
关键细节
- 适用于 Windows、macOS 和 Linux
- Prompt injection 可以使用不可见指令(invisible text)——用户完全看不到
- 可以将开发者机器加入僵尸网络(ZombAI)
- 可以创建 AI 病毒:感染文件 → 开发者下载交互 → 传播到其他 Git 项目
- 还可以修改
.vscode/tasks.json、添加恶意 MCP 服务器、覆盖其他 agent 配置文件
更深层的威胁
"多个 agent 使用时,还有覆盖其他 agent 配置文件(allow-list bash 命令、添加 MCP 服务器……)的威胁,因为它们通常也在项目文件夹中。"
📚 课程关联:
- 直接解释了为什么第四周 Claude Code 使用 generative command injection detection(不是硬编码规则,而是用专门的 sub-prompt 分析命令是否包含注入)
- 解释了为什么 Claude Code 的权限系统(PreToolUse hooks)如此重要
- 也解释了第四周 Boris 强调的 "Works Everywhere" 设计中 "infinitely hackable" 为何需要配合严格的权限控制
📖 阅读 3:Finding Vulnerabilities with Claude Code and OpenAI Codex (Semgrep)
来源: Semgrep Blog(2025.9) 作者: Romain Gaucher, Vasilii Ermilov, Clint Gibler
🔗 课堂关联: 为第一讲的"局限性"(Slide 21)提供了详细的实验数据支撑。
实验设计
- 工具: Claude Code(v1.0.32, Sonnet 4)和 OpenAI Codex(v0.2.0, o4-mini)
- 目标: 11 个大型开源 Python Web 应用
- 产出: 400+ 安全发现,由安全研究团队人工审核
核心发现
① AI 能找到真正的漏洞
Claude Code 发现 46 个真正的漏洞,包含约 20 个高严重性漏洞。AI 特别擅长 IDOR(不安全的直接对象引用),因为这类漏洞需要理解业务逻辑和上下文,而非纯粹的数据流追踪。
② 但噪音很大
86% 假阳性率意味着每 7 个报告中只有 1 个是真的。在传统注入类漏洞(SQL 注入、XSS、SSRF)上表现尤差。
③ 核心弱点:跨文件污点追踪
AI 擅长理解上下文,但在追踪"用户输入从 source 流向 sink 经过多个文件和函数"时表现很差。这恰恰是传统 SAST 工具(如 Semgrep)通过确定性数据流分析擅长的领域。
④ 非确定性是真正的困难
同一代码库、同一 prompt,三次运行的结果完全不同——这使得"我是否已发现所有漏洞?"这个问题无法回答。
Semgrep 的结论
AI + 传统 SAST 的组合 > 任何单一方法
Semgrep 的方向是将 AI(上下文理解 + 分流 + 修复建议)与确定性分析(规则匹配 + 数据流追踪)结合。
📚 课程关联: 这与课程一直强调的"多层保障"一致。第四周讲的 Tests + CI/CD backstop、第三周的 specs-driven development,都是不同层级的确定性保障,用来弥补 AI 的非确定性。
📖 阅读 4:Agentic AI Threats (Palo Alto Unit 42)
来源: Unit 42(2025.5)
🔗 课堂关联: 直接对应第一讲 Slides 11-18 的五种攻击向量分类。
Agent 五大攻击向量
| 攻击类型 | 描述 | 影响 |
|---|---|---|
| Prompt Injection | 隐藏或误导性指令使 AI 偏离预期行为 | 完全控制 agent 行为 |
| Tool Misuse | 通过欺骗性 prompt 滥用集成工具 | 工具被用于非预期目的 |
| Intent Breaking | 篡改 agent 的规划/推理过程 | Agent 行为偏离原始目标 |
| Identity Spoofing | 利用被攻破的认证伪装为合法 agent | 以假身份访问工具/数据 |
| Code Attacks | 利用代码执行能力获取未授权访问 | 执行环境完全失控 |
实际攻击案例
Code Interpreter 滥用: 攻击者通过 stock agent 的 code interpreter 工具访问 GCP 元数据服务(metadata service),窃取 VM 的 service account access token → 冒充 agent → 升级到攻击云基础设施。
关键缓解措施:
- 强制沙箱隔离 + 网络限制 + 最小权限容器配置
- 使用 DLP 解决方案 + 审计日志 + 密钥管理
- 没有单一缓解措施是充分的 → 需要纵深防御
AI 加速的攻击速度
- 2021 年数据泄露平均时间(MTTE):9 天
- 2024 年 MTTE:2 天(20% 案例不到 1 小时)
- Unit 42 模拟 AI 驱动的勒索攻击:25 分钟(100 倍加速)
📚 课程关联: 这些数据说明了为什么第四周 Claude Code 的权限系统(PreToolUse hooks、generative injection detection)不是"锦上添花"而是核心安全架构。
📖 阅读 5:OWASP Top Ten
来源: OWASP
十大 Web 应用安全风险(2021 版):
- A01: Broken Access Control — 访问控制失效
- A02: Cryptographic Failures — 加密失败
- A03: Injection — 注入(SQL/XSS/命令注入)
- A04: Insecure Design — 不安全的设计
- A05: Security Misconfiguration — 安全配置错误
- A06: Vulnerable Components — 有漏洞的组件
- A07: Authentication Failures — 认证失败
- A08: Software Integrity Failures — 软件完整性失败
- A09: Logging & Monitoring Failures — 日志和监控不足
- A10: SSRF — 服务端请求伪造
📚 课堂关联: OWASP Top 10 是第一讲 Slide 5 "Existing Threat Landscape" 和 Semgrep 评估实验的基准分类体系。
📖 阅读 6:Context Rot (Chroma Research)
来源: Chroma Research(2025.7) 作者: Kelly Hong, Anton Troynikov, Jeff Huber (Chroma)
🔗 课堂关联: 直接对应第一讲 Slide 21 的"Context Rot"局限性讨论,也是第三周"How Long Contexts Fail"的延续和深化。
核心发现
模型不会均匀使用其上下文。输入长度增加时,性能变得越来越不可靠。
测试了 18 个 LLM(包括 GPT-4.1、Claude 4、Gemini 2.5、Qwen3),即使在简单任务上,性能也随输入长度显著退化。
实验设计
在经典 Needle-in-a-Haystack(NIAH)基础上扩展了四个受控实验:
① Needle-Question 相似度
- 当 needle 和 question 的语义相似度降低时,性能随输入长度退化更快
- 短输入时模型对所有相似度级别都表现良好 → 退化不是因为任务难度,而是因为输入长度
② 干扰项的影响
- 干扰项对性能的非均匀影响随输入长度增长而放大
- 不同模型家族对干扰项的反应模式不同
③ Needle-Haystack 相似度
- Haystack 内容本身对性能有影响(之前被认为无关)
④ Haystack 结构
- 打乱 haystack 中文本的逻辑顺序会影响模型性能
- 说明模型对上下文的结构/流畅性有依赖
关键洞见
"现实应用通常涉及更大的复杂性,意味着输入长度的影响在实践中可能更加显著。"
NIAH 基准测试已经"基本解决"的说法是误导性的——它只测试了简单的词汇检索(lexical retrieval),而真实任务需要语义理解、消歧和跨上下文推理。
📚 课程关联:
- 第三周"How Long Contexts Fail"提出了 4 种失败模式(Poisoning/Distraction/Confusion/Clash)
- Context Rot 从实验角度验证了这些理论——性能退化是真实的、可量化的、跨模型的
- 这直接解释了为什么第四周 Claude Code 使用
/clear(清空上下文)、subagent(隔离上下文)、system-reminders(在关键位置重新注入指令)等技术
📖 阅读 7:O3 Finds CVE-2025-37899 (Sean Heelan)
来源: Sean Heelan's Blog(2025.5)+ GitHub Repo
🔗 课堂关联: 展示了 AI 漏洞发现能力的最佳案例——LLM 首次公开发现 Linux 内核 0-day。
背景
Sean Heelan 在审计 Linux ksmbd(内核态 SMB3 协议实现)时,用 o3 API 作为基准测试工具。结果 o3 发现了一个他自己没发现的 0-day 漏洞。
CVE-2025-37899 详情
类型: Use-after-free
位置: SMB2 LOGOFF 命令处理器
根因: 并发连接共享同一 session 时,一个线程释放 sess->user,另一个线程仍在访问它
关键: 理解这个漏洞需要推理并发连接如何共享对象——o3 成功做到了这一点。
实验数据
| 设置 | 代码量 | 100 次运行中发现次数 |
|---|---|---|
| 单个处理器代码 | ~1k LoC | 8/100 (CVE-2025-37778) |
| 所有处理器代码 | 1/100 (CVE-2025-37778) | |
| 所有处理器代码 | ~12k LoC | 发现 0-day CVE-2025-37899 |
模型对比: o3 在 100 次中发现 8 次 vs Claude Sonnet 3.7 发现 3 次 vs Claude 3.5 发现 0 次
成本: 100 次运行(~100k token 版本)约 $116
假阳性: 约 28/100 次报告了不存在的漏洞(但 TP:FP ≈ 1:4.5,可接受)
关键洞见
"随着 o3 的出现,LLM 在代码推理能力上实现了质的飞跃。如果你从事漏洞研究,应该开始密切关注。"
同时也揭示了"双刃剑"效应:如果防御者能用 AI 发现漏洞,攻击者也能。
📚 课程关联: 这与第一讲的"What has changed — Good"(AI 增强 SAST/DAST)和"What has changed — Bad"(新攻击面)形成完美呼应——同一个技术既是防御工具也是攻击工具。
🔗 七篇阅读材料的交叉主题
主题 1:AI 安全的"双刃剑"
| 防御面 | 攻击面 |
|---|---|
| o3 发现 Linux 内核 0-day(阅读 7) | Copilot RCE 通过 prompt injection(阅读 2) |
| Semgrep 发现 46 个真漏洞(阅读 3) | Unit 42 模拟 25 分钟勒索攻击(阅读 4) |
| AI 增强 SAST 的 IDOR 检测(阅读 3) | AI 生成高度个性化钓鱼邮件(阅读 4) |
主题 2:确定性 vs 非确定性
| 确定性保障 | 非确定性能力 |
|---|---|
| SAST 规则匹配(Semgrep) | AI 理解业务上下文发现 IDOR |
| 类型系统 + 编译器检查 | AI 推理并发条件发现 UAF |
| CI/CD 自动化测试 | AI 生成修复补丁 |
最佳策略: 两者结合——用确定性方法覆盖已知模式,用 AI 发现需要推理的新漏洞。
主题 3:Context 持续是核心挑战
第三周:How Long Contexts Fail(4 种失败模式)
↓
第四周:Claude Code 的 system-reminders + subagents(工程解决方案)
↓
第六周:Context Rot(实验验证) + 非确定性 SAST(安全后果)
🔗 课程脉络: 第一周 LLM 基础 → 第二周 Agent + MCP → 第三周 IDE + Specs → 第四周 Agent Manager → 第五周 产品设计 + Terminal → 第六周 安全与测试。课程从"如何用 AI 开发"转向"如何确保 AI 开发的质量与安全"——从 Building 阶段进入 Quality Assurance 阶段。
思维导图
本周暂未提供思维导图。
知识图谱
本周暂未提供知识图谱。