课程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(持久化关键信息)如此重要。

开放问题

  1. 如何降低漏洞检测中的假阳性和幻觉?
  2. 如何验证 LLM 生成的补丁是安全的、不引入回归?
  3. LLM 能否解释为什么标记某个漏洞或提出某个修复?
  4. 衡量 LLM AppSec 表现的正确基准是什么?
  5. 如何在 CI/CD 中嵌入 LLM 而不淹没团队?
  6. 如果 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 版):

  1. A01: Broken Access Control — 访问控制失效
  2. A02: Cryptographic Failures — 加密失败
  3. A03: Injection — 注入(SQL/XSS/命令注入)
  4. A04: Insecure Design — 不安全的设计
  5. A05: Security Misconfiguration — 安全配置错误
  6. A06: Vulnerable Components — 有漏洞的组件
  7. A07: Authentication Failures — 认证失败
  8. A08: Software Integrity Failures — 软件完整性失败
  9. A09: Logging & Monitoring Failures — 日志和监控不足
  10. 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)
所有处理器代码 12k LoC (100k tokens) 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 阶段。

思维导图

本周暂未提供思维导图。

知识图谱

本周暂未提供知识图谱。