Agent Skills by ALSEL
Anthropic Claudeセキュリティ⭐ リポ 0品質スコア 50/100

wycheproof

暗号実装の検証用テストベクターを提供するWycheproofを活用するスキルです。既知の攻撃手法やエッジケースに対して暗号コードをテストする際に使用します。

description の原文を見る

> Wycheproof provides test vectors for validating cryptographic implementations. Use when testing crypto code for known attacks and edge cases.

SKILL.md 本文

Wycheproof

Wycheproof は暗号実装の正確性を検証し、既知の攻撃に対してテストするために設計された広範なテストベクトルの集合です。もともと Google によって開発されましたが、現在はコミュニティが管理するプロジェクトであり、寄稿者が特定の暗号構成のテストベクトルを追加できます。

背景

主要な概念

概念説明
テストベクトル暗号実装の正確性を検証するための入出力ペア
テストグループ属性(鍵のサイズ、IV のサイズ、曲線)を共有するテストベクトルの集合
結果フラグテストが成功する(有効)、失敗する(無効)、または許容される(受け入れ可能)かを示す
エッジケーステスト既知の脆弱性と攻撃パターンのテスト

なぜこれが重要か

暗号実装は正しく実装することが著しく困難です。小さなバグでも以下が可能になります:

  • 秘密鍵の露出
  • 署名の偽造
  • メッセージの復号化
  • 異なる実装が同じ入力を受け入れる/拒否する場合のコンセンサス問題の発生

Wycheproof は OpenJDK の SHA1withDSA、Bouncy Castle の ECDHC、elliptic npm パッケージなど、主要なライブラリの脆弱性を発見しています。

使用する場面

Wycheproof を適用する場合:

  • 暗号実装(AES-GCM、ECDSA、ECDH、RSA など)をテストする
  • 暗号コードがエッジケースを正しく処理することを検証する
  • 既知の攻撃ベクトルに対して実装を検証する
  • 暗号ライブラリの CI/CD をセットアップする
  • サードパーティの暗号コードの正確性を監査する

代替案を検討する場合:

  • タイミング側チャネルをテストする場合(代わりに定時テストツールを使用)
  • 新しい未知のバグを見つける場合(代わりにファジング使用)
  • カスタム/実験的暗号アルゴリズムをテストする場合(Wycheproof は確立されたアルゴリズムのみをカバー)

クイックリファレンス

シナリオ推奨アプローチメモ
AES-GCM 実装aes_gcm_test.json を使用44 テストグループにわたる 316 テストベクトル
ECDSA 検証特定の曲線に対して ecdsa_*_test.json を使用署名の可鍛性、DER エンコーディングのテスト
ECDH 鍵交換ecdh_*_test.json を使用無効な曲線攻撃のテスト
RSA 署名rsa_*_test.json を使用パディングオーダー攻撃のテスト
ChaCha20-Poly1305chacha20_poly1305_test.json を使用AEAD 実装のテスト

テスティングワークフロー

Phase 1: Setup                 Phase 2: Parse Test Vectors
┌─────────────────┐          ┌─────────────────┐
│ Add Wycheproof  │    →     │ Load JSON file  │
│ as submodule    │          │ Filter by params│
└─────────────────┘          └─────────────────┘
         ↓                            ↓
Phase 4: CI Integration        Phase 3: Write Harness
┌─────────────────┐          ┌─────────────────┐
│ Auto-update     │    ←     │ Test valid &    │
│ test vectors    │          │ invalid cases   │
└─────────────────┘          └─────────────────┘

リポジトリ構造

Wycheproof リポジトリは以下のように構成されています:

┣ 📜 README.md       : プロジェクト概要
┣ 📂 doc             : ドキュメント
┣ 📂 java            : Java JCE インターフェステスト用ハーネス
┣ 📂 javascript      : JavaScript テスト用ハーネス
┣ 📂 schemas         : テストベクトルスキーマ
┣ 📂 testvectors     : テストベクトル
┗ 📂 testvectors_v1  : 更新されたテストベクトル(より詳細)

必須フォルダは testvectorstestvectors_v1 です。どちらも同様のファイルを含みますが、testvectors_v1 はより詳細な情報を含めており、新規統合に推奨されます。

