恒定时间分析技能Skill constant-time-analysis

此技能用于检测加密代码中的时序侧信道漏洞,通过分析多种编程语言(如C、Java、Python等)的代码,识别可能泄露秘密数据的操作,如除法运算、秘密依赖分支等,帮助开发者和安全专家确保密码学代码的恒定时间执行,防止时序攻击。关键词包括:恒定时间分析、时序攻击、侧信道安全、密码学代码审计、加密漏洞检测、时序侧信道、代码安全、网络安全工具。

密码学 0 次安装 0 次浏览 更新于 3/14/2026

名称:恒定时间分析 描述:检测加密代码中的时序侧信道漏洞。适用于实现或审查密码学代码时,遇到对秘密数据进行除法运算、秘密依赖分支或恒定时间编程问题的情况,支持C、C++、Go、Rust、Swift、Java、Kotlin、C#、PHP、JavaScript、TypeScript、Python或Ruby语言。

恒定时间分析

分析加密代码,以检测通过执行时间变化泄露秘密数据的操作。

何时使用

用户编写密码学代码?──是──> 使用此技能
         │
         否
         │
         v
用户询问时序攻击?──是──> 使用此技能
         │
         否
         │
         v
代码处理秘密密钥/令牌?──是──> 使用此技能
         │
         否
         │
         v
跳过此技能

具体触发条件:

  • 用户实现签名、加密或密钥派生
  • 代码包含对秘密派生值使用 /% 运算符
  • 用户提及“恒定时间”、“时序攻击”、“侧信道”、“KyberSlash”
  • 审查名为 signverifyencryptdecryptderive_key 的函数

何时不使用

  • 非密码学代码(业务逻辑、用户界面等)
  • 公开数据处理,时序泄露无关紧要
  • 不处理秘密、密钥或认证令牌的代码
  • 时序由库处理的高级API使用

语言选择

基于文件扩展名或语言上下文,参考相应指南:

语言 文件扩展名 指南
C, C++ .c, .h, .cpp, .cc, .hpp references/compiled.md
Go .go references/compiled.md
Rust .rs references/compiled.md
Swift .swift references/swift.md
Java .java references/vm-compiled.md
Kotlin .kt, .kts references/kotlin.md
C# .cs references/vm-compiled.md
PHP .php references/php.md
JavaScript .js, .mjs, .cjs references/javascript.md
TypeScript .ts, .tsx references/javascript.md
Python .py references/python.md
Ruby .rb references/ruby.md

快速开始

# 分析任何支持的文件类型
uv run {baseDir}/ct_analyzer/analyzer.py <source_file>

# 包含条件分支警告
uv run {baseDir}/ct_analyzer/analyzer.py --warnings <source_file>

# 过滤到特定函数
uv run {baseDir}/ct_analyzer/analyzer.py --func 'sign|verify' <source_file>

# 用于CI的JSON输出
uv run {baseDir}/ct_analyzer/analyzer.py --json <source_file>

仅原生编译语言(C、C++、Go、Rust)

# 跨架构测试(推荐)
uv run {baseDir}/ct_analyzer/analyzer.py --arch x86_64 crypto.c
uv run {baseDir}/ct_analyzer/analyzer.py --arch arm64 crypto.c

# 多个优化级别
uv run {baseDir}/ct_analyzer/analyzer.py --opt-level O0 crypto.c
uv run {baseDir}/ct_analyzer/analyzer.py --opt-level O3 crypto.c

