签名计数器
观察WebAuthn中已签名消息的结构时,您会注意到其中一个字段称为“签名计数器”。在之前的长篇文章中我曾建议忽略它,这仍然是正确的建议,但本文将解释具体原因。
实现可选性
签名计数器对认证器而言是可选的:安全密钥不实现签名计数器也是有效的,尽管绝大多数安全密钥确实实现了。在这种情况下,计数器值始终为零。但一旦网站看到非零值,安全密钥就必须确保该计数器对于给定凭证的所有未来断言严格递增。
检测克隆攻击
签名计数器的动机是它可能让网站检测到安全密钥何时被克隆。克隆安全密钥被认为非常困难,至少需要物理访问权限,并且可能需要花费大量时间进行侵入式调查。但如果假设所有这些都已发生,攻击者就可以克隆安全密钥(可能在此过程中破坏原始密钥),获取凭证的私钥,并创建一个可正常工作的副本,悄悄放回合法用户的 possession 中,使用户 unaware 任何异常。此时,攻击者可以随意创建断言,因为他们知道凭证的私钥。
如果所有这些都已发生,签名计数器可能会揭露这一情况。除非攻击者能准确知道合法用户何时创建了断言并因此增加了计数器,否则最终他们或真实用户会创建一个计数器未增加的断言。
实际应用考量
您可能已经看出,我认为这是一个相当牵强的场景。尽管如此,如果网站想要使用签名计数器,就必须将任何非递增的计数器视为锁定账户并触发调查的信号。至少,相关安全密钥应被更换。简单地拒绝断言没有意义:攻击者只需增加计数器并重试,而普通用户会认为这是暂时故障并做同样的事情。
然而,在我见过检查签名计数器的网站中,它们总是将其视为暂时性错误。我从未听说过签名计数器实际被用于捕获攻击。
隐私问题
另一方面,许多安全密钥只有一个全局签名计数器,这使得不同网站可以关联同一安全密钥的使用情况。也就是说,您安全密钥的当前计数器值在某种程度上具有识别性,可以与您使用频率的信息结合。因此,一些安全密钥实现了更细粒度的签名计数器,这很好,但我认为这相当浪费。
同步密钥的差异
当通行密钥在机器间同步时,它们从不实现签名计数器,因为这要求机器集合维护一致的值。因此,随着时间的推移,您可能会观察到大多数凭证没有签名计数器。