サポートされるアルゴリズム

Wycheproof は広範な暗号アルゴリズムのテストベクトルを提供します:

カテゴリアルゴリズム
対称鍵暗号化AES-GCM、AES-EAX、ChaCha20-Poly1305
署名ECDSA、EdDSA、RSA-PSS、RSA-PKCS1
鍵交換ECDH、X25519、X448
ハッシングHMAC、HKDF
曲線secp256k1、secp256r1、secp384r1、secp521r1、ed25519、ed448

テストファイル構造

各 JSON テストファイルは特定の暗号構成をテストします。すべてのテストファイルは共通の属性を持ちます:

"algorithm"         : テスト対象アルゴリズムの名前
"schema"            : JSON スキーマ(schemas フォルダに見つかります)
"generatorVersion"  : バージョン番号
"numberOfTests"     : このファイル内のテストベクトルの合計数
"header"            : テストベクトルの詳細説明
"notes"             : テストベクトル内のフラグの詳細説明
"testGroups"        : 1 つまたは複数のテストグループの配列

テストグループ

テストグループは以下のような共有属性に基づいてテストセットをグループ化します:

  • 鍵のサイズ
  • IV のサイズ
  • 公開鍵
  • 曲線

この分類により、テスト対象の構成に関連する特定の基準を満たすテストを抽出できます。

テストベクトルの属性

共有属性

すべてのテストベクトルには 4 つの共通フィールドが含まれます:

  • tcId: ファイル内のテストベクトルの一意の識別子
  • comment: テストケースに関する追加情報
  • flags: 特定のテストケースタイプと潜在的な危険性の説明(notes フィールドで参照)
  • result: テストの期待される結果

result フィールドは 3 つの値を取ることができます:

結果意味
validテストケースが成功すべき
acceptableテストケースは成功してもかまわないが、理想的でない属性を含む
invalidテストケースが失敗すべき

ユニーク属性

ユニーク属性はテストするアルゴリズムに固有です:

アルゴリズムユニーク属性
AES-GCMkeyivaadmsgcttag
ECDH secp256k1publicprivateshared
ECDSAmsgsigresult
EdDSAmsgsigpk

実装ガイド

Phase 1: プロジェクトに Wycheproof を追加

オプション 1: Git サブモジュール(推奨)

Wycheproof を git サブモジュールとして追加すると、自動更新が保証されます:

git submodule add https://github.com/C2SP/wycheproof.git

オプション 2: 特定のテストベクトルを取得

サブモジュールが不可能な場合は、特定の JSON ファイルを取得します:

#!/bin/bash

TMP_WYCHEPROOF_FOLDER=".wycheproof/"
TEST_VECTORS=('aes_gcm_test.json' 'aes_eax_test.json')
BASE_URL="https://raw.githubusercontent.com/C2SP/wycheproof/master/testvectors_v1/"

# wycheproof フォルダを作成
mkdir -p $TMP_WYCHEPROOF_FOLDER

# テストベクトルファイルが存在しない場合は全てをリクエスト
for i in "${TEST_VECTORS[@]}"; do
  if [ ! -f "${TMP_WYCHEPROOF_FOLDER}${i}" ]; then
    curl -o "${TMP_WYCHEPROOF_FOLDER}${i}" "${BASE_URL}${i}"
    if [ $? -ne 0 ]; then
      echo "Failed to download ${i}"
      exit 1
    fi
  fi
done

Phase 2: テストベクトルをパース

アルゴリズムのテストファイルを特定し、JSON をパースします:

Python の例:

import json

def load_wycheproof_test_vectors(path: str):
    testVectors = []
    try:
        with open(path, "r") as f:
            wycheproof_json = json.loads(f.read())
    except FileNotFoundError:
        print(f"No Wycheproof file found at: {path}")
        return testVectors

    # 16 進数からバイトへの変換が必要な属性
    convert_attr = {"key", "aad", "iv", "msg", "ct", "tag"}

    for testGroup in wycheproof_json["testGroups"]:
        # 実装上の制約に基づいてテストグループをフィルタ
        if testGroup["ivSize"] < 64 or testGroup["ivSize"] > 1024:
            continue

        for tv in testGroup["tests"]:
            # 16 進数文字列をバイトに変換
            for attr in convert_attr:
                if attr in tv:
                    tv[attr] = bytes.fromhex(tv[attr])
            testVectors.append(tv)

    return testVectors