虚拟机编译语言(Java、Kotlin、C#)

# 分析Java字节码
uv run {baseDir}/ct_analyzer/analyzer.py CryptoUtils.java

# 分析Kotlin字节码(Android/JVM)
uv run {baseDir}/ct_analyzer/analyzer.py CryptoUtils.kt

# 分析C# IL
uv run {baseDir}/ct_analyzer/analyzer.py CryptoUtils.cs

注意:Java、Kotlin和C#编译为在虚拟机上的字节码,并带有JIT编译。分析器直接检查字节码,而不是JIT编译的本机代码。--arch--opt-level标志不适用于这些语言。

Swift(iOS/macOS)

# 分析Swift用于本机架构
uv run {baseDir}/ct_analyzer/analyzer.py crypto.swift

# 分析特定架构(iOS设备)
uv run {baseDir}/ct_analyzer/analyzer.py --arch arm64 crypto.swift

# 使用不同优化级别分析
uv run {baseDir}/ct_analyzer/analyzer.py --opt-level O0 crypto.swift

注意:Swift编译为本机代码,类似于C/C++/Go/Rust,因此使用汇编级别分析,并支持--arch--opt-level标志。

先决条件

语言 要求
C, C++, Go, Rust PATH中的编译器(gcc/clanggorustc
Swift Xcode或Swift工具链(PATH中的swiftc
Java PATH中的JDK(javacjavap
Kotlin PATH中的Kotlin编译器(kotlinc)+ JDK(javap
C# .NET SDK + ilspycmddotnet tool install -g ilspycmd
PHP 带VLD扩展或OPcache的PHP
JavaScript/TypeScript PATH中的Node.js
Python PATH中的Python 3.x
Ruby --dump=insns支持的Ruby

macOS用户:Homebrew安装Java和.NET为“仅keg”。必须将其添加到PATH:

# 对于Java(添加到~/.zshrc)
export PATH="/opt/homebrew/opt/openjdk@21/bin:$PATH"

# 对于.NET工具(添加到~/.zshrc)
export PATH="$HOME/.dotnet/tools:$PATH"

有关详细设置说明和故障排除,请参见references/vm-compiled.md

快速参考

问题 检测 修复
对秘密的除法运算 DIV、IDIV、SDIV、UDIV Barrett约简或乘法逆运算
秘密依赖分支 JE、JNE、BEQ、BNE 恒定时间选择(cmov、位掩码)
秘密比较 提前退出的memcmp 使用crypto/subtle或恒定时间比较
弱随机数生成器 rand()、mt_rand、Math.random 使用加密安全RNG
基于秘密的表查找 对秘密索引的数组下标 位切片查找

解释结果

通过 - 未检测到可变时间操作。

失败 - 发现危险指令。示例:

[错误] SDIV
  函数:decompose_vulnerable
  原因:SDIV具有早期终止优化;执行时间取决于操作数值

验证结果(避免误报)

关键:并非每个标记的操作都是漏洞。工具没有数据流分析——它标记所有潜在危险操作,无论是否涉及秘密。

对于每个标记的违规,请询问:此操作的输入是否依赖于秘密数据?

  1. 识别函数的秘密输入(私钥、明文、签名、令牌)

  2. 从标记指令追溯数据流到输入

  3. 常见误报模式

    // 误报:除法使用公共常量,而非秘密
    int num_blocks = data_len / 16;  // data_len是长度,而非内容
    
    // 真阳性:除法涉及秘密派生值
    int32_t q = secret_coef / GAMMA2;  // secret_coef来自私钥
    
  4. 记录分析针对每个标记项

快速分类问题

问题 如果是 如果否
操作数是编译时常量吗? 可能是误报 继续
操作数是公共参数(长度、计数)吗? 可能是误报 继续
操作数派生自密钥/明文/秘密吗? 真阳性 可能是误报
攻击者能影响操作数值吗? 真阳性 可能是误报

限制

  1. 仅静态分析:分析汇编/字节码,而非运行时行为。无法检测缓存时序或微架构侧信道。

  2. 无数据流分析:标记所有危险操作,无论是否处理秘密。需要手动审查。

  3. 编译器/运行时变体:不同的编译器、优化级别和运行时版本可能产生不同输出。

实际影响

  • KyberSlash(2023):后量子ML-KEM实现中的除法指令允许密钥恢复
  • 幸运十三(2013):CBC填充验证中的时序差异启用明文恢复
  • RSA时序攻击:早期实现通过除法时序泄露私钥位

参考资料