OKX Pay,谷歌密码管理器,和被覆盖的Passkey
OKX Pay, Google Password Manager, and the overwritten Passkey
The thing
OKX最近推出了他们的Pay产品,强化社交和支付概念、弱化了区块链钱包概念,本质是”自托管“多签区块链钱包,OKX托管+用户Passkey各存有一半权限的私钥*。目前在推广期,给出了APY5%的存款年利率。
*存疑,推特有用户说OKX存的那一份私钥也是完整权限,如果是这样的话,本质是OKX+用户各拥有一份完整权限私钥。
The cause
第一次打开OKX Pay页面要求新建Passkey,安卓是默认保存到谷歌密码管理器。
在其它未登录谷歌账号(或已登录谷歌账号,但是长期未使用需要验证)的新设备上打开OKX Pay支付时会提示没有Passkey,这个时候可以选择”登录密码管理器“或”新建Passkey“。如果选择新建Passkey,并且登录了和先前设备同一个谷歌账号,则会导致谷歌密码管理器中的已有Passkey被覆盖为新的Passkey。因为本质是个多签钱包,所以新Passkey需要已有Passkey进行授权才能正常进行支付操作。bug就来了:已有的Passkey已经被新的Passkey覆盖了,没有已有的Passkey进行授权,新的Passkey就是个废物。
The bug
谷歌密码管理器会”覆盖“同一个user id的Passkey。
好消息是,这只是界面上的覆盖,先前的Passkey未被删除,仍然存在于谷歌密码管理器云服务里,但是无法在谷歌密码管理器界面、网页版中查看到,也无法在本地Passkey发现中调用。
OKX添加Passkey时,虽然不同的Passkey使用了不同的Username,但是使用了同一个user id,导致在同一个谷歌账号中添加多个Passkey会存在覆盖效果。
如图中所示,okx.com的三个Passkey user id均为b3365d…,导致了覆盖效果。
The solution
需要一台已经root的安卓手机,登录同一个谷歌账号,打开一次OKXPay支付界面进行Passkey云同步。
利用代理软件禁用com.google.android.gms的网络防止云同步最新的Passkey数据,然后手动编辑(编辑前备份)
1 | adb shell |
谷歌云服务同步文件,将webauthn_credential_index中之后的Passkey条目删除,即可调用先前的Passkey。
(哪条Passkey是之后添加的?可以通过id字段join sync_entities表中value列进行查找。数据是Protobuf格式)
使用旧Passkey进行任意支付操作,会同时给最新的Passkey进行授权。之后恢复网络,会同步最新的Passkey数据消除本地编辑。
The result
覆盖添加Passkey的bug反馈给OKX了,也不知道之后会不会修。
另外,OKX宣传称有ZK Email技术可以找回Passkey,但是在我和客服的对话中藏着不给用。