JavaScript の例:

const fs = require('fs').promises;

async function loadWycheproofTestVectors(path) {
  const tests = [];

  try {
    const fileContent = await fs.readFile(path);
    const data = JSON.parse(fileContent.toString());

    data.testGroups.forEach(testGroup => {
      testGroup.tests.forEach(test => {
        // 各テストに共有テストグループプロパティを追加
        test['pk'] = testGroup.publicKey.pk;
        tests.push(test);
      });
    });
  } catch (err) {
    console.error('Error reading or parsing file:', err);
    throw err;
  }

  return tests;
}

Phase 3: テスト用ハーネスを作成

有効なテストケースと無効なテストケースの両方を処理するテスト関数を作成します。

Python/pytest の例:

import pytest
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

tvs = load_wycheproof_test_vectors("wycheproof/testvectors_v1/aes_gcm_test.json")

@pytest.mark.parametrize("tv", tvs, ids=[str(tv['tcId']) for tv in tvs])
def test_encryption(tv):
    try:
        aesgcm = AESGCM(tv['key'])
        ct = aesgcm.encrypt(tv['iv'], tv['msg'], tv['aad'])
    except ValueError as e:
        # 実装がエラーを発生 - テストが失敗すると予期されたか検証
        assert tv['result'] != 'valid', tv['comment']
        return

    if tv['result'] == 'valid':
        assert ct[:-16] == tv['ct'], f"Ciphertext mismatch: {tv['comment']}"
        assert ct[-16:] == tv['tag'], f"Tag mismatch: {tv['comment']}"
    elif tv['result'] == 'invalid' or tv['result'] == 'acceptable':
        assert ct[:-16] != tv['ct'] or ct[-16:] != tv['tag']

@pytest.mark.parametrize("tv", tvs, ids=[str(tv['tcId']) for tv in tvs])
def test_decryption(tv):
    try:
        aesgcm = AESGCM(tv['key'])
        decrypted_msg = aesgcm.decrypt(tv['iv'], tv['ct'] + tv['tag'], tv['aad'])
    except ValueError:
        assert tv['result'] != 'valid', tv['comment']
        return
    except InvalidTag:
        assert tv['result'] != 'valid', tv['comment']
        assert 'ModifiedTag' in tv['flags'], f"Expected 'ModifiedTag' flag: {tv['comment']}"
        return

    assert tv['result'] == 'valid', f"No invalid test case should pass: {tv['comment']}"
    assert decrypted_msg == tv['msg'], f"Decryption mismatch: {tv['comment']}"

JavaScript/Mocha の例:

const assert = require('assert');

function testFactory(tcId, tests) {
  it(`[${tcId + 1}] ${tests[tcId].comment}`, function () {
    const test = tests[tcId];
    const ed25519 = new eddsa('ed25519');
    const key = ed25519.keyFromPublic(toArray(test.pk, 'hex'));

    let sig;
    if (test.result === 'valid') {
      sig = key.verify(test.msg, test.sig);
      assert.equal(sig, true, `[${test.tcId}] ${test.comment}`);
    } else if (test.result === 'invalid') {
      try {
        sig = key.verify(test.msg, test.sig);
      } catch (err) {
        // ポイントをデコードできません
        sig = false;
      }
      assert.equal(sig, false, `[${test.tcId}] ${test.comment}`);
    }
  });
}

// すべてのテストベクトルに対してテストを生成
for (var tcId = 0; tcId < tests.length; tcId++) {
  testFactory(tcId, tests);
}

Phase 4: CI 統合

以下の方法でテストベクトルが最新の状態に保たれるようにします:

  1. git サブモジュールの使用: テスト実行前に CI でサブモジュールを更新
  2. 最新ベクトルの取得: テスト実行前にフェッチスクリプトを実行
  3. スケジュール更新: 週次/月次更新をセットアップして新しいテストベクトルをキャッチ

よく検出される脆弱性

Wycheproof テストベクトルは特定の脆弱性パターンをキャッチするために設計されています:

