Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FIDO CTAP2 from Authenticator perspective

FIDO CTAP2 from Authenticator perspective

Yoshikazu Nojima

November 01, 2019
Tweet

More Decks by Yoshikazu Nojima

Other Decks in Programming

Transcript

  1. Copyright © Yoshikazu Nojima 2019 自己紹介 • 能島良和 • 通信キャリアでホスティングサービスの開発・運用

    • 前職は通信キャリア系SIerで社内向けにSpringのPJ支援業務 • Apache CloudStack Commiter(活動休止中。。) • WebAuthn4Jというライブラリ作ってます https://github.com/webauthn4j/webauthn4j RedHatのKeycloakでも採用されました • Twitter:@shiroica • GitHub:ynojima 1
  2. Copyright © Yoshikazu Nojima 2019 WebAuthn/FIDO CTAP2仕様とは パスワード認証の問題点を克服したセキュアな認証を実現するための Web標準/プロトコル仕様。セキュリティキーによる二段階認証や生体認証を実現。 ▪主な特徴

    • 指紋認証や顔認証など認証方式を差し替え可能 • 生体情報をサーバーで保存せず、安全性が高い • フィッシング攻撃、 CSRF攻撃対策の組込 WebAuthn、WebAuthn4Jについて詳細は以下スライドで解説: https://speakerdeck.com/ynojima/webauthn-and-webauthn4j-introduction 2
  3. Copyright © Yoshikazu Nojima 2019 FIDO CTAP2の守備範囲 • FIDO CTAP2仕様は認証デバイスとクライアント間のプロトコルを定義

    • NFC、BLE、USBをトランスポートに使用するアプリケーションプロトコル • FIDO Allianceが仕様策定元の標準化団体 • https://fidoalliance.org/specs/fido-v2.0-ps-20190130/fido-client-to- authenticator-protocol-v2.0-ps-20190130.html 3 3 User Authenticator Client Platform Relying Party WebAuthn API FIDO CTAP2 Platform API PIN認証 指紋認証 etc. Windows Hello, Touch ID NFC, BLE, USB
  4. Copyright © Yoshikazu Nojima 2019 CTAP2 コマンド コマンド 概要 authenticatorGetInfo

    認証デバイスの情報(AAGUID、 サポートしているオプション)を返却するコマンド authenticatorMakeCredential 鍵ペアを作成し、公開鍵等Credentialを返却するコマンド authenticatorGetAssertion 秘密鍵による署名を含むAssertionを返却するコマンド authenticatorGetNextAssertion Assertionが複数存在する場合に2個目以降を返却するコマンド authenticatorClientPIN PIN操作の為のコマンド authenticatorReset 認証デバイスをリセットするコマンド 4
  5. Copyright © Yoshikazu Nojima 2019 登録フロー 5 • ユーザー登録 認証デバイス

    クライアントプラットフォーム authenticatorGetInfoコマンド authenticatorGetInfoレスポンス authenticatorMakeCredentialコマンド authenticatorMakeCredentialレスポンス ユーザー検証機能付き認証デバイスの場合 認証デバイスの情報を要求 AAGUIDやサポートしているオプション、 拡張、プロトコルバージョン等を返却 サポートされているオプションの情報に則り、 鍵ペアの作成と公開鍵を含むCredentialの 返却を要求 公開鍵を含むCredentialを返却
  6. Copyright © Yoshikazu Nojima 2019 authenticatorGetInfoコマンド ▪リクエストパラメータ なし ▪レスポンスパラメータ ▪オプション

    6 メンバー 型 必須 定義 0x01 versions String[] Required 認証デバイスがサポートしているバージョンのリスト 値域:”FIDO_2_0”, “U2F_V2” 0x02 extensions String[] Optional サポートされている拡張のリスト 0x03 aaguid Byte[] Required 認証デバイスが主張しているAAGUID 0x04 options Map Optional サポートされているオプションのリスト 0x05 maxMsgSize Unit32 Optional 最大メッセージサイズ 0x06 pinProtocols Unit32[] Optional サポートされているPINプロトコルのリスト オプションID 定義 plat 取り外し不可能な認証デバイスか否か rk ResidentKeyか(=鍵情報を保存可能かか) clientPin PIN認証をサポートしているか。値域:true(サポート)、false(PIN未設定)、無指定(未サポート) up UserPresenceテストの実施をサポートしているか uv Userの検証を認証デバイスで実施可能か。値域:true(サポート)、false(検証情報未設定)、無指定(未サポート)
  7. Copyright © Yoshikazu Nojima 2019 authenticatorMakeCredentialコマンド ▪リクエストパラメータ ▪オプション 7 メンバー

    型 必須 定義 0x01 clientDataHash Byte[] Required 署名対象に含めるクライアントのデータのハッシュ 0x02 rp PublicKeyCredentialRpEntity Required Credentialを紐づけるRelyingPartyの情報 0x03 user PublicKeyCredentialUserEntity Required Credentialを紐づけるUserの情報 0x04 pubKeyCredParams Map[] Required Credentialで使用しても良いアルゴリズムのリスト 0x05 excludedList PublicKeyCredentialDescriptor[] Optional 登録済の場合登録を中断するCredentialIdのリスト 0x06 extensions Map Optional 拡張のリスト 0x07 options Map Optional オプションのリスト 0x08 pinAuth Byte[] Optional PIN認証で使用する情報 0x09 pinProtocol UInt32 Optional クライアントが選択したPINプロトコルバージョン オプションID 定義 rk 鍵マテリアルを認証デバイスに保存するか否か uv Userの検証を認証デバイスで実施するか否か
  8. Copyright © Yoshikazu Nojima 2019 authenticatorMakeCredentialコマンド ▪レスポンスパラメータ 8 メンバー 型

    必須 定義 0x01 authData Byte[] Required WebAuthnのAuthenticatorDataのCBORエンコード 0x02 fmt String Required WebAuthnのAttestationStatementの識別子 0x03 attStmt Byte[] Required WebAuthnのAttestationStatementのCBORエンコード
  9. Copyright © Yoshikazu Nojima 2019 認証フロー 9 • ユーザー認証 認証デバイス

    クライアントプラットフォーム authenticatorGetInfoコマンド authenticatorGetInfoレスポンス authenticatorGetAssertionコマンド authenticatorGetAssertionレスポンス ユーザー検証機能付き認証デバイスの場合 認証デバイスの情報を要求 AAGUIDやサポートしているオプション、 拡張、プロトコルバージョン等を返却 サポートされているオプションの情報に則り、 秘密鍵による署名を含むAssertionの返却を 要求 秘密鍵による署名を含むAssertionを返却 authenticatorGetNextAssertionコマンド authenticatorGetNextAssertionレスポンス Assertionが複数ある場合、 次のAssertionの返却を要求 Assertionが複数ある場合、 次のAssertionの返却
  10. Copyright © Yoshikazu Nojima 2019 authenticatorGetAssertionコマンド ▪リクエストパラメータ ▪オプション 10 メンバー

    型 必須 定義 0x01 rpId String Required RelyingPartyの識別子 0x02 clientDataHash Byte[] Required 署名したいデータのハッシュを指定 WebAuthnで利用する場合、ClientDataのハッシュ 0x03 allowList PublicKeyCredentialDescriptors[] Optional CredentialIdの候補のリスト 0x04 extensions Map Optional 拡張のリスト 0x05 options Map Optional オプションのリスト 0x06 pinAuth Byte[] Optional PIN認証で使用する情報 0x07 pinProtocol Uint32 Optional クライアントが選択したPINプロトコルバージョン オプションID 定義 up UserPresenceテストを実施するか uv UserVerificationテストを実施するか
  11. Copyright © Yoshikazu Nojima 2019 authenticatorGetAssertionコマンド ▪レスポンスパラメータ 11 メンバー 型

    必須 定義 0x01 credential PublicKeyCr edentialDes criptor Optional 試用されたPublicKeyCredentialDescriptor。リクエスト時に allowListに1つだけ指定していた場合は、このメンバは省略される 0x02 authData Byte[] Required WebAuthnのAuthenticatorDataのCBORエンコード 0x03 signature Byte[] Required 署名 0x04 user PublicKeyCr edentialUse rEntity Optional WebAuthnのPublicKeyCredentialUserEntity 0x05 numberOfCredentials Integer Optional 該当したCredentialの数
  12. Copyright © Yoshikazu Nojima 2019 authenticatorGetNextAssertionコマンド ▪リクエストパラメータ なし ▪レスポンスパラメータ 12

    メンバー 型 必須 定義 0x01 credential PublicKeyCr edentialDes criptor Optional 試用されたPublicKeyCredentialDescriptor。リクエスト時に allowListに1つだけ指定していた場合は、このメンバは省略される 0x02 authData Byte[] Required WebAuthnのAuthenticatorDataのCBORエンコード 0x03 signature Byte[] Required 署名 0x04 user PublicKeyCr edentialUse rEntity Optional WebAuthnのPublicKeyCredentialUserEntity
  13. Copyright © Yoshikazu Nojima 2019 まとめ • FIDO CTAP2はパスワード認証の問題点を克服した セキュアな認証を実現するための、WebAuthnと補完関係にある仕様

    • NFCやBLE、USBトランスポートの上で動くアプリケーションプロトコル • トランスポート間で共通のコマンド体系が整備 • 各コマンドを組み合わせてWebAuthnの操作は実現 • データ構造はWebAuthnと共用されている部分も多い 13
  14. Copyright © Yoshikazu Nojima 2019 AndroidでFIDO CTAP2 Authenticator • FIDO

    CTAP2はUSB/NFC/BLEのいずれかのトランスポートを持ち、 鍵を安全に保存する機能があるハードウェアなら実装可能であり、スマホは最適 15
  15. Copyright © Yoshikazu Nojima 2019 CTAP2 Authenticatorを実装して判明したポイント ◼ NFCトランスポートはUV/UPと相性が悪い •

    ユーザーがUV/UPの証明の為の操作をすると高い頻度で NFCリーダーのスイートスポットからずれて接続が切れて失敗する ◼ RPはAAGUIDだけでAuthenticatorを信頼してはならない • 攻撃者は不正なAuthenticatorを実装してAAGUIDを偽装可能 • Authenticatorのモデルを判別したい場合、AAGUIDのチェックだけでなく、 Attestation Certificateが信頼するルート証明書とチェーンすることの検証が必要 ◼ Authenticatorが真正なAndroid SafetyNet Attestationを返却しても、 安全に秘密鍵を保存するAuthenticatorだと信頼できるとは限らない • Android SafetyNet Attestation APIをAndroid上で独自に呼び出すことで、 Google Play開発者サービスのFIDO2 APIに頼らずAndroid SafetyNet Attestationを取得可能 • その場合、秘密鍵がFIDO2 APIのように安全に保存されていることは保証されない 16
  16. Copyright © Yoshikazu Nojima 2019 CTAP2実装上便利なツール WindowsのEvent Viewer Windows WebAuthn

    API経由でCTAP2 Authenticatorを操作した場合のログが確認可能 パス:“Applications and Services Logs/Microsoft/Windows/WebAuthn” 17