constant-time-analysis
作者 trailofbitsconstant-time-analysis 是一项安全审计技能,用于在加密代码中的定时侧信道风险变成可利用漏洞之前将其找出来。适合在检查 C、C++、Go、Rust、Swift、Java、Kotlin、PHP、JavaScript、TypeScript、Python 或 Ruby 时,审查是否存在依赖秘密数据的运算、分支、比较以及编译后的输出。
该技能评分为 84/100,说明它很适合需要针对性检查加密代码常量时间行为的目录用户。仓库提供了足够明确的触发条件、语言覆盖范围和分析流程细节,Agent 使用时比通用提示词更少靠猜;不过在少数语言相关路径上,用户仍需留意一定的配置复杂度。
- 对加密定时风险给出了明确的触发指引,包括依赖秘密数据的分支,以及对秘密数据进行除法/取模的情况。
- 操作细节扎实:有按语言划分的参考指南、具体的分析器命令,以及适合 CI 的 JSON 输出。
- 对多种生态都有较强适配性,既覆盖编译型语言,也覆盖 PHP、JavaScript/TypeScript、Python 和 Ruby 的字节码分析。
- SKILL.md 里没有安装命令,用户可能需要自行推导或在技能之外处理环境配置。
- 部分工作流依赖外部工具或扩展,例如 Node.js、VLD 或编译器,这可能增加上手门槛。
constant-time-analysis 技能概览
constant-time-analysis 是一款安全审计技能,用于在加密代码中的计时侧信道风险变成可利用漏洞之前将其找出来。它最适合工程师、审阅者,以及 AI 代理去检查:依赖秘密数据的数学运算、分支、比较或运行时指令,是否可能泄露密钥、token 或其他敏感值。
它要完成的核心工作不是“理解密码学理论”,而是“找出这段代码从哪里开始不再是常数时间”。因此,constant-time-analysis 技能在实现评审、合并前安全检查,以及有人追问某个函数是否能抵御 timing attack 的事件分诊场景中最有用。
它和通用 prompt 的区别在于:它围绕的是编译后的输出和语言特定的分析路径,而不只是源代码扫描。这一点很关键,因为常数时间问题常常会出现在汇编、字节码或 VM 指令层面,即使源代码看起来并没有问题。
constant-time-analysis 适合哪些安全审计场景
当你在审查下面这类代码时,应该使用这个技能:
- 处理 secret、身份验证或密码学原语
- 在 secret 派生值上使用除法、取模、比较或分支
- 需要跨编译产物做验证,而不仅仅是看源代码意图
- 目标语言是 C、C++、Go、Rust、Swift、Java、Kotlin、PHP、JavaScript、TypeScript、Python 或 Ruby
它能发现什么,漏掉什么
constant-time-analysis 对计时泄露模式很强,比如变长时间的除法、依赖 secret 的分支,以及不安全的比较。它对更广泛的密码学设计错误、协议缺陷,或者由网络、缓存、环境噪声带来的泄露就弱得多,除非这些问题本身出现在被分析的代码路径里。
用户为什么要安装它
当你希望有一套可重复的审查流程,能比人工快速扫一遍更早标出 timing 风险时,就应该安装这个技能。如果你只是想对单个片段做一次性判断,普通 prompt 可能已经够用;但如果你需要稳定一致的安全审查行为,这个技能会把流程结构化。
如何使用 constant-time-analysis 技能
正确安装并触发
先通过你的 skill manager 按 constant-time-analysis 的安装路径完成安装,然后在包含目标语言和敏感函数或文件的上下文里运行它。一个好的触发提示会明确写出密码学目标、secret 输入,以及语言/运行时,这样技能才能选对分析路径。
触发示例:
- “Review
src/sign.rsfor constant-time risk. Secret input is the private key scalar; focus on division, branches, and comparisons.” - “Run constant-time-analysis on this PHP password-checking function and tell me whether any opcode-level timing leak is likely.”
提供正确的输入形态
这个技能在你提供以下内容时效果最好:
- 要检查的文件或函数
- 哪些值是 secret
- 攻击者可观察到的行为是什么
- 如果已知,目标语言和运行时版本
更好的输入:
- “Audit
verifyToken()in TypeScript. Token bytes are secret; compare against stored HMAC; check forDiv,Mod, and early-exit comparisons.” - “Analyze this Rust
reduce()routine for secret-dependent division acrossx86_64andarm64.”
先读这些文件
如果你要做安装决策或理解工作流,先看这些文件:
SKILL.md:触发方式、范围和语言选择README.md:支持的语言和输出目标references/compiled.md:C/C++、Go 和 Rustreferences/javascript.md、references/python.md、references/php.md、references/ruby.md、references/swift.md、references/kotlin.md:各 VM 相关规则
如果你只打算快速扫一个参考文件,优先选和你的运行时路径匹配的那个,而不是只看源语言名称。
采用评审工作流,不要只跑一遍
一个实用的 constant-time-analysis 使用流程是:
- 找出真正承载 secret 的函数
- 运行对应的语言指南
- 检查任何除法、取模、比较、分支或可疑的辅助调用
- 在重构之后,或编译器/运行时变化之后重新运行
- 如果你想让结果便于机器校验,请要求输出适合 CI 的格式
这一点很重要,因为源代码层面的修复,到了编译后仍可能变成不安全的指令,尤其是在编译型语言里。
constant-time-analysis 技能常见问题
constant-time-analysis 只适用于密码学吗?
不是。任何会因 secret 数据产生时间差异的代码都适用,只是这类场景通常集中在密码学、认证、密钥处理和 token 验证。如果代码只处理公开数据,这个技能大概率就没必要。
我需要懂汇编或字节码吗?
起步不需要。这个技能的价值就在于它会把你引导到正确的运行时产物和语言特定参考资料。你不必读懂每一条指令,但你需要知道哪个函数或文件涉及安全敏感逻辑。
constant-time-analysis 比普通 prompt 更好吗?
当你需要可重复的安全审查行为时,是的。普通 prompt 也能识别明显风险,但 constant-time-analysis 在仓库级工作里更有用,因为它围绕语言选择、编译输出和具体的泄露模式来组织。
什么时候不该用它?
不要把它用于普通业务逻辑、UI 代码或只处理公开数据的转换。若某个库已经保证常数时间行为,而你只是想问高层 API 的用法、没有自定义的 secret 相关逻辑,也可以跳过它。
如何改进 constant-time-analysis 技能
精确说明 secret 和攻击者模型
要让 constant-time-analysis 产出最有价值的结果,关键是把“什么必须保密”以及“攻击者能观察到什么”说清楚。明确风险是远程 timing、进程本地 timing,还是对编译后代码的检查。没有这些信息,技能可能会过度关注无害分支,或者漏掉真正的约束。
只提供最小的高风险代码路径
给它真正接触 secret 数据的函数,不要把整个仓库都丢进去。如果路径里有 helper,只有当它们会影响分支、算术或比较时才带上。这能减少噪音,让输出更容易落地处理。
要求给出语言特定证据
要想效果最好,就让技能检查对应的运行时产物:
- C/C++、Go、Rust 看 assembly
- JavaScript、TypeScript、Python、Ruby、PHP 看 bytecode
- Kotlin 看 JVM 行为
这样能提升 constant-time-analysis 的实用性,因为 timing 泄露往往是在源代码之下才显现出来的。
每次修复后都重新跑一遍
常见失败模式是改了源代码,就以为泄露已经消失。修改算法、编译器标志、优化级别或运行时版本后,都要重新测试。对于用于安全审计的 constant-time-analysis 来说,第二轮检查往往才是你确认真实安全状态的关键一步。
