跳到主要内容

通读笔记 — AI Security Engineering (Early Release)

通读日期:2026-08-27。读的是 library/ai-security-engineering/text/ 下 17 个正文文件(跳过 01 书名页、02 版权页;20 关于作者已读,供总纲第 2 节用)。

书的形态(重要): 这是 O'Reilly Early Release,2026 年夏写成(07-control-decay 第 3 段自述「At the time of writing this in the summer of 2026」),正式版预告 2027-10。目前全书只有第一章「The AI and Security Problem Spaces」+ 15 个小节 + 小结。chapters.json 里 05–19 号那些 fm-* 文件其实全是第一章的小节(spineId 都是 chapter-id5),不是独立章。小结在第 19 号文件末尾(line 21–31)。

结构:

第一章导言(04):老原则管新系统;映射是核心技能
├─ 传统安全理论(05–12)
│ 不可信输入 → 访问控制与边界 → 控制衰减 → 纵深防御
│ → 最小权限(+供应链/slopsquatting) → 监控 → 失败安全 → 规划
├─ AI 与安全理论(13–17)
│ 非确定性 → 提示词保存 → 上下文与记忆 → 先验证再信任 → 工具使用与代理
└─ 方法与快捷方式(18–19)+ 小结(19:21–31)

作者写法: 每节从历史/传统安全讲起,提炼一条「原则」(斜体引语),再落到 AI 系统。写作时现场编的原则条数:8 条传统 + 观察原则。

