ハードウェアウォレットの比較記事を検索すると、Jadeについて同じ説明を目にするはずです。「Secure Elementを搭載していない」というものです。通常は問いではなく結論として書かれていますが、その背景には重要な問いがあります。デバイスは、第三者による6桁PINの総当たりをどう防ぐのでしょうか。
Jadeは「Virtual Secure Element」でこの問題に対応します。ウォレットを復号する能力を2つの場所に分割し、どちらか一方だけでは復号できない設計です。その仕組みと、攻撃者が各段階で実際に入手できるものを説明します。
Secure ElementチップがPINに対して果たす役割
専用のSecure Elementチップには3つの役割があります。
- 物理的な解析に耐えるよう設計されたシリコン内へ鍵情報を保存する。
- デバイスが消去されるまでに試行できるPINの回数を制限する。
- PINを内部で検証し、PIN自体をデバイスの他の部分へ公開しない。
これらが達成すべき目標です。Secure Elementチップはその実現方法のひとつです。Jadeは、手元のデバイスと、ユーザーについて何も知らないサーバーとの間で処理を分割し、3つすべてを実現します。
2本の鍵、ひとつの貸金庫
利用者の鍵と銀行の鍵を同時に回さなければ開かない、昔ながらの貸金庫を想像してください。どちらの鍵だけでも開きません。
リカバリーフレーズはJade上で暗号化されています。それを復号する鍵は、デバイス内外のどこにも保存されません。ロック解除のたび、別々の場所にある2つの要素から新たに導出されます。ひとつはJade本体のボタンで入力するPINです。もうひとつはblind oracleが保持する秘密です。このサーバーは仕組みの半分だけを保持し、もう半分を見ることはできません。Blockstreamが運用するものを利用するほか、オープンソースのoracleをノートPCやRaspberry Piで、必要ならTor経由で自分で運用できます。
oracleがPINを受け取ることはありません。Jadeは、デバイス上で生成された固有のunit keyとPINを混合した、スクランブル済みの派生値を送信します。unit keyを外部へ出力するファームウェア経路はなく、これがなければ派生値に意味はありません。Blockstreamはoracleを運用していますが、そこからPINを逆算することはできません。
Jadeのロックを解除するときの処理
- パソコンやアプリではなく、Jade本体でPINを入力します。
- Jadeはスクランブル済み派生値をoracleへ送ります。コンパニオンアプリは中継役であり、運んでいる内容を読み取れません。
- oracleは、そのデバイスについて保持する記録と派生値を照合します。一致するとoracle側の要素を返し、JadeがPINと組み合わせて復号鍵を構築します。
- 一致しない場合は両側で失敗回数を数えます。3回目の誤入力で、双方が保持するデータを破棄します。Jadeは暗号化されたウォレットを消去し、oracleは自身のshareを上書きして記録を削除します。
Jadeはduress PINにも対応しています。入力するとデバイスはkeychainを消去してシャットダウンし、第2のPINが存在した痕跡をデバイス上に残しません。
攻撃者が実際に入手できるもの
セキュリティ設計の価値は、攻撃者が何を持ち去れないかで決まります。5つの攻撃経路を見てみましょう。
Jadeを盗み、フラッシュメモリを完全に抽出した場合。 攻撃者が得るのは暗号化されたデータとデバイスのunit keyです。チップ上にないのはoracle側のshareであり、それなしではPIN候補を試せません。oracleがなければ計算が成立しないため、研究室で総当たりできる対象がありません。
盗難者がoracleへ接続した場合。 応答するのは3回までです。試行回数はサーバー側に記録されるため、デバイスを所有していてもリセット、グリッチによる回避、時間経過による解除はできません。3回目の失敗でoracleはshareを削除し、暗号化データは永久に復号不能になります。攻撃者が6桁PINを試せるのはウォレットが失われるまでの3回だけです。
コンパニオンアプリまたは実行中のパソコンが悪意を持つ場合。 読み取りも偽造もできない暗号化通信を中継するだけで、Jade本体に入力されたPINには触れません。通信を拒否してロック解除を妨害することはできますが、鍵へ近づくことはできません。
oracleが侵害される、またはBlockstreamが悪意を持つ場合。 攻撃者が入手するのは鍵shareの集合と、スクランブル済みPIN派生値の表です。どちらも単独では利用できません。派生値は各デバイスのunit keyと所有者のPINなしには情報を明かさず、鍵shareだけでウォレットを開くこともできません。oracleはアクセスを拒否できますが、bitcoinを使用することはできません。リカバリーフレーズがあればoracleなしで復元できます。
ネットワーク通信を盗聴した場合。 各試行では単調増加するリプレイ防止カウンターを備えた新しい暗号化セッションを使用するため、取得した通信や古い応答を再利用できません。
すべての経路が同じ場所で行き詰まります。必要な2つの秘密を同じ当事者が保持することがないためです。
Blockstreamがこの方式を採用した理由
Secure Elementベンダーは秘密保持契約のもとで製品を提供します。これを中心にウォレットを構築すると、最も重要なセキュリティ処理を行う部品が、ベンダー以外には確認できない唯一の部分になります。このトレードオフは、ウォレットレベルのプロトコル、ファームウェア、回路図、oracle実装を公開し、一般的なハードウェアで利用できるようにするJadeには受け入れられませんでした。
Virtual Secure Elementは部品ではなくプロトコルなので、市販ボードで組み立てたDIYハードウェアでも動作します。Secure Elementチップ、その秘密保持契約、コストを採用すれば、この可能性は失われます。
トレードオフ
鍵を2者に分割することで得られる実質的な利点がある一方、代償もあります。
PINでロック解除するにはoracleへ接続できる必要があります。接続できない場合もJadeは利用できます。デバイスをstatelessに動作させ、SeedQRのスキャンまたは手入力でリカバリーフレーズを直接入力すれば、oracleを一切使用しません。ウォレットそのものはJadeではなくリカバリーフレーズであり、Secure Elementの有無にかかわらず、どこでもウォレットを復元できます。
マイクロコントローラーは耐タンパー性を持つシリコンではなく、Jadeもそのような主張はしていません。Secure Elementは、電源が入ったデバイスに対するfault injectionや電力解析といった実験室レベルの攻撃にも耐性があります。Virtual Secure Elementが保護するのは、保存中の暗号化ウォレットと通信中のPINです。汎用チップを耐タンパー性チップに変えるものではありません。
2者間プロトコルは単一チップ設計より障害モードが増えます。「ネットワーク切断」と「PIN間違い」を正確に区別しなければ、一方向にしか進まないカウンターの試行回数を誤って消費します。この規律は公開されたファームウェアに実装され、誰でも確認できます。
自分で検証する
検証できなければ説明に意味はないため、すべてを公開しています。Jadeファームウェアとblind oracleサーバーはオープンソースです。PIN処理はデバイス側のmain/process/pinclient.cと、サーバー側のpindb.pyにあります。
技術的には、JadeはPINとデバイスのunit keyを入れ子のHMACで処理してpin_secretを導出します。サーバーが保存するのはSHA-256(pin_secret)、暗号化されたアカウント別key share、試行回数カウンターだけです。一致するとkey shareを返し、デバイスはHMAC(key_share, pin_secret)として最終AES鍵を導出します。リクエストには、単調増加するリプレイ防止カウンターによってサーバー鍵を調整した、一時的な楕円曲線Diffie-Hellman(ECDH)セッションを使用します。デバイス上のウォレットデータは、新しいランダムIVを用いるAES-256-CBCで暗号化され、IVと暗号文に対するHMAC-SHA256が付加されます。Jadeは復号前にこれを検証します。
- Jade Plusを入手
- 一般的な質問への短い回答はJadeセキュリティモデルFAQをご覧ください。
- Blockstreamのoracleではなく、自分のblind oracleを運用できます。