## 介绍
交易可塑性是比特币系统中的一个漏洞,它允许攻击者在交易在网络上确认之前更改交易的唯一标识符。这种更改可能会导致交易看起来不存在,从而产生双重存款或双重取款的可能性。在本文中,我们将研究这种攻击的机制、其后果和防御方法。
## 签名合规性
### ASN.1 和 DER
可延展性的第一种形式在于签名本身。每个签名都只有一个以 DER 编码的 ASN.1 八位字节表示。但是,用于比特币加密操作的库 OpenSSL 并不严格遵守此标准。这意味着可以更改签名,使其仍然被视为有效,但其呈现方式会有所不同。
### ECDSA 和签名修改
对于每个 ECDSA 签名 (r,s),都有一个等效签名 (r, -s (mod N)) 对同一消息也有效。这允许攻击者更改签名而不影响其有效性,从而导致交易 ID 发生变化。
## ScriptSig 灵活性
### 签名算法
比特币中使用的签名算法不会对 ScriptSig 进行签名来创建签名。这意味着可以在所需的签名和公钥之前添加其他数据并将其推送到堆栈上。例如,您可以添加 OP_DROP 命令,以便在执行 scriptPubKey 之前使堆栈与之前完全相同。
### 对交易 ID 的影响
更改 ScriptSig 会导致交易 ID 发生变化,从而使攻击者可以假装交易没有发生。这在比特币交易所尤其危险,因为它可以用于双重存款或双重取款。
## 保护方法
### 测试签名库的灵活性
防御交易灵活性攻击的一种方法是检查所使用的签名库以确保其灵活性。例如,按照 BIP-0066 中的建议,转而使用强 DER 签名可以显著降低攻击风险。
### 协议变更
另一种保护方法是对比特币协议本身进行更改。例如,实施隔离见证(SegWit)允许将签名与交易数据分离,从而无法通过更改签名来更改交易ID。
## 结论
交易灵活性攻击对比特币系统构成了严重威胁,因为它允许攻击者更改交易 ID,使其看起来不存在。这可能会导致财务损失并破坏对系统的信任。但是,有一些安全技术,例如使用强 DER 签名和实施 SegWit,可以大大降低这种攻击的风险。重要的是,比特币开发人员和用户要意识到这个漏洞并采取措施防止它。
链接
1. 交易可延展性
2. BIP-0066:强 DER 签名
3. EIP-2:Homestead 硬分叉变更