脆弱性説明影響を受けるアルゴリズムCVE の例
署名の可鍛性同じメッセージに対する複数の有効な署名ECDSA、EdDSACVE-2024-42459
無効な DER エンコーディング正規でない DER 署名の受け入れECDSACVE-2024-42460、CVE-2024-42461
無効な曲線攻撃無効な曲線ポイントを使用した ECDHECDH多くのライブラリで一般的
パディングオーダーパディング検証のタイミング漏洩RSA-PKCS1歴史的な OpenSSL の問題
タグ偽造修正された認証タグの受け入れAES-GCM、ChaCha20-Poly1305さまざまな実装

署名の可鍛性: 深掘り

問題: 署名エンコーディングを検証しない実装は、同じメッセージに対して複数の有効な署名を受け入れることができます。

例(EdDSA): 署名から 0 を付加または削除:

有効な署名:   ...6a5c51eb6f946b30d
無効な署名: ...6a5c51eb6f946b30d0000  (拒否されるべき)

検出方法:

# 署名長チェックを追加
if len(sig) != 128:  # EdDSA 署名は正確に 64 バイト(128 16 進数文字)である必要があります
    return False

影響: 異なる実装が同じ署名を受け入れる/拒否する場合のコンセンサス問題につながります。

関連する Wycheproof テスト:

  • EdDSA: tcId 37 - "署名から 0 バイトを削除"
  • ECDSA: tcId 06 - "レガシー: r の ASN エンコーディングが先頭 0 を見落とし"

ケーススタディ: Elliptic npm パッケージ

このケーススタディは、Wycheproof が人気のある elliptic npm パッケージ(3000+ 依存関係、週に数百万のダウンロード)の 3 つの CVE を発見した方法を示しています。

概要

elliptic ライブラリは、ECDH、ECDSA、EdDSA をサポートする JavaScript で記述された楕円曲線暗号ライブラリです。バージョン 6.5.6 で Wycheproof テストベクトルを使用したところ、複数の脆弱性が明らかになりました:

  • CVE-2024-42459: EdDSA 署名の可鍛性(0 の追加/削除)
  • CVE-2024-42460: ECDSA DER エンコーディング - 無効なビット配置
  • CVE-2024-42461: ECDSA DER エンコーディング - 長さフィールドの先頭 0

方法論

  1. サポートされている曲線を特定: EdDSA の ed25519
  2. テストベクトルを検索: testvectors_v1/ed25519_test.json
  3. テストベクトルをパース: JSON を読み込んでテストを抽出
  4. テストハーネスを作成: パラメータ化されたテストを作成
  5. テストを実行: 失敗を特定
  6. 根本原因を分析: 実装コードを確認
  7. 修正を提案: 検証チェックを追加

主な発見

EdDSA 問題(CVE-2024-42459):

  • 署名長検証がない
  • 署名に末尾の 0 を許可
  • 修正: if(sig.length !== 128) return false; を追加

ECDSA 問題 1(CVE-2024-42460):

  • DER エンコードされた r と s の値の最初のビットがゼロであることを確認するチェックがない
  • 修正: if ((data[p.place] & 128) !== 0) return false; を追加

ECDSA 問題 2(CVE-2024-42461):

  • DER 長フィールドが先頭 0 を受け入れた
  • 修正: if(buf[p.place] === 0x00) return false; を追加

影響

3 つの脆弱性すべてで、単一のメッセージに対して複数の有効な署名を許可でき、実装間でコンセンサス問題を引き起こしています。

教訓:

  • Wycheproof は微妙なエンコーディングバグをキャッチします
  • 再利用可能なテストハーネスは配当を支払います
  • テストベクトルのコメントとフラグは問題の診断に役立ちます
  • 人気のあるライブラリでも体系的なテストベクトル検証の恩恵を受けます

高度な使用法

ヒントとコツ

ヒントなぜ役に立つか
パラメータでテストグループをフィルタ実装上の制約に関連するテストベクトルに焦点を当てる
テストベクトルフラグを使用テストされている特定の脆弱性パターンを理解
notes フィールドを確認フラグの意味の詳細説明を取得
暗号化/復号化と署名/検証の両方をテスト双方向の正確性を確保
CI でテストを実行回帰をキャッチして新しいテストベクトルの恩恵を受ける
パラメータ化されたテストを使用tcId とコメント付きの明確な失敗メッセージを取得

