Merkle-Tree
Merkle 樹中的葉節點弱點如何被利用?
最近披露了 merkle 樹的葉節點的一個弱點,並聲稱該問題可用於欺騙 SPV 節點。該弱點如何使 SPV 節點容易受到攻擊?攻擊者會怎樣利用這種攻擊?
在比特幣中,默克爾樹的內部節點是通過將兩個 32 字節的 SHA256d 雜湊連接在一起來建構的。對生成的 64 字節值進行散列以獲取樹中的下一個節點。葉節點是交易本身。默克爾樹用於證明交易是區塊的一部分,因為默克爾根被放置在區塊頭中以進行工作證明。
然而,僅僅給定一個 merkle 分支來證明一個交易在一個區塊中的存在(正如 SPV 錢包所需要的那樣),不可能區分分支中的哪個節點是內部節點,哪個是葉節點。因此,可以構造一個特殊的 64 字節事務,使 SPV 節點認為它實際上是樹的內部節點而不是葉節點。
該特殊交易的最後 32 個字節的構造方式使其也是另一個虛假交易的有效散列。可以修改虛假交易和特殊交易的最後 32 個字節,以暴力破解交易雜湊,該雜湊也作為特殊交易的最後 32 個字節有效。
一旦特殊交易被包含在一個區塊中,攻擊者就可以向 SPV 節點提供虛假證明,以“證明”該虛假交易是區塊鏈的一部分。這個假證明將是特殊交易的合法 merkle 分支,但也包括特殊交易,就好像它是 merkle 樹的內部節點,假交易成為葉節點。
為了防止這種攻擊,SPV 節點可以簡單地驗證 merkle 分支的內部節點是否也是有效交易。此類事件極不可能發生,並且此類交易也是非標準的,因此除非正在執行此特定攻擊,否則不太可能將其包含在塊中。