Issue 946993: Touch ID authenticator returns attestedCredentialData in GetAssertion response

はじめに

先日chromiumバグ報告デビューしました。
該当箇所としては、Chromeでnavigator.credentials.get()を呼び出した後にMacBookのTouch IDを認証器として利用した際のAuthenticator Dataです。
こちらは、ChromeからMacBookのTouch IDを利用したWeb Auhtenticationを実装していた際に見つけたものになります。 qiita.com

StatusがFixedになり、クローズされたようなので今回報告した内容について記録しておきます。 bugs.chromium.org

Authenticator Dataについて

そもそもAuthenticator Dataについてですが、WebAuthentication APIのnavigator.credentials.create()およびnavigatro.credentials.get()を呼び出した際の結果に含まれるデータになります。 (https://www.w3.org/TR/webauthn/#sec-authenticator-data
各パラメーターについては以下の通りです。

  • rpIdHash : rpIdのハッシュ値
  • flags : User VerificationやUser Presenceの結果
  • signCount : カウンタ
  • attestedCredentialData : 公開鍵に関する情報

また、Authenticator Dataの構造については以下のとおりです。 https://www.w3.org/TR/webauthn/images/fido-signature-formats-figure1.svg
(引用元 : https://www.w3.org/TR/webauthn/

報告内容

問題箇所は、Chromeでnavigator.credentials.get()を呼び出した後にMacBookのTouch IDを認証器として利用した際のAuthenticator Dataです。
Touch IDを利用したWeb Authenticationを試していた際に、YubiKeyを認証器とした場合と比べてAuthenticator Dataのサイズがかなり大きいことに気づきました。

認証時のAuthenticator Dataはこちらの画像のように、37byteなのではないかと考えていたので、counterが長すぎるのではないかと報告しました。(後にこの考えは間違いで、extensionsがセットされている場合は37byteより長くなるということを教えていただきました) f:id:kent056-n:20190331134153p:plain (引用元 : https://slides.com/fidoalliance/jan-2018-fido-seminar-webauthn-tutorial#/
報告をすると、すぐに以下のような回答をいただきました。

Thanks for the report. The counter looks correct, but I think it erroneously appends includes attestedCredentialData in the authenticatorData, when it should be omitted during a GetAssertion operation.

どうやら、認証時のAuthenticator DataにattestedCredentialDataが含まれて返されていたようです。 (そういえば以前、認証時のAuthenticator Dataを登録時のAuthenticator Dataのparserに入れたら何かでてきたのを思い出した)

最終的に、認証時のAuthenticator Dataについて、extensionsがセットされている際に37byteより長くなることはあるが、attestedCredentialDataは必要ないという結論になり、修正されました。

It can be longer than 37 bytes if extensions are sent (in which case the extensions bit is set in the authenticatorData flags). You are correct though, that the authenticator should not send attestedCredentialData for a GetAssertion operation.

参考

https://www.w3.org/TR/webauthn/
https://slides.com/fidoalliance/jan-2018-fido-seminar-webauthn-tutorial#/
https://bugs.chromium.org/p/chromium/issues/detail?id=946993&can=2&start=0&num=100&q=&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified&groupby=&sort=