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
    AuthenticatorからみたFIDO CTAP2
    2019-09-18 iddance#2
    能島 良和 (@shiroica)

    View Slide

  2. Copyright © Yoshikazu Nojima 2019
    自己紹介
    • 能島良和
    • 通信キャリアでホスティングサービスの開発・運用
    • 前職は通信キャリア系SIerで社内向けにSpringのPJ支援業務
    • Apache CloudStack Commiter(活動休止中。。)
    • WebAuthn4Jというライブラリ作ってます
    https://github.com/webauthn4j/webauthn4j
    RedHatのKeycloakでも採用されました
    • Twitter:@shiroica
    • GitHub:ynojima
    1

    View Slide

  3. Copyright © Yoshikazu Nojima 2019
    WebAuthn/FIDO CTAP2仕様とは
    パスワード認証の問題点を克服したセキュアな認証を実現するための
    Web標準/プロトコル仕様。セキュリティキーによる二段階認証や生体認証を実現。
    ■主な特徴
    • 指紋認証や顔認証など認証方式を差し替え可能
    • 生体情報をサーバーで保存せず、安全性が高い
    • フィッシング攻撃、 CSRF攻撃対策の組込
    WebAuthn、WebAuthn4Jについて詳細は以下スライドで解説:
    https://speakerdeck.com/ynojima/webauthn-and-webauthn4j-introduction
    2

    View Slide

  4. 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

    View Slide

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

    View Slide

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

    View Slide

  7. 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(検証情報未設定)、無指定(未サポート)

    View Slide

  8. 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の検証を認証デバイスで実施するか否か

    View Slide

  9. 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エンコード

    View Slide

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

    View Slide

  11. 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テストを実施するか

    View Slide

  12. 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の数

    View Slide

  13. 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

    View Slide

  14. Copyright © Yoshikazu Nojima 2019
    まとめ
    • FIDO CTAP2はパスワード認証の問題点を克服した
    セキュアな認証を実現するための、WebAuthnと補完関係にある仕様
    • NFCやBLE、USBトランスポートの上で動くアプリケーションプロトコル
    • トランスポート間で共通のコマンド体系が整備
    • 各コマンドを組み合わせてWebAuthnの操作は実現
    • データ構造はWebAuthnと共用されている部分も多い
    13

    View Slide

  15. Copyright © Yoshikazu Nojima 2019
    APPENDIX
    14

    View Slide

  16. Copyright © Yoshikazu Nojima 2019
    AndroidでFIDO CTAP2 Authenticator
    • FIDO CTAP2はUSB/NFC/BLEのいずれかのトランスポートを持ち、
    鍵を安全に保存する機能があるハードウェアなら実装可能であり、スマホは最適
    15

    View Slide

  17. 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

    View Slide

  18. Copyright © Yoshikazu Nojima 2019
    CTAP2実装上便利なツール
    WindowsのEvent Viewer
    Windows WebAuthn API経由でCTAP2 Authenticatorを操作した場合のログが確認可能
    パス:“Applications and Services Logs/Microsoft/Windows/WebAuthn”
    17

    View Slide

  19. Copyright © Yoshikazu Nojima 2019
    CTAP2実装上便利なツール
    http://cbor.me
    CTAP2でよく使われているCBORをデコードし、読みやすい形式で表示してくれるサイト
    18

    View Slide