よくある間違い

間違いなぜ間違いか正しいアプローチ
有効なケースのみをテスト無効な入力が受け入れられる脆弱性を見落とすすべての結果タイプをテスト: valid、invalid、acceptable
「acceptable」結果を無視実装に微妙なバグがある可能性acceptable を調査する価値のある警告として扱う
テストグループをフィルタしないサポートされていないパラメータに時間を無駄にするkeySize、ivSize などの実装に基づいてフィルタ
テストベクトルを更新しない新しい脆弱性パターンを見落とすサブモジュールまたはスケジュール更新を使用
1 つの方向のみをテスト暗号化/署名は機能するが復号化/検証は失敗両方の操作をテスト

関連スキル

ツールスキル

スキルWycheproof テストでの主な用途
pytestパラメータ化されたテスト用 Python テストフレームワーク
mochaテスト生成用 JavaScript テストフレームワーク
constant-time-testingタイミング側チャネルテストで Wycheproof を補完
cryptofuzz追加のバグを検出するためのファジベース暗号テスト

テクニックスキル

スキル適用する場合
coverage-analysis暗号実装内のすべてのコードパスをテストベクトルでカバーすることを確認
property-based-testing数学的性質をテスト(例:暗号化/復号化のラウンドトリップ)
fuzz-harness-writing暗号パーサ用のハーネスを作成(Wycheproof を補完)

関連ドメインスキル

スキル関係性
crypto-testingWycheproof は暗号テストの包括的な方法論の重要なツール
fuzzingWycheproof がカバーしないバグを見つけるためにファジングを使用(新しいエッジケース)

スキル依存マップ

                    ┌─────────────────────┐
                    │    wycheproof       │
                    │   (このスキル)      │
                    └──────────┬──────────┘
                               │
           ┌───────────────────┼───────────────────┐
           │                   │                   │
           ▼                   ▼                   ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│  pytest/mocha   │ │ constant-time   │ │   cryptofuzz    │
│ (テストフレーム)│ │   testing       │ │   (ファジング)  │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
         │                   │                   │
         └───────────────────┼───────────────────┘
                             │
                             ▼
              ┌──────────────────────────┐
              │  テクニックスキル        │
              │ coverage、harness、PBT   │
              └──────────────────────────┘

リソース

公式リポジトリ

Wycheproof GitHub リポジトリ

公式リポジトリに含まれるもの:

  • testvectors/ および testvectors_v1/ 内のすべてのテストベクトル
  • schemas/ 内の JSON スキーマ
  • Java と JavaScript の参照実装
  • doc/ 内のドキュメント

実例

pycryptodome

pycryptodome ライブラリは、Python 暗号実装のベストプラクティスを実証し、そのテストスイートで Wycheproof テストベクトルを統合しています。

コミュニティリソース

  • C2SP Community - Wycheproof を管理する暗号仕様と標準コミュニティ
  • Wycheproof issues tracker - テストベクトルのバグを報告するか、新しい構成を提案

まとめ

Wycheproof は、既知の攻撃ベクトルとエッジケースに対して暗号実装を検証するための重要なツールです。テスティングワークフローに Wycheproof テストベクトルを統合することで:

  1. 微妙なエンコーディングと検証のバグをキャッチ
  2. 署名の可鍛性の問題を防止
  3. 実装間での一貫した動作を確保
  4. コミュニティ寄稿のテストベクトルから恩恵を受ける
  5. 既知の暗号脆弱性から保護

再利用可能なテストハーネスを作成する投資は、新しいテストベクトルが Wycheproof リポジトリに追加される際の継続的な検証を通じて配当を支払います。

ライセンス: CC-BY-SA-4.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
trailofbits
リポジトリ
trailofbits/skills
ライセンス
CC-BY-SA-4.0
最終更新
不明

Source: https://github.com/trailofbits/skills / ライセンス: CC-BY-SA-4.0

関連スキル

Anthropic Claudeセキュリティ⭐ リポ 8,981

secure-code-guardian

