ブロックチェーンの署名鍵をHSM・MPCで守るとき|不正な承認と二重送金の防ぎ方

コラム

/約12分で読めます

コラム

/約12分

ブロックチェーンの署名鍵をHSM・MPCで守るとき|不正な承認と二重送金の防ぎ方
目次(タップで折りたたみ)

    ある決済サービスの会社が、署名に使う鍵をHSMに移しました。対象は、スマートコントラクトの管理者鍵、relayer(利用者に代わって取引を送り、ガス代を払う中継サービス)の鍵、決済ウォレットの鍵です。どれも、システムが自動または半自動で署名します。

    経営会議では「これで鍵は安全になった」と報告されました。ところが、署名サービスの責任者には気になることが残っています。

    • 承認のシステムが乗っ取られ、「承認済み」の不正な送金が回ってきたら、HSMはそのまま署名してしまうのではないか。
    • 署名や送信が時間切れになったとき、担当者が作り直して送ったら、同じ送金が二重に出ていかないか。

    どちらも、鍵そのものは盗まれていないのに資産を失う事故です。HSMもMPCも、鍵を外に出さずに、渡されたデータへ署名する仕組みです。渡されたデータが誤っていれば、正しい鍵で誤った取引に署名してしまいます。つまり、鍵を守ることと、何に署名するかを確かめることは、別の仕事です。

    そこで、鍵の保護とは別に設計するものがあります。何に署名するのか、損失の上限、承認者、要求の有効期限、障害のときに復旧する権限です。そしてそれを、オンチェーンの権限の制約とつなぎます。この設計は、HSMとMPCのどちらを使っても共通です。

    この記事で使う言葉

    • HSM(Hardware Security Module):暗号鍵を保護し、装置の内部で署名する専用基盤
    • MPC(Multi-Party Computation):秘密情報を明かさずに、複数者で共同計算する技術
    • 閾値署名:鍵を複数に分け、決めた数がそろったときだけ署名できる方式
    • マルチシグ:複数の鍵の署名がそろわないと実行できないアカウント
    • タイムロック:重要な操作を、決めた待機時間の後でしか実行できなくする仕組み

    署名で起こせる損失を、用途ごとに分ける

    1つのアドレスに何でもできる権限を集めると、その鍵が1回破られただけで、被害が次々に広がります。最初にやるのは、署名で何ができてしまうかの洗い出しです。

    • 資産を送る、コントラクトをアップグレードする
    • 役割(ロール)を付け替える、一時停止を解除する
    • Oracleを更新する、ガス代を払う

    これらを別々の権限として扱います。権限ごとに、次のことを決めます。

    • 1回・1日あたりの上限、送付先、対象チェーン、トークンのコントラクト
    • 実行できる時間帯と、取り消せる時点
    • 止まっていてもよい時間

    冒頭の会社の3つの鍵に、一時停止用の鍵を加えると、次のように分けます。

    用途(署名の頻度)破られたときの主な損失別に用意する守り
    コントラクト管理者鍵(アップグレード・役割変更)/頻度は低いコントラクト全体の乗っ取り、全資産の移転高い閾値のマルチシグ、タイムロック、通常業務と別の承認者
    一時停止用の鍵/非常時のみサービスの停止(悪用時の損失は限定的にする)停止だけに限った権限。解除は管理者鍵の側へ戻す
    relayer・定型送信の鍵/頻度は高いガス代用の残高の流出、不正な送信残高上限、送信先・関数の許可リスト、自動補充の上限
    決済ウォレットの鍵/中〜高送金額の範囲での流出1回・1日の上限、宛先の登録、業務承認との突き合わせ

    毎日の大量の署名と、アップグレードや資産回収のような、まれだが影響の大きい操作。この2つを同じ鍵・同じルールに載せていると、どちらかで問題が起きて鍵を止めたとき、両方が止まります。2つを分けることが、止まる範囲を小さくする第一歩になります。

    承認・署名・送信を、誰が受け持つか

    次に、署名の運用を3つの役割に分けます。承認する仕組み、署名する装置、送信する仕組みです。

    役割受け持つこと1つだけに任せないこと
    承認する仕組み(制御面)要求者の認証、リスク判定、承認、上限、変更管理秘密鍵・シェア(MPCで分散した鍵の断片)の直接利用
    署名する装置(署名面)許可済みのダイジェスト(署名対象のハッシュ値)への署名、鍵・シェアの隔離送金してよいかの業務判断を自分で下すこと
    送信する仕組み(実行面)nonceの管理、送信、受領記録(receipt)の取得、確定(finality)の確認、突き合わせ時間切れだけを理由にした再署名・再送

    それぞれが残す証拠は、後半の「実装する人向けの詳細」にまとめました。

    冒頭の1つ目の心配への答えがここにあります。署名する装置が「承認済み」という印を信じるだけでは、分けた意味がありません。署名する側でも、中身を確かめます。

    • チェーンID、送付先、呼び出す関数(function selector)
    • 金額、nonce、期限
    • 承認ID

    こうしておけば、承認の仕組みが改ざんされても、そのまま何にでも署名してしまうことを防げます。

    さらにオンチェーン側にも、役割、上限、一時停止、タイムロックを置きます。オフチェーンのルールをすり抜けた署名があっても、影響を限られた範囲にとどめられます。

    HSMとMPCは「どこが壊れたら困るか」で選ぶ

    2つの違いを短くまとめると、次のとおりです。

    • HSM:鍵を、壊して取り出しにくい装置か、マネージドのクラスタの中に置く。署名もその中で行う。
    • MPC(閾値署名):秘密情報を複数の参加者に分け、必要な数が参加して署名を作る。通常は、秘密鍵の全体を1か所に戻さない(NIST Multi-Party Threshold Cryptography project)。
    • どちらも防げないこと:正しい鍵で、誤った取引に署名すること。

    選ぶときの注意が3つあります。

    1つ目は、標準の状況です。NIST IR 8214Cは、2026年1月に参考資料づくりのための提案を募集した段階の文書です。そのため、「MPC」という名前だけでは、標準への準拠も、実装の安全性も示せません。

    2つ目。製品の中の複数人承認にも範囲があります。AWS CloudHSMのような製品の複数人承認は、申請が妥当か、送金先が許可リストにあるか、取引の上限、オンチェーンの役割までは確かめません。

    3つ目。MPCでも、すべての参加者を同じクラウドアカウントと、同じCI用の認証情報で動かすとどうなるか。1か所が破られたり止まったりすれば全体に及ぶ、単一障害点に戻ってしまいます。

    信頼の境界、可用性、移行・復旧、承認、採用しない条件で比べた表は「機関投資家向け暗号資産カストディ設計」にまとめています。マルチシグを含めた3方式の責任の分け方も、同じ記事で扱っています。MPCの基本は「秘密鍵管理にMPCが必要な理由」を参照してください。ここからは、どちらを選んでも必要になる署名サービス側の設計を続けます。

    時間切れのとき、二重に送らないためには

    冒頭の2つ目の心配です。署名や送信が時間切れになっても、実際には署名ができていて、取引も送られていることがあります。そこで作り直して送れば、同じ送金が二重に出ていきます。時間切れを、失敗と決めつけてはいけません。

    そのため、本番で頼りにする記録は「署名済みかどうか」の二択ではありません。要求から確定までの、どの段階にいるかです。どの要求にも、次のものを持たせます。

    • 一意な要求ID(request_id)と、署名するデータを整えたうえでのハッシュ
    • チェーンID、nonce、ルールの版
    • 有効期限

    1本の要求は、作成、検証、承認、署名中、署名済み、送信済み、取り込み済み、確定、と進みます。途中で却下・期限切れになることもあります。段階の一覧と、やり直してよい条件は後半の表にまとめました。

    署名中に時間切れになったら、先に記録を突き合わせます。HSMの監査ログ、MPCの取りまとめ役(coordinator)と各参加者、署名のデータベースです。署名が存在しないと確かめられるまで、計算し直しません。

    送信の時間切れも同じです。ノード、mempool(未処理の取引の待合所)、nonce、受領記録を確かめてから動きます。同じ操作が二重に実行されるのを防ぐためです。送金全体の状態管理と、突き合わせまでの流れは、カストディ設計の記事で詳しく扱っています。

    オンチェーンには何を置き、何を置かないか

    個人情報、承認のコメント、社内のリスク評価、組織図を、オンチェーンに置く必要はありません。

    一方で、コントラクトが最後に拒否できなければ、守りが残りません。オフチェーンのルールが破られたときに、止めるものがなくなるからです。OpenZeppelinのAccessControlでは、役割を分けられます。TimelockControllerでは、提案から実行までの待機時間を強制できます。

    • オンチェーン:管理者・アップグレード担当・一時停止担当などの役割、マルチシグの閾値、重要な操作のタイムロック、上限、nonce、一時停止の状態、実行イベント。
    • オフチェーン:人の所属、承認理由、リスク判定、申請チケット、端末・ネットワーク情報、シミュレーション結果、インシデントの記録。
    • 両者を結ぶ値:操作ID、calldata(コントラクトへ渡す入力データ)のハッシュ、ルールの版または承認記録のハッシュ。機密情報そのものは公開しない。

    緊急停止を、通常のアップグレード鍵と同じ道にしていたとします。その鍵が破られると、攻撃者を止める手段まで一緒に失います。そのため、緊急停止は別の道にします。

    一時停止の権限は、被害を限るだけの狭いものにします。解除、資産移転、アップグレードは、より高い閾値とタイムロックの側に戻します。

    1つの外部所有アカウント(EOA:普通の秘密鍵で動くアカウント)を、最上位の所有者として残す場合もあります。その鍵が破られると、ほかの守りを迂回できてしまいます。移行の期間と、廃止する条件をはっきり書いておきます。

    待機時間の長さや、緊急権限の決め方は「マルチシグ・タイムロックによる本番権限管理」で詳しく扱っています。MPCとAccount Abstractionの層の違いは「MPCウォレット×Account Abstraction」をご覧ください。

    どんな障害を平時に試しておくか

    復旧のための権限も、本番の権限と同じくらい大事に扱います。次の5つの障害を、平時に再現しておきます。

    障害損失を広げない動き復旧できたと言える証拠
    ルールを判定するサービスの乗っ取り署名する側の独立した検証とオンチェーンの上限で拒否改ざんされた要求が署名・実行されない
    HSMクラスタ/MPC参加者の停止待ち行列を保持し、閾値に足りなければ署名しない目標復旧時間内に復旧し、重複署名や順序の逆転がない
    鍵・シェアが漏れた疑い影響する役割を一時停止し、新しい鍵へ権限を移す旧鍵が無効、残った要求を再承認、全チェーンで突き合わせ
    クラウド・製品提供者の全停止非常用の復旧経路(break-glass)を隔離環境で起動文書だけでなく、実際の署名と役割の移行までやり切る
    チェーンの混雑・再編成nonceと置き換えを1か所で管理し、確定を待つ二重実行がなく、期待したイベントと業務台帳が一致

    再編成(reorg)は、チェーンの直近のブロックが別のものに置き換わることです。

    目標復旧時間(RTO)と、どの時点までのデータ損失を許すか(RPO)は、鍵の基盤だけに決めるものではありません。承認のデータベース、nonce、処理待ちの行列、ルール、監査ログにも決めます。

    AWS CloudHSMは、クラスタ内の鍵の同期とバックアップを提供しています。ただ、バックアップがあることと、目標時間内に復旧できることは別の話です。復旧には、権限管理、ネットワーク、アプリケーションも含まれます。

    PoCで確かめる10の証拠

    PoCでは、署名の速さより先に、次の10項目を確かめます。

    1. 許可した楕円曲線、ハッシュ、署名形式が、対象チェーンのテストベクター(検証用の入出力例)と一致する。
    2. 署名の前に、人が読める操作内容と、生のcalldataのハッシュを突き合わせられる。
    3. 要求者、承認者、ルール変更者、署名基盤の管理者、監査者が分かれている。
    4. 同じクラウドアカウント、端末、認証基盤(IdP:ログインを受け持つ仕組み)、秘密情報の保管庫が、閾値全体を同時に破れない。
    5. 上限超過、未知のコントラクト、誤ったチェーン、期限切れ、nonceの競合を拒否する。
    6. 署名・送信が時間切れになった後も、二重に実行しない。
    7. HSM/MPCの一部が止まっても、決めた可用性を満たす。足りないときは署名しない(判断できないときは止まる)。
    8. 鍵の更新、参加者の交代、鍵が漏れた疑い、全リージョンの喪失、製品提供者からの退出を、実地で試す。
    9. オンチェーンのイベント、取引の受領記録、署名ログ、承認ログ、業務台帳を、要求IDで追える。
    10. 非常用の復旧経路を使った後に旧経路を無効にし、通常運用へ安全に戻せる。

    応答時間と処理量は、この安全条件を満たしたうえで測ります。前半で見たとおり、鍵とルールを分けた方が、止まる範囲を小さくできます。同じ理由で、毎日の大量の署名と、まれだが影響の大きい操作は、サービス水準(SLA)も分けます。

    ウォレット方式の全体像は「ブロックチェーンウォレットの導入・開発と運用設計」で解説しています。脅威分析と監査を含むセキュリティの全体像は「Web3セキュリティ」を参照してください。DeFiの操作ごとに承認内容を固める方法は「機関DeFiの取引承認とウォレット権限」で扱っています。

    実装する人向けの詳細

    3つの役割が残す証拠

    • 承認する仕組み(制御面):要求ID、承認者、ポリシーの版、署名対象データのハッシュ
    • 署名する装置(署名面):鍵ID、アルゴリズム、署名時刻、装置の真正性の証明(attestation)・監査ログ
    • 送信する仕組み(実行面):チェーンID、nonce、トランザクションハッシュ、受領記録、確定したブロック

    署名要求の状態

    時間切れと失敗を分けるため、要求を次の状態で管理します。

    状態完了条件やり直してよい条件禁止事項
    作成(DRAFT)目的、対象、金額、期限を作成編集できる署名面へ送らない
    検証済み(VALIDATED)事前実行(シミュレーション)、許可リスト、残高、nonceを確認入力が変わったら再検証シミュレーション結果だけで承認しない
    承認済み(APPROVED)必要な独立した承認とポリシーの版が一致期限内で、署名対象データが同一の場合だけ承認後のcalldataの差し替え
    署名中(SIGNING)HSM/MPCへ一意なダイジェストの署名を依頼署名記録を照会した後時間切れの直後に別の要求を作る
    署名済み(SIGNED)公開鍵で検証し、low-sなどチェーンの要件を確認同じ署名を再利用できるか判定検証していない署名を送信する
    送信済み(SUBMITTED)トランザクションハッシュと送信先ノードを記録同じnonceで、置き換えの規則の範囲内新しいnonceで同じ操作を二重に送る
    取り込み済み(CONFIRMED)受領記録と、期待したイベント・状態を確認チェーンの再編成(reorg)の監視を続けるHTTPの成功を業務完了とみなす
    確定(FINAL)定義した確定条件とオフチェーンの照合を満たすやり直さない履歴の上書き
    却下・期限切れ(REJECTED / EXPIRED)理由、取り消した人、時刻を保存新しい要求として申請し直す古い承認の流用

    XTELAができること

    私たちXTELAは、署名対象と権限の棚卸し、HSM・MPCを含む構成の比較、ポリシーと署名要求の状態管理、監視の仕組み、スマートコントラクト側の権限設計を一続きで設計・開発しています。relayerや管理者鍵の署名サービスについて、障害と復旧を含むPoCの受入試験から本番運用まで一緒に組み立てます。貴社の署名基盤を見直したい場合は、お問い合わせからご連絡ください。

    参考資料

    資料の確認日と注意:仕様・一次資料は2026年8月12日に最終確認しました。一般的な技術・運用設計の解説です。カストディへの該当性や、法令・契約上の責任、会計・税務の判断は、弁護士・会計士等の専門家にご確認ください。

    お問い合わせ

    どんなフェーズからでも、お持ちのアイデアや企画をもとにご提案可能です。
    まずはお気軽にご相談下さい!