constant-time-analysis
暗号コードにおけるタイミングサイドチャネル脆弱性を検出します。C、C++、Go、Rust、Swift、Java、Kotlin、C#、PHP、JavaScript、TypeScript、Python、Rubyで暗号コードの実装・レビューを行う際や、秘密情報に依存した分岐・除算処理、または定数時間プログラミングに関する疑問が生じた場合に使用してください。
description の原文を見る
Detects timing side-channel vulnerabilities in cryptographic code. Use when implementing or reviewing crypto code, encountering division on secrets, secret-dependent branches, or constant-time programming questions in C, C++, Go, Rust, Swift, Java, Kotlin, C#, PHP, JavaScript, TypeScript, Python, or Ruby.
SKILL.md 本文
Constant-Time Analysis
暗号コードを分析し、実行時間の変動を通じてシークレットデータが漏洩する操作を検出します。
使用時機
ユーザーが暗号コードを書いている? ──yes──> このスキルを使用
│
no
│
v
ユーザーがタイミング攻撃について質問している? ──yes──> このスキルを使用
│
no
│
v
コードがシークレットキー/トークンを扱っている? ──yes──> このスキルを使用
│
no
│
v
このスキルをスキップ
具体的なトリガー:
- ユーザーが署名、暗号化、または鍵導出を実装している
- コードに
/または%演算子がシークレット由来の値に対して含まれている - ユーザーが「constant-time」「timing attack」「side-channel」「KyberSlash」に言及している
- 関数名が
sign、verify、encrypt、decrypt、derive_keyという関数をレビューしている
使用しない時
- 非暗号化コード(ビジネスロジック、UI など)
- タイミング漏洩が問題にならないパブリックデータ処理
- シークレット、キー、認証トークンを扱わないコード
- タイミングがライブラリで処理される高レベル 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
VM コンパイル言語 (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# はバイトコード (JVM/CIL) にコンパイルされ、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/clang, go, rustc) |
| Swift | Xcode または Swift ツールチェーン (PATH 内の swiftc) |
| Java | JDK (PATH 内に javac および javap) |
| Kotlin | Kotlin コンパイラ (kotlinc) + JDK (PATH 内の javap) |
| C# | .NET SDK + ilspycmd (dotnet 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-only」としてインストールします。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 reduction または multiply-by-inverse |
| シークレットの分岐 | JE, JNE, BEQ, BNE | Constant-time selection (cmov, bit masking) |
| シークレット比較 | 早期終了 memcmp | crypto/subtle または constant-time 比較を使用 |
| 弱い RNG | rand(), mt_rand, Math.random | 暗号セキュアな RNG を使用 |
| シークレットによるテーブルルックアップ | シークレットインデックスでの配列アクセス | Bit-sliced lookups |
結果の解釈
PASSED - 可変時間操作は検出されませんでした。
FAILED - 危険な命令が見つかりました。例:
[ERROR] SDIV
Function: decompose_vulnerable
Reason: SDIV has early termination optimization; execution time depends on operand values
結果の検証 (偽陽性の回避)
重要: フラグされたすべての操作が脆弱性とは限りません。このツールはデータフロー分析を行わないため、シークレットが関係しているかどうかに関わらず、潜在的に危険なすべての操作をフラグします。
フラグされた各違反について、次の質問をしてください: この操作の入力はシークレットデータに依存しているか?
-
関数へのシークレット入力を特定する (秘密鍵、平文、署名、トークン)
-
フラグされた命令からデータフローを入力まで遡る
-
一般的な偽陽性パターン:
// 偽陽性: 除算はシークレットではなくパブリック定数を使用 int num_blocks = data_len / 16; // data_len は長さであり、内容ではない // 真の陽性: 除算はシークレット由来の値を含む int32_t q = secret_coef / GAMMA2; // secret_coef は秘密鍵から -
各フラグされた項目について分析を記録する
クイックトリアージ質問
| 質問 | はいの場合 | いいえの場合 |
|---|---|---|
| オペランドはコンパイル時定数か? | 偽陽性の可能性 | 続行 |
| オペランドはパブリックパラメータ (長さ、カウント) か? | 偽陽性の可能性 | 続行 |
| オペランドはキー/平文/シークレットから由来しているか? | 真の陽性 | 偽陽性の可能性 |
| 攻撃者はオペランド値に影響を与えることができるか? | 真の陽性 | 偽陽性の可能性 |
制限事項
-
静的分析のみ: アセンブリ/バイトコードを分析し、実行時の動作は分析しません。キャッシュタイミングやマイクロアーキテクチャ側面チャネルは検出できません。
-
データフロー分析なし: シークレットを処理しているかどうかに関わらず、危険なすべての操作をフラグします。手動確認が必要です。
-
コンパイラ/ランタイムの変動: 異なるコンパイラ、最適化レベル、ランタイムバージョンは異なる出力を生成する可能性があります。
現実の影響
- KyberSlash (2023): ポスト量子 ML-KEM 実装の除算命令が鍵回復を許可
- Lucky Thirteen (2013): CBC パディング検証のタイミング差により平文回復が可能
- RSA タイミング攻撃: 初期実装は除算タイミングを通じて秘密鍵ビットを漏洩
参考資料
- Cryptocoding Guidelines - 暗号化防御的コーディング
- KyberSlash - ポスト量子暗号の除算タイミング
- BearSSL Constant-Time - 実践的 constant-time テクニック
ライセンス: CC-BY-SA-4.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- trailofbits
- リポジトリ
- trailofbits/skills
- ライセンス
- CC-BY-SA-4.0
- 最終更新
- 不明
Source: https://github.com/trailofbits/skills / ライセンス: CC-BY-SA-4.0
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。