逐节要点(行号 = text 文件行号)

  • 04 导言:安全是历史学科,Roosevelt 语录(12);least privilege / input validation / defense in depth 是跨代抽象(12);「许多现代安全问题可以重述为有成熟解法的传统安全挑战」(12);AI 带来新漏洞类 + 非确定性让几十种旧漏洞复活(14);「把新问题空间映射到已知类别是最有力的工具」;后果/影响是评估风险的一致标尺,技术只影响怎么修(14)。CIA 三元组声明不覆盖(18)。Rick Howard《Security First Principles》:「原则必须不派生于其他东西,而一切都派生于它」(20);他只给了一条:「三年内把网络事件的实质影响概率降下来」(22),作者认为还能提炼更多。
  • 05 不可信输入:原则「把一切外部输入当潜在恶意,直到在预期语境里验证过」(3);SQL 注入/XSS/命令注入全出于此;源头是质量控制领域的「意外输入」测试,演化成安全扫描乃至模型评测(5);老控制仍适用:输入净化、强类型、参数化查询、输出净化(7);prompt injection = 用户直接影响 LLM 输入(9);不能信用户也不能信 agent(11);这是系统「行为」的一部分,要主动测失效场景(13)。
  • 06 访问控制与边界:AuthN(你是谁:所知/所有/生物特征)vs AuthZ(你能干什么);BIC = Behaviour, Identity, and Control(作者的框);零信任原则「访问决策需要已验证身份 + 显式授权」(3);OWASP Top 10:2003 年 broken access control 排第 2,2025 年排第 1——四十年没解决(5);另有 OWASP Agentic Top 10 但没包含它,作者凭在「某大型 AI 公司带安全工程」的经验认为是永恒问题(7);信任边界 = 身份/行为/权限假设改变的位置;映射信任边界是设计控制的前提(9);中间件统一落地控制(11)。
  • 07 控制衰减:bit rot;2026 夏 AI 辅助的漏洞开发爆发(3);Chris Nickerson 常讲 security control decay;原则「安全控制若不被持续测试、更新、挑战,就会随时间失效」;VPC 防火墙规则完整案例: originally 单微服务→单外部 API,几年间被一点点加宽(更多目的地、更宽 IP 段、更多例外),每笔改动都合理,合计把窄控制变成宽控制——纸面上控制还在,安全价值已没了(5);对策:拆成按服务/主机的明确规则(7);自动化常是 set-and-forget,但万物皆衰减。
  • 08 纵深防御:控制会自发失效,所以要重叠控制;原则「独立控制重叠、单个失效不导致整体失效」(3);军事起源:战略弃地而赢战争;把皇冠明珠藏多层之后,工程化「可接受损失」(5);海军安全司令引文:多层独立冗余防御,任何单层都不被单独依赖(9);Schneier 2000《The Process of Security》:「别依赖单一方案」(11)「没有完美安全这回事,有趣的是这未必是问题」(13);kill chain 各层布控(15);名言「攻击者只需对一次,防守者必须次次对」的推论:「攻击者只需犯一次被防守者抓住的错」;Dan 另著 Adversarial Tradecraft。
  • 09 最小权限 + 供应链:POLP(CrowdStrike 定义);每部件只给完成任务所需的最小权限(7);微服务教训:不搞 PoLP → 攻击面扩大、错误谱变宽、提权链(9);Bhatti 博客:新漏洞一定会出现,好工程缩小爆炸半径(13);对 LLM 工具调用比对微服务更紧,因为:概率性、连正常执行都不可预测(含幻觉)、易受语境操纵和独有注入类(17–21);行业已付学费:agent 删光用户邮件、打挂生产环境(23);对抗框架:MiniScope、AgentScope、NanoClaw(25);供应链:2026 针对依赖安装的攻击增多;slopsquatting = 抢注模型幻觉出来的依赖名(传统 typosquatting 是开发者手滑打错,这次是 AI 幻觉出的名字)(31);对策:审 SBOM、自动扫描、盯新漏洞(33)。
  • 10 监控:暗房间比喻;原则「观察不到的行为 securing 不了;系统需要足够遥测来区分预期行为与异常行为」(3);集中日志(Splunk 定义)→ 数据规范化 = 统一 schema 便于 join(5,7);发烧比喻;预防是愿望,响应是必需;监控是纵深防御的一层(9);打不了补丁时:布满监控(11);CIS Control 8(收集/防篡改/定期分析)与 NIST 800-53 AU 族(13–23);AI 系统要记:错误之外,关键用户交互与跨安全边界的调用(25)。
  • 11 失败安全:失败时不得扩大权限;fail closed;Schneier;agent 死循环烧 token(3);原则「失败不可避免;安全设计考虑它并约束其后果」(5);门的例子:消防门 fail open,金库 fail closed(7);更聪明的做法:失败时备用系统接管(额外验证、人工审批、小门)(9);NIST 800-53「安全失效状态」、800-160「fail in a known secure state」(11–23)。
  • 12 规划:NIST 800-53 里 Planning 自成一个控制族(3);设计文档 = 大楼蓝图;合规前置到规划阶段(5);下文会看 ALARA 的测试结果(7);本文件后半是「AI 与安全理论」总起(11):AI 是概率系统、按模式而非固定逻辑产出;看似有能力的系统未必长期可靠;孤立正确的系统组合后可能出现涌现行为;「假设系统总会有时偏离预期行为,约束其活动使其不构成灾难性风险」。
  • 13 非确定性:同一输入两次输出不同,且这是想要的特性(3);数学原因:采样、浮点、并发(书引 "Defeating Nondeterminism in LLM Inference");temperature 调低也没用——0 度仍非确定(引 "Non-Determinism of 'Deterministic' LLM Settings")(5);核心:token 预测引擎,统计上讨好最多人,不是逻辑上回答问题;「你不是在调一个函数,是在查询一个场;场对我们是黑箱,只能通过 LLM 这个神谕解读」(7);结论:在模型周围造确定性——控制加在精炼/执行模型输出的程序上,不是模型里(9)。
  • 14 提示词保存:prompts 之于 LLM ≈ 源码之于可执行程序;能看意图、约束、控制流;类似 infrastructure-as-code,半可复现、可检视(3);Claude 原生存 .claude/history.jsonl(session ID、时间戳)(5);书里的 git commit 提示词示例(7);共享 prompt = 新攻击面;Claude Code 开新仓库会警告——跑不可信 prompt 和跑不可信代码一样危险(9);prompt 库演化成可复用「skills」→ 当供应链看,上静态扫描(找 key/后门/注入关键词);已有工具 skill-scanner、razin(11);提示词不是安全边界,不该当权限决策者;「security through prompt conditions」≈「security through obscurity」;口诀「security through text, fails under stress」;真控制在外面:程序检查、文件系统权限、网络控制、scoped API(13)。
  • 15 上下文与记忆:窗口=工作记忆,效果取决于结构与相关性而非大小(3);大而乱 → 信噪比差;研究:长 prompt 中段的信息更难取用(注 2 = Lost in the Middle);more context ≠ better context;context engineering 讲结构(5);plan.md 一文件多职:压缩意图、结构化、滤噪、给人机交互留阶段、当稳定锚(7);summarization 是无状态架构里模拟连续性的主要手段,同时是日志+优化+记忆管理;同一文件反复重写时要留备份(7);摘要当 agent 间交接;验证者不应是 LLM 查 LLM,真要也得换模型(9);要总结什么:试了什么/什么成了/什么败了/当前假设/完成了什么/下一步(9);作者自己管记忆比 Claude Code 的自动管理更成功(9);工件驱动工作流常胜过裸聊天和全自主 agent(9);agent 会绕圈、过度承诺、看不见自己的盲区;早期 Manus 长会话丢上下文案例(11);scratchpad 外化推理的研究(注 3 = Show Your Work)(13)。
  • 16 先验证再信任(全书最长小节):里根「Trust but verify」→ 逻辑上应是「Verify then Trust」;零信任(Kindervag):对每个用户/设备/连接持续显式验证(3);AI generated code(未审)vs AI assisted code(人审过/改过) 的显式区分(5);推未审代码给同事/进 PR = 反模式;先搭结构/harness/测试套件(lint、单测、冒烟、集成、系统测试)(5);AI 工具是供应链的一部分;auditability、记录 AI 参与(7);plan 文件 + git 式版本 + 分阶段:每阶段只加一个特性,独立分支评审后落地(7);AI 代码风险:错的库、缺输入验证、弱认证逻辑、违反公司政策(9);可追溯性:出事时能回溯缺陷源于 prompt/生成物/人工修改;commit 注明 AI 参与、附 prompt;代码注释标 AI 摸过哪些函数(类似 StackOverflow 抄代码附链接的好习惯)(11);大组织可用代理网关审计 LLM 用量(11);老工具照用:静态分析、依赖扫描、安全 linter、秘密检测(13);模型天然滞后,常推荐旧版可能带漏洞的库;乐呵呵硬编码凭据——要么给它接好凭据库,要么用扫描器兜底(13);TDD:测试先于代码 = 强约束护栏;测试放在模型够不着的带外(GitHub Actions/外部 CI),防 reward hacking——不能让它自己生成实现又生成让自己通过的验证;测试本身也要审(15);HITL:草拟邮件不用批,改生产库/部署/访问机密/利用活系统/外发通讯要人批;阈值写进策略/markdown/分级控制;更进一步:自己写工具闸门,而不是用通用 agent harness(19);分级自治 tiered autonomy:低风险自主,高风险升级人审;人审还是学习机制,反馈改进 prompt/护栏/策略(21);Claude Code 原生 HITL,auto-edit 尚可(有 git 兜底),auto-exec 危险:作者见过 agent rm -rf 大片文件系统、https 灾难、烧几小时钱、下线服务;逆向工程时 agent 可能在本机执行恶意样本(17)。
  • 17 工具使用与代理:最常见的坑:给 agent 全权放手(从非开发者到硬核 CS 都犯);多巴胺冲昏决策(引 Deep Work,Karl Newport [原文拼写如此,应为 Cal Newport]);我们停在高层浅层工作,真正的深工在 AI 系统之外砌墙(3);分离职责:agentic 部分越小越聚焦越好(KISS;Linux 哲学),单职责→单身份→易套最小权限(7);Anthropic Claudius 案例:多次被占便宜后加了 SeeMoreCash 抽象层管商业决策,用 agent 相互看守(15);作者会更进一步:只准用预认证 API、自助结账硬编码限价(15);微服务 sister principle: Separation of Duties(19);研究者快捷方式:start locked down then pivot(23);代价:权限会累积变难追踪(25);渐进开权限让你理解:每个权限开什么、工具边界在哪、控制是否默认暴露、每个动作被单独评估(27–35);天然 fail-closed(37);ALARA for Agents 论文:As Low as Reasonably Achievable;项目结构里显式定义工具范围/上下文/权限;对比 Anthropic SKILLS 的自由 markdown,ALARA 强制结构(43);npcsh 实现,22 个本地模型(0.6B–35B 参数)、115 个任务(文件操作/网页搜索/脚本/多 agent 协调);结果:严格工具 scoping + 模块化提升性能(小模型尤其),减少上下文过载与协调崩解,限制工具访问同时提升准确与安全,结构化反而改善可扩展性与协作(45–47);项目树:context/agents/tools/composite/workflows/config(49–108);把模型调用与工作流、任务执行分开;别让模型直接 shell,调已知确定性工具(110);真挑战不是缺原则缺框架,是避开容易的路、在带外砌控制(112)。
  • 18 威胁建模与红队:红队自己:别等真攻击者;早期探索失败案例→设计控制/护栏/监控(3);威胁建模 = 对自己的工作唱反调;拉局外人(自己人有无意识偏见)(5);结构化头脑风暴八问(7–23):怎么被攻击/怎么被误用/谁会打/动机/手法/怎么坏/不可用会怎样/被拿 root 会怎样;还要考虑无攻击者的失效——最常见场景是正常使用(25);风险分析(精算学):Risk = Impact × Likelihood;排序(27);Hubbard《How to Measure Anything in Cybersecurity Risk》(27);Shostack《Threat Modeling: Designing for Security》;STRIDE(仿冒/篡改/抵赖/信息泄露/DoS/提权);作者本人偏爱头脑风暴;Benedek Szabó「Pocket Threat Modeling」(29);桌面推演:暴露流程/沟通/工具缺口(31);shift left(33)。
  • 19 致命三件套 + 小结:Simon Willson [原文拼写如此,通行拼法 Simon Willison] 提出;三条件同时成立 = 事故配方:可访问私密数据 + 暴露于不可信内容 + 能对外通信(3);不是必然出事,是威胁建模快捷方式(3);private data:能查内部文档/数据库/个人信息——天真一问「每个能和系统对话的人都该看到它能取的数据吗?」(9);untrusted input:文本/图片/文件/网页任一路径可被塞恶意指令(13);external communication:发消息/调 API/写文件=数据外泄通道;可以简单到「模型回复的聊天界面」(15);小结(21–31):SQL 注入看着就像 prompt 注入;底层动态惊人一致——不可信输入颠覆后端与控制逻辑;broken access control 霸榜 OWASP 二十余年因为它是跨技术的普遍问题;概率性不是待修的 bug,是设计进去的,打破了传统软件工程的假设;查 LLM ≠ 调函数,是查询统计分布,且分布可在供应链多点被操纵;把 prompt 当随手聊天记录是会在调试和事件响应时咬你的错;行业最大的安全失败不是新攻击面,是「因为 demo 惊艳就把王国钥匙交给 agent」——沙箱感觉像摩擦;前沿 agentic 系统现在还是「有点太脱缰」,context 用完就失去主线做出蠢事;底线:难的不是识别新攻击类,是有纪律地把已知的东西用到感觉足够新、新到似乎可以跳过基础功的系统上

