constant-time-testing
作者 trailofbitsconstant-time-testing 是一项实用技能,用于审计密码学代码中的时间侧信道。使用 constant-time-testing 技能检查依赖秘密数据的分支、内存访问模式和微架构行为,然后结合 Security Audit 工作流中的聚焦式 constant-time-testing 指南进行分析。
该技能得分为 76/100,说明它是面向需要在密码学代码中进行 constant-time testing 指导的目录用户的一个可靠候选项。仓库提供了足够真实的工作流内容和领域背景,足以支持安装;但由于缺少配套脚本和安装自动化,用户需要接受一定程度的手动查找和导航。
- 明确面向密码学代码的 constant-time testing,使用场景清晰,触发信号明确。
- 较完整的 SKILL.md 内容包含 13 个 H2、24 个 H3 和代码块,说明它更像真实工作流而非占位文件。
- 没有占位或实验性标记;文档包含 repo/file 引用以及多种工作流/约束信号。
- 没有安装命令、脚本或支持文件,因此代理只能依赖 markdown 指引,而不能通过自动化执行。
- 描述元数据非常简短,用户可能需要阅读正文才能准确判断适配度和限制。
constant-time-testing 技能概览
constant-time-testing 是一项用于审计密码代码是否存在 timing side channels 的实用技能。當你需要检查 secret-dependent 分支、内存访问模式或微架构行为是否可能泄露密钥、nonce 或其他敏感值时,就该使用 constant-time-testing 技能。
谁适合使用 constant-time-testing
这项技能最适合安全审计人员、密码工程师,以及实现层密码学的代码审查者。尤其是在你已经有代码、测试 harness,或者怀疑某条热路径有问题,并且需要一份聚焦的 constant-time-testing 指南,而不是通用的安全编码清单时,它最有用。
它解决的是什么问题
真正要解决的不是“从理论上理解 timing attack”,而是“找出这段代码在 secret 变化时是否表现不同”。constant-time-testing 能帮你把这个问题转化成可重复的审查流程:识别敏感输入、检查它们影响的代码路径,并设计能够暴露泄漏的测试。
它为什么有用
它的核心价值在于足够具体。一个好的 constant-time-testing 技能应该把你引向:
- 最关键的那几段代码,
- 最容易泄漏的比较与查表方式,
- 以及在判断发现是否真实之前需要的证据。
如何使用 constant-time-testing 技能
安装并打开源文件
进行 constant-time-testing 安装时,从 trailofbits/skills 添加该技能,然后先阅读 SKILL.md。如果你是在 agent 工作流中使用它,在写 prompt 之前,也要检查定义行为或约定的相邻仓库文件。
先给出合适的输入形态
这项技能在你提供具体目标时效果最好,而不是给出模糊请求。好的输入包括:
- 要审查的仓库或文件路径,
- 必须保持隐藏的 secret 值或 API 调用,
- 威胁模型,例如本地攻击者、远程 timing 观察者或基准测试噪声,
- 以及语言或平台,因为 C、Rust、assembly 和高层代码的泄漏方式不同。
一个强有力的 prompt 例如: “对 src/crypto.rs 使用 constant-time-testing,检查 verify_tag() 是否会根据 secret bytes 分支。假设攻击者是远程的,并报告可能的泄漏点、测试思路和误报。”
推荐的审查流程
一种实用的 constant-time-testing 使用方式是:
- 识别 secret 以及它们影响的所有代码路径。
- 查找分支、提前返回、表查找和变长时间原语。
- 测试行为是否会随 secret-dependent 输入而变化。
- 区分真实泄漏与编译器、运行时或测量噪声。
- 用具体输入、代码位置和置信度来报告结论。
先读这些,结果会更好
优先阅读 SKILL.md,然后再看仓库里关于 constant-time 检查的示例、测量脚本或策略说明。如果仓库包含多个实现目标,先读最接近你生产栈的那个,这样 constant-time-testing 指南才能和你的环境保持一致。
constant-time-testing 技能常见问题
constant-time-testing 只适用于密码库吗?
不是。只要 secret-dependent timing 可能造成影响,它都适用,包括认证检查、密钥比较、secret-bearing 格式的解析,以及协议逻辑。用于 Security Audit 的 constant-time-testing 场景,比纯密码学范围更广。
使用前一定要先搭好 benchmark 环境吗?
不一定。你可以先做静态审查和有针对性的测试,再在代码路径看起来可疑时补 timing 测量。对很多审计来说,第一步的重点是缩小可能存在泄漏的范围。
它和普通 prompt 有什么不同?
普通 prompt 往往只是泛泛询问 timing attack 的解释。constant-time-testing 更可操作:它的目标是推动你审查一个具体代码库、一个具体 secret 和一个具体威胁模型,因此通常能产出更好的审计结果。
什么情况下不该用它?
如果你需要完整的动态分析基础设施、形式化验证,或者针对特定硬件的认证,不要指望它单独完成任务。它最适合作为聚焦的审查和测试指南,而不是更深层次 assurance 方法的替代品。
如何改进 constant-time-testing 技能
把 secret 和不变量说清楚
最大的质量提升来自明确说明哪些内容必须保密、哪些行为不应变化。告诉模型哪些值是敏感的、哪些操作允许变化、哪些代码路径对安全至关重要。这样能让 constant-time-testing 技能更精准。
提供代码位置和可疑模式
如果你已经怀疑某个函数、分支或查找表,就直接指出来。比如:“检查 verify()、ct_eq() 以及 src/aes.c 中的 S-box lookup。” 这样可以减少猜测,帮助输出聚焦在最高风险的泄漏路径上。
要求证据,不要只要判断
好的结果通常应包含具体测试方案:要比较的输入对、在哪里插桩、什么算泄漏,以及如何解读有噪声的测量。请明确要求这些内容,这样答案就不会只停留在“看起来是 constant-time”或“不是 constant-time”。
第一轮之后继续迭代
把第一次结果拿来收窄范围。如果它指出了某个分支,就继续要求只针对那个函数做更细的 constant-time-testing 使用检查;如果看起来干净,再去查相邻 helper、编译器影响,或仍可能泄漏的平台特定行为。
