
ポータブルで、TPM 2.0を使用したハードウェアバックアップのWebAuthn認証情報。マスターシードから派生した決定論的な親鍵により、デバイス間での認証情報の移植性を実現。署名用の秘密鍵はTPMから決して外に出ません。ブラウザ拡張機能とCLIを含みます。
⚠️ 初期の概念実証です。 このプロジェクトは十分にテストまたは監査されていません。実験以外の目的では使用しないでください。
TPM 2.0 を使用して複数のデバイスで動作する、移植可能なハードウェアバックアップ付き WebAuthn/パスキー認証情報。
従来の TPM 認証情報は、それを作成したデバイスに固定されています。このプロジェクトでは、マスターシードから派生した決定論的な親キーを各デバイスの TPM にインポートすることで、それらを移植可能にします。これにより、ある TPM で暗号化された認証情報ブロブは、同じシードでプロビジョニングされた他の TPM でロードして使用できます。秘密署名キーは、各認証情報に対して TPM によってランダムに生成され、ハードウェア外で平文で存在することはありません。
マスターシードは、プロビジョニング時にデバイスごとに一度だけ必要です。その後、すべての暗号操作は完全に TPM 内で行われます。
ブラウザ拡張機能が navigator.credentials をオーバーライドし、WebAuthn 呼び出しをネイティブメッセージング経由で TPM と直接通信する Python バックエンドにルーティングします。登録時には、TPM はポータブル親キーの下に新しい署名キーを作成し、暗号化されたブロブを返します。認証時には、ブロブをロードし、内部で復号化してチャレンジに署名します。
Linux (Debian/Ubuntu):
sudo apt install tpm2-tools python3-tpm2-pytss python3-cryptography
Windows:
pip install cryptography
Windows は ctypes を介して TBS (TPM Base Services) 経由で TPM と通信するため、追加のネイティブパッケージは必要ありません。
ブラウザ拡張機能は、ネイティブメッセージングを介して native_host.py と通信します。Firefox にホストの場所を伝えるマニフェストを登録する必要があります。
ファイル ~/.mozilla/native-messaging-hosts/webauthn_tpm_portable.json を作成します:
{
"name": "webauthn_tpm_portable",
"description": "WebAuthn TPM Portable Credentials Backend",
"path": "/absolute/path/to/native_host.py",
"type": "stdio",
"allowed_extensions": [
"[email protected]"
]
}
path を native_host.py の絶対パスに置き換えます。実行可能であることを確認してください (chmod +x native_host.py)。
Windows では、ネイティブメッセージングマニフェストは Windows レジストリを介して登録されます。詳細については、Firefox ネイティブメッセージングドキュメント を参照してください。
cd extension
npm install
npm run build
次に Firefox で:
about:debugging#/runtime/this-firefox を開くextension/dist フォルダ内の任意のファイル (例: manifest.json) を選択拡張機能のポップアップを開き、既存のシードを貼り付けるか、「生成」をクリックして新しいシードを作成し、「プロビジョニング」をクリックします。新しいシードを生成した場合は、安全な場所に保存してください。追加のデバイスをプロビジョニングするために必要になり、紛失すると新しいデバイスをセットアップできなくなります (すでにプロビジョニングされたデバイス上の既存の認証情報は引き続き機能します)。
プロビジョニングは CLI からも実行できます:
./webauthn_cli.py provision --generate
# or with an existing seed:
./webauthn_cli.py provision <seed_hex>
./webauthn_cli.py test
これにより、認証情報が作成され、チャレンジに署名され、署名が検証されます。
webauthn_cli.py [--backend=BACKEND] <command> [args]
コマンド:
バックエンド (--backend または環境変数 WEBAUTHN_BACKEND で選択):
| バックエンド | 説明 |
|---|---|
tpm | クロスプラットフォーム TPM (デフォルト) |
linux | Linux 専用、tpm2-pytss ライブラリを使用 |
soft | 純粋なソフトウェア、TPM 不要 (テスト用) |
認証情報の署名キーは TPM 内部で生成され、平文で TPM の外に出ることはありません。認証情報 ID 内の暗号化されたブロブは、プロビジョニングされた TPM にアクセスできなければ無価値です。ソフトウェアベースの認証情報ストアとは異なり、秘密キーは認証中にホストメモリに存在しないため、コールドブート攻撃やマルウェアによるキー抽出から保護されます。
TPM2_Duplicate (理論上キーをエクスポートできる可能性がある) は、認証情報が空の authPolicy で作成されるためブロックされており、システムへの完全なアクセスがあっても複製は不可能です。
プロビジョニングされたシステム上で動作するマルウェアは、ユーザー検証 (ボタン押下や生体認証) がないため、TPM にチャレンジへの署名を要求できます。キーを抽出することはできませんが、アクティブな間はそれらを使用できます。これは、マルウェアがキーを直接盗むことができるソフトウェアベースの認証情報ストアよりも攻撃対象領域が狭いです。
マスターシードは信頼のルートです。もし漏洩した場合、攻撃者は自身の TPM をプロビジョニングし、入手した認証情報ブロブを使用できます。紛失し、プロビジョニングされたすべてのデバイスが利用できなくなった場合、認証情報は回復不可能です。ハードウェアウォレットのリカバリーフレーズと同様に、オフラインで安全な場所に、理想的には冗長性を持たせて (例: 複数の場所に分割) 保管してください。
このプロジェクトには、交換可能な 3 つのバックエンドが含まれています:
webauthn_tpm_portable.py はプライマリバックエンドです。バイトレベルで TPM コマンドを構築し、Linux (/dev/tpmrm0) と Windows (ctypes 経由の TBS API) の両方で動作します。webauthn_tpm_linux.py は tpm2-pytss Python ライブラリを使用し、Linux でのみ動作します。webauthn_soft.py は純粋なソフトウェア実装であり、TPM なしで同じ認証情報形式をエミュレートします。テストや開発には便利ですが、ハードウェア保護は提供しません。/dev/tpmrm0 に対する「許可がありません」:
ユーザーを tss グループに追加して再ログイン: sudo usermod -aG tss $USER
tpm2-pytss のインポートエラー:
sudo apt install python3-tpm2-pytss または pip install --upgrade tpm2-pytss --break-system-packages を試してください。
拡張機能がネイティブホストに接続しない:
ネイティブメッセージングマニフェストの path が native_host.py を指す絶対パスであることを確認してください。Firefox のブラウザコンソール (Ctrl+Shift+J) を開いて、拡張機能からのエラーを確認してください。
MIT
| コマンド | 説明 |
|---|
status | TPM がプロビジョニングされているか確認 |
provision --generate | ランダムなシードを生成してプロビジョニング |
provision <seed_hex> | 既存のシードでプロビジョニング |
create <rp_id> | 証明書利用者 (RP) の認証情報を作成 |
sign <cred_id> <rp_id> <challenge> | チャレンジに署名 |
verify <cred_id> <rp_id> <challenge> <sig> | 署名を検証 |
clear | TPM からポータブル親キーを削除 |
test | 完全な作成/署名/検証サイクルを実行 |