【WebAuthn】認証器としてTouch IDが利用されたかどうか判定してみる

はじめに

WebAuthnで認証器としてMacBookのTouch IDが利用されたかどうかRPで判定したい気がしていた。
するとGWに手が滑ってMacBook Air (Retina, 13-inch, 2018)を買ってしまい、手持ちのMacBookが二台になって検証できるようになった。
せっかくなので検証して、その結果をメモしておく。
今回は以下のデモサイトを用いて検証する。 demo.yubico.com

認証器のモデルの判定

認証器のモデルの特定はaaguid (Authenticator Attestation GUID) でおこなう。
上記で紹介したデモサイトでYubicoの製品を使って登録をすると、以下のように製品のモデルが表示される。

  • Security Key f:id:kent056-n:20190620213222p:plain

  • YubiKey 4 Series f:id:kent056-n:20190620213300p:plain

おそらくこの判定もaaguidによりおこなっているのではないかと思う。 (YubiKey 4 Seriesはfido-u2f attestationなのにaaguidから正確に判定できているのか謎)

fido-u2f attestationはaaguidが0x00になるので注意が必要だが、Touch IDはpacked attestation (self attestation) なので問題なさそう。

Touch IDの判定

さっそくデモサイトでTouch IDを利用してみる。
以下は、登録後の画面。先ほどのYubicoの製品を利用した時みたいに製品の情報は表示されない。 f:id:kent056-n:20190620211701p:plain

次に、MacBook Air (Retina, 13-inch, 2018)とMacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)それぞれで登録を行い、aaguidを比較してみる。

{
  "success": true,
  "attestationObject": {
    "attStmt": {
      "alg": -7,
      "sig": "MEUCIFzidjErMHcC09YUGplSH05BYu++nNgJ3qWxwopRbneGAiEA5Ouclw1Pflm1vuKnDeMGPRqKiUj3PjUpIIxkRtHd0mk="
    },
    "authData": {
      "credentialData": {
        "aaguid": "rc4AAjW8xgpkiwsl8fBVAw==",
        "credentialId": "AD3ZP3yPHJOtnEhNBbgftElwebHu2+mkJXjQqa5y4knrC13X7Xie/PWNugSr/UXWiKvJ6ZeIXhxmYZMCSMmpLQ/kInELz5/BRVkSZsYUE7Wq+3s5Y6tnpGjUJwCrkvJaYzA=",
        "publicKey": {
          "1": 2,
          "3": -7,
          "-1": 1,
          "-2": "epkLJQNrfh9m9p4nwGo7sK1GMgglkQazvqNIyL1flBA=",
          "-3": "f+rTwucl+o1/rYjLpMrSlx1cDBIiGIQBwa2UjFrA62g="
        }
      },
      "flags": {
        "AT": true,
        "ED": false,
        "UP": true,
        "UV": true,
        "value": 69
      },
      "rpIdHash": "xGzvgq0bVGR3WR0Aiwh1nsPm0uy085R0v+ppaZJdA7c=",
      "signatureCounter": 1561032466
    },
    "fmt": "packed"
  },
  "clientData": {
    "challenge": "sAYJw8ryLy_jyDqX9jADGwj_4-x54aavrc41kfMZ1q0",
    "origin": "https://demo.yubico.com",
    "type": "webauthn.create"
  },
  "device": {
    "name": "Unknown device",
    "type": "unknown"
  }
}
{
  "success": true,
  "attestationObject": {
    "attStmt": {
      "alg": -7,
      "sig": "MEQCICdX4bExE0u8FPdx6rgTXdqFGt9xD+VLpf+7r/NNQ2YCAiBsv9N+jlIsiS/6sOAX+geEUL5H7ThTrroR+NN9cI3itw=="
    },
    "authData": {
      "credentialData": {
        "aaguid": "rc4AAjW8xgpkiwsl8fBVAw==",
        "credentialId": "AEYJafU1xWSslkoR25s3tRzd5cJGqPttejySu76wdORtcM4PjKwJtWKaYjDUw851MfnHgSjXRlV+M8AUTrJrOyvVy8N3/SAZMKfn0tZr5jsKOiUr6oIWq8Px/WPReEybwLU=",
        "publicKey": {
          "1": 2,
          "3": -7,
          "-1": 1,
          "-2": "ldU1EdHtJywMgfm8cYydb4c/oH59o9Mnr2PDBl77vqE=",
          "-3": "PJohvgh2OZbT/c6z+qrv8Jiyu94PIV0RxxgnXuJJdXw="
        }
      },
      "flags": {
        "AT": true,
        "ED": false,
        "UP": true,
        "UV": true,
        "value": 69
      },
      "rpIdHash": "xGzvgq0bVGR3WR0Aiwh1nsPm0uy085R0v+ppaZJdA7c=",
      "signatureCounter": 1561015243
    },
    "fmt": "packed"
  },
  "clientData": {
    "challenge": "HNjfDLl8ASZpI8s-VB7SE7nqew1ddQo89DnLVyb0klc",
    "origin": "https://demo.yubico.com",
    "type": "webauthn.create"
  },
  "device": {
    "name": "Unknown device",
    "type": "unknown"
  }
}

