作者:Dark Skippy Disclosure

来源:https://darkskippy.com/taxonomy.html

简单介绍攻击者可能创建恶意签名设备的方法可能会有所帮助。我们按照签名算法的元素,为每一种攻击分了类。

回忆一下,Schnorr 签名算法使用私钥 $x$ ,其公钥为 $X = x·G$,对一条消息按如下步骤制作签名:

  1. 采样出随机 nonce 秘密值 $r$,并计算 nonce 公开值 $R = r·G$ 。
  2. 计算挑战值:$c = HASH(X||R||message)$
  3. 计算响应值:$s = r + c·x$
  4. 输出签名:$(R, s)$

以下是攻击的类型:

预先确定的种子攻击 —— x 是攻击者已知的

这种攻击是说:恶意的签名设备在生成钱包的阶段就输出一个攻击者已经提前知晓的种子词。这种攻击很容易实施,但难以发觉甚至不可能发现。在 “Dark Skippy” 出现之前,我们猜,这应该是性价比最高的攻击,而且确实在试验室之外发现过这种攻击。用户可以通过提供自己安全生成的种子词来缓解这种攻击。

恶意 XPUB 攻击 —— 用来生成地址的 X 并非从 x·G 中计算出来

即使提供了一个安全生成的种子词,恶意的签名器依然可以在属于本钱包的公钥上说谎,通常是显示一个并不对应于秘密种子的 xpub 。用户在收款时,会直接把钱转到攻击者所控制的地址,而不是用自己种子词派生出来的地址。这种攻击可以通过使用另一款设备来验证从秘密种子到公钥的转化,来发现。

预先确定的 nonce 攻击 —— r 是攻击者已知的

恶意的签名器可以在签名过程中是由一个预先确定的 nonce 值,从而攻击者可以轻松从签名中求解出私钥。因为比特币的签名器通常会使用派生出来的私钥,所以攻击者凭此只能抽取出一个私钥,而且刚好是正在被花费的资金的私钥;也就是说,攻击者只能通过 RBF(手续费替换交易)来盗取正在被花费、等待确认的资金。这种攻击可以使用 “anti-exfil” 签名协议来缓解。

Nonce 研磨攻击 —— R 嵌入秘密数据

恶意的签名器可以通过不断尝试不同的 nonce 秘密值,使得 nonce 公开值具有一些特征,从而泄露主秘密值(种子词)。通过从用户签名的 nonce 公开值中收集足够多的信息,攻击者就能复原出主秘密种子。这种攻击难以实施,因为需要尝试许多比特,相应地要付出许多计算,与此同时,按顺序识别出一定数量的受影响的签名也有难度。 这种攻击可以使用 “anti-exfil” 签名协议来缓解。

Dark Skippy —— r 嵌入秘密数据

恶意的签名器可以通过在低熵 nonce 秘密值中编码私钥、在签名中使用它们,来泄露主秘密值。攻击者可以使用一种算法(比如 Pollard 的 Kangaroo 算法)来反算 nonce 公开值,从而抽取出数据。只需拼凑少数几个解出的 nonce 秘密值,攻击者就能复原出主秘密种子。

Dark Skippy 跟预定 nonce 攻击不同。在 Dark Skippy 中,攻击者不知道 $r$ ,只是 $r$ 足够小,所以使用 Pollard 的 Kangaroo 算法(这一类的算法),可以从 $R$ 中求解 $r$ 。这可以说是 nonce 研磨攻击的一种超级加速版本。Nonce 研磨需要付出指数级的运算量($2^n$ ),才能嵌入 $n$ 比特的数据,同时保证抽取的速度。而在 Dark Skippy 中,嵌入数据很快,抽取则需要 $2^{(n/2)}$ 的运算量。所以,Dark Skippy 整体上来说是平方级的加速,并且攻击者不会受制于签名设备本身的运算能力。

- - -

请注意,这里说的每一种攻击同时也对 ECDSA 签名有效。