認証・認可の実装、ユーザー入力の保護、OWASP Top 10の脆弱性対策が必要な場合に使用します。bcrypt/argon2によるパスワードハッシング、パラメータ化ステートメントによるSQLインジェクション対策、CORS/CSPヘッダーの設定、Zodによる入力検証、JWTトークンの構築などのカスタムセキュリティ実装に対応します。認証、認可、入力検証、暗号化、OWASP Top 10対策、セッション管理、セキュリティ強化全般で活用できます。ただし、構築済みのOAuth/SSO統合や単独のセキュリティ監査が必要な場合は、より特化したスキルの検討をお勧めします。

by Jeffallan
汎用セキュリティ⭐ リポ 1,982

claude-authenticity

APIエンドポイントが本物のClaudeによって支えられているか(ラッパーやプロキシ、偽装ではないか)を、claude-verifyプロジェクトを模した9つの重み付きルールベースチェックで検証できます。また、Claudeの正体を上書きしているプロバイダーから注入されたシステムプロンプトも抽出します。完全に自己完結しており、httpx以外の追加パッケージは不要です。Claude APIキーまたはエンドポイントを検証したい場合、サードパーティのClaudeサービスが本物か確認したい場合、APIプロバイダーのClaude正当性を監査したい場合、複数モデルを並行してテストしたい場合、またはプロバイダーが注入したシステムプロンプトを特定したい場合に使用できます。

by LeoYeAI
Anthropic Claudeセキュリティ⭐ リポ 2,159

anth-security-basics

Anthropic Claude APIのセキュリティベストプラクティスを適用し、キー管理、入力値の検証、プロンプトインジェクション対策を実施します。APIキーの保護、Claudeに送信する前のユーザー入力検証、コンテンツセーフティガードレールの実装が必要な場合に活用できます。「anthropic security」「claude api key security」「secure anthropic」「prompt injection defense」といったフレーズでトリガーされます。

by jeremylongshore
汎用セキュリティ⭐ リポ 699

x-ray

x-ray.mdプレ監査レポートを生成します。概要、強化された脅威モデル(プロトコルタイプのプロファイリング、Gitの重み付け攻撃面分析、時間軸リスク分析、コンポーザビリティ依存関係マッピング)、不変条件、統合、ドキュメント品質、テスト分析、開発者・Gitの履歴をカバーしています。「x-ray」「audit readiness」「readiness report」「pre-audit report」「prep this protocol」「protocol prep」「summarize this protocol」のキーワードで実行されます。

by pashov
汎用セキュリティ⭐ リポ 677

semgrep

Semgrepスタティック分析スキャンを実行し、カスタム検出ルールを作成します。Semgrepでのコードスキャン、セキュリティ脆弱性の検出、カスタムYAMLルールの作成、または特定のバグパターンの検出が必要な場合に使用します。重要:ユーザーが「バグをスキャンしたい」「コード品質を確認したい」「脆弱性を見つけたい」「スタティック分析」「セキュリティlint」「コード監査」または「コーディング標準を適用したい」と尋ねた場合も、Semgrepという名称を明記していなくても、このスキルを使用してください。Semgrepは30以上の言語に対応したパターンベースのコードスキャンに最適なツールです。

by wimpysworld
汎用セキュリティ⭐ リポ 591

ghost-bits-cast-attack

Java「ゴーストビッツ」/キャストアタック プレイブック(Black Hat Asia 2026)。16ビット文字が8ビットバイトに暗黙的に縮小されるJavaサービスへの攻撃時に使用します。WAF/IDSを回避して、SQLインジェクション、デシリアライゼーション型RCE、ファイルアップロード(Webシェル)、パストトラバーサル、CRLF インジェクション、リクエストスマグリング、SMTPインジェクションを実行できます。Tomcat、Spring、Jetty、Undertow、Vert.x、Jackson、Fastjson、Apache Commons BCEL、Apache HttpClient、Angus Mail、JDK HttpServer、Lettuce、Jodd、XMLWriterに影響し、WAFバイパスにより多くの「パッチ済み」CVEを再度有効化します。

by yaklang
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: trailofbits · trailofbits/skills · ライセンス: CC-BY-SA-4.0