Sharp Edges: Finding Security Footguns in APIs Through a Design-Review Lens

前言

很多安全问题不是某一行实现写错,而是接口把「省事的路径」设成了不安全的路径:可选弱算法、默认值能关掉校验、verify 返回布尔却被忽略。常规代码审查容易盯着逻辑漏洞,却较少系统地问「timeout=0 会怎样」「空 key 会不会直接通过」。

下面介绍 Trail of Bits 维护的 Agent Skill sharp-edges。它面向 API、配置与库接口的误用抗性评估,把「成功坑」(pit of success)当作核心标准:安全用法应当是阻力最小的默认路径,而不是文档里的一句警告。

这是什么

sharp-edges 是 Trail of Bits skills 仓库 中的 Agent Skill,用一句话概括:识别容易让开发者踩坑的 API 设计、危险配置与 footgun 接口。

Skill 元数据中的触发场景包括:footgun、misuse-resistant、secure defaults、API usability、dangerous configuration;适用对象包括 API 设计评审、配置 schema 审计、密码学库 ergonomics,以及是否遵循 secure by default / pit of success 的判断。

与「查实现 bug」的审查不同,官方明确将其定位为设计层分析:实现缺陷、业务逻辑缺陷、性能优化分别应走其他路径,不宜用本 Skill 替代。

在 Trail of Bits 的安全 Skill 系列里,它偏少见的价值是设计审查视角——对写公开 API、配置 schema 或封装密码学能力的作者,比堆 checklist 更有结构性启发。

核心功能

核心原则

Pit of success:安全用法应是阻力最小的路径。若开发者必须精通密码学、细读文档或记住特殊规则才能避免漏洞,API 在设计上已失败。

六类 Sharp Edge

官方 SKILL 将常见 footgun 归纳为六类(下列能力与示例均来自官方文档):

  1. 算法 / 模式选择 footgun
    允许调用方自选 algorithm、cipher、hash_type 等,易选弱算法或遭遇算法混淆(如 JWT 中 alg: none、RS256/HS256 混用)。检测点包括枚举/字符串选原语、安全配置项等。

  2. 危险默认值
    默认不安全,或 0/空串/null 语义不清从而禁用安全能力。典型探针:timeout=0、max_attempts=0、key="" 时行为是什么;默认是否是最安全选项。

  3. 原语 API vs 语义化 API
    用裸 bytes/string 承载密钥、nonce、密文等不同概念,参数可互换且无类型错误;对比 Libsodium 式原语与 Halite 式带类型封装。另含「看起来一样、安全属性不同」的比较(如 Go 中普通 == 与 hmac.Equal)。

  4. 配置悬崖
    单一错误配置即可灾难性失效且无警告:布尔开关关掉全部安全、未校验的字符串配置、危险组合被静默接受、环境变量覆盖安全项、构造函数有安全默认但仍接受不安全入参等。

  5. 静默失败
    安全失败不抛出、返回 True 掩盖错误、解析失败用默认值、验证函数对畸形输入仍「成功」;布尔返回值易被忽略等。

  6. 字符串化的安全语义
    权限、角色、URL、SQL 等用拼接字符串表达,易注入或权限累加误操作;对比枚举/类型安全集合。

应拒绝的「合理化」

官方表格列出常见推诿及应对方向,例如「文档里写了」→ 应让安全选择成为默认或唯一选项;「高级用户需要灵活」→ 提供安全的高层 API、隐藏原语;「只是配置项」→ 校验并拒绝危险组合等。写作审查报告时可对照,避免把 footgun 留给出错率最高的路径。

分析工作流与专用 Agent

完整流程分四阶段:Surface Identification(映射安全相关 API 与开发者选择点)、Edge Case Probing(对每个选择点做边界探针)、Threat Modeling、Validate Findings。

需要独立、端到端跑一遍时,可使用 sharp-edges-analyzer agent;它会按上述四阶段自主执行,并按需读取语言相关 reference。

Skill 声明的可用工具为:Read、Grep、Glob(在仓库内读代码与配置,而非替代动态渗透测试)。

安装与启用

officialskills.sh 上的安装说明 给出的命令如下。将 Skill 从 Trail of Bits monorepo 中按名称 sharp-edges 添加:

npx skills add https://github.com/trailofbits/skills --skill sharp-edges

也可向编码助手提供仓库链接,请求安装对应 Skill:

https://github.com/trailofbits/skills/tree/main/plugins/sharp-edges

具体在 Cursor、Codex CLI、Claude Code 中的菜单或配置文件差异,当前公开资料未逐项列出;以你使用的客户端对「Agent Skills / npx skills」的文档为准。

典型用法

官方 When to Use 与 skills.sh 页面归纳了可复现的触发方式(用自然语言描述任务即可,无需固定咒语):

  • 审查密码学库的 API,是否存在算法选择 footgun(如接受 none、md5)。
  • 评审构造函数:虽有安全默认值,是否仍接受不安全实参(如 otpLifetime=0、hashAlgo=md5)。
  • 审计配置 schema:0 / null / 负值是否静默关闭安全能力。
  • 评估 JWT 或会话 token API 是否把算法等安全决策暴露给不可信输入。
  • 识别调用点上难以区分的时间安全比较与不安全比较。

需要系统化报告时,可明确要求启用 sharp-edges-analyzer,按四阶段工作流输出发现,并对照六类分类与「Rationalizations to Reject」表验证结论是否可落地(默认改安全、校验危险组合、类型化语义等)。

示例探针思路(来自官方 Edge Case Probing):对每个选择点追问边界值语义,与资料中的 OTP lifetime=0、空 key 跳过验签等模式一致。

适用场景与注意

适合:

  • API 或库的设计评审、配置 schema 审计。
  • 认证/授权接口、会话管理、输入校验边界的 ergonomics 评估。
  • 判断新接口是否默认走在「容易误用就不安全」的路径上。

不适合(官方 When NOT to Use):

  • 实现层 bug(用常规范码审查)。
  • 业务逻辑缺陷(用领域分析)。
  • 性能优化(另一类关切)。

注意: 本 Skill 是结构化误用与 footgun 分析,不替代威胁建模工具链的全部环节,也不保证覆盖所有语言运行时细节;深度模式可参考仓库内 references/(如 config-patterns.md),由 agent 按需加载。

结尾

若你的工作包含对外暴露安全相关选择(算法、超时、开关、密钥形态),sharp-edges 把「默认是否最安全、边界值是否关安全、易路径是否等于不安全路径」变成可重复的检查清单,并配有 sharp-edges-analyzer 与四阶段工作流。官方 Skill 与源码路径:

https://github.com/trailofbits/skills/tree/main/plugins/sharp-edges/skills/sharp-edges

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye