Security

LND 中的 2022 年 11 月錯誤是什麼,是什麼導致了它,以及什麼會防止將來出現類似的錯誤?

  • November 6, 2022

由於 LND/btcd(Go 中的替代比特幣實現)中的錯誤,LND 使用者被要求從 2022 年 11 月(就像他們在2022 年 10 月一樣)緊急更新他們的閃電節點軟體。什麼是錯誤,是什麼原因造成的?它會影響誰,他們會不會賠錢?將來如何防止類似的錯誤?

這個 2022 年 11 月的錯誤與 2022 年 10 月的錯誤非常相似。這一次它影響了更多的開源項目(例如LiquidLDK),因為 rust-bitcoin 也無法處理 Burak 廣播的交易。與之前交易符合 2021 年 11 月在網路上啟動的 Taproot 共識規則一樣,被 F2Pool 包含在一個區塊中(似乎它是直接送出給 F2Pool,因為該交易不符合比特幣核心節點中目前的預設策略規則)和由所有比特幣核心完整節點(但不是 btcd 和 rust-bitcoin)驗證。

Burak 在這裡解釋了錯誤的來源:

比特幣有一個共識規則,將連續堆棧項目的數量限制為 1000。但是,無論如何,包含 OP_SUCCESSx 的 P2TR 支出優先於該規則。

我做了一個包含 OP_SUCCESSx 操作碼和 500,001 個空推送的 P2TR 支出,結果導致 btcd 和核心之間的共識衝突: https ://blockstream.info/tx/73be398c4bdc43709db7398106609eea2a7841aaf3a4fa2000dc18184faa2a7e

將 maxWitnessItemsPerInput 參數從 500,000 更改為 4,000,000 可以解決問題: https ://github.com/btcsuite/btcd/blob/master/wire/msgtx.go#L103

相關程式碼行是導致 2022 年 10 月錯誤的行上方的行(感謝 AJ 最初指出這一點)。它由 Elle Mouton 在此PR中修復。maxWitnessItemsPerInput以前是唯一的500,000並且需要被撞到以4,000,000滿足 Taproot 共識規則。為什麼以前500,000不清楚。正如彼得在評論中所說:

由於隔離見證已經存在,500000 的值作為限制總是錯誤的。BIP141 甚至明確地說明了這一點:“如果版本字節是 1 到 16,則不會發生對見證程序或見證堆棧的進一步解釋,並且見證堆棧沒有大小限制。”。它無法使用標準事務觸發,但主根仍然是這種情況。

就誰受到影響而言,答案與 2022 年 10 月的回答中所說的非常相似,只是這次 LDK 也受到了影響。Core Lightning 和 eclair 不受影響:

至於它會影響誰以及他們是否會賠錢,這取決於 LND 使用者、渠道交易對手是否試圖利用此漏洞以及使用者能夠以多快的速度更新到 LND v0.15.2。其他閃電節點實現(Core Lightning、eclair、LDK 等)不受影響。如果 LND 節點由 btcd 全節點支持,則 btcd 全節點也需要更新。如果 LND 使用者無法快速更新,有兩種方法可以利用此漏洞。渠道交易對手可以廣播撤銷狀態,除非 LND 節點在 2 週內恢復或使用外部瞭望塔,否則資金可能會以這種方式失去。此外,如果 LND 節點是路由節點,如果在超時之前通道交易對手未提供 HTLC 雜湊原像,則其無法關閉通道可能會導致資金損失。

引用自:https://bitcoin.stackexchange.com/questions/115833