错误/存疑记录(书原文的)

  • 「Simon Willson」应为 Simon Willison(致命三件套出自其博客);
  • 「Karl Newport」应为 Cal Newport(《Deep Work》作者);
  • 07 节说「2026 夏漏洞开发因 AI 辅助爆发」是作者观察,无论文支撑;
  • 「in my experience leading security engineering at a major AI development company」(06:7)——两位作者都在 Scale AI,这是自指;
  • 08:15 与 08:11 两处引文标点在清洗文本里可能被截断(「We will discuss in」句尾悬空,line 13 末),原文排版问题,不影响引用主段。

② 类出处候选(已核对本仓库书架)

  • ai-frontier-reference/claude-agent-sdk#03-tools-permissions-hooks.md @a4eaba4a56f9ad1833fca646030a4b160b2a61f9 — can_use_tool 只在权限规则判 "ask" 时触发;PreToolUse 钩子拦每个工具调用(16 章 HITL 对照);
  • ai-protocol-reference/mcp-spec#06-authorization-and-security.md @4e67bdc2f3403a8602f72025b28ac27fe7fd4e44 — OAuth 2.1、人在回路、禁止令牌透传(17 章工具协议对照);
  • ai-protocol-reference/agent-skills-spec#01-spec-format.md @69ef37e9424c0a7ea9dd2293b559e43ec8176379 — SKILL.md = frontmatter + 正文,scripts/ 是 agent 直接跑的可执行代码(14 章 skills 供应链对照);
  • ai-agent-reference/llamafirewall#02-scanners.md @4be64c3a24442b51c76175e6ec67722cc3f5fe38 — PromptGuard 86M BERT 分类器抓提示注入;AlignmentCheck 审计 agent 轨迹(14/16 章扫描器对照);
  • ai-frontier-reference/deepagents#06-skills-memory-rubric.md @25aa2735dabbca6a8c82afae2c7c9f35830d151c — 文件变成行为:AGENTS.md 常驻注入、rubric 外包给独立 grader(15/16 章对照)。