MacBook Air (Retina, 13-inch, 2018)とMacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)でaaguidは同じだった。
おそらく、ChromeからMacBookのTouch IDを認証器として呼び出した場合のaaguidはrc4AAjW8xgpkiwsl8fBVAw==になるようだ。

おわりに

以下まとめです。

  • 確証はないが認証器としてTouch IDが利用されたかどうかは判定できそう

  • MacBook AirMacBook Proでaaguidに変化はない

  • Chrome以外のブラウザから認証器としてTouch IDを呼び出した場合にどうなるかは不明

おまけ

別の人がMac Book Proを持っていたので念には念をいれて一応確認してみた。

{
  "success": true,
  "attestationObject": {
    "attStmt": {
      "alg": -7,
      "sig": "MEUCIQDw3lx6tfEJWDH2+VDCrZE2giDbI2z8Skx4YNtzFGA72QIgR6ucKwCfWEShXQAHPqPwXNv5cNsjBegsGh9YO3C2FUI="
    },
    "authData": {
      "credentialData": {
        "aaguid": "rc4AAjW8xgpkiwsl8fBVAw==",
        "credentialId": "AB1ZRA8GxEx5Q37k5csN9glkPrmZXx/pG/zRWaD5Ccz5okPBScxmCUN+mjjo9Lu0SKQXvTTDAQHgnu+weefXzRtbqWcc5E9GfjuPMcQPJLrgN282ffuwgBcHwdgd9qzvxXw=",
        "publicKey": {
          "1": 2,
          "3": -7,
          "-1": 1,
          "-2": "/enNu+rmfc1g/OO6yq5u+ygYcN0N2ew/TiCpxh85bOk=",
          "-3": "hIyjyekzludhdfhWjhuPWsm/wxwSYALsxqNlyGpy/cw="
        }
      },
      "flags": {
        "AT": true,
        "ED": false,
        "UP": true,
        "UV": true,
        "value": 69
      },
      "rpIdHash": "xGzvgq0bVGR3WR0Aiwh1nsPm0uy085R0v+ppaZJdA7c=",
      "signatureCounter": 1561015290
    },
    "fmt": "packed"
  },
  "clientData": {
    "challenge": "_-iFeOfhI4ZNFgrx3uWQSdWLMvHJf_SmA38Xu_ybzOU",
    "origin": "https://demo.yubico.com",
    "type": "webauthn.create"
  },
  "device": {
    "name": "Unknown device",
    "type": "unknown"
  }
}

やっぱりrc4AAjW8xgpkiwsl8fBVAw==だった。