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

FIDO CTAP2 from Authenticator perspective

FIDO CTAP2 from Authenticator perspective

Avatar for Yoshikazu Nojima

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