“可塑性交易”攻擊不會被常識所挫敗嗎?
我試圖理解可塑性交易攻擊,因為在我看來,首先只有一個相當粗心的操作員才會容易受到攻擊,如下所述。
主要是澄清一下自己的想法,就我理解的攻擊描述一下。Dramatis personae:Alice 是攻擊者,Bob 是“銀行家”(交易所運營商,網路錢包;為 Alice 持有代幣的人。)
Alice:嗨,Bob,我的賬戶中有 1 個 BTC,我想提取它。請將其發送至地址 1Alice1。
Bob:好的,我已經生成了一個交易,它的雜湊是 123abc。我剛剛將它發佈到 p2p 網路。它花費先前交易 987def 的輸出 3 並將 1 BTC 發送給 1Alice1。您的賬戶已被扣除 1 BTC,而您的新余額為 0。
愛麗絲:謝謝,我看到了交易。我會等待確認。
現在 Alice 構造了一個“突變”交易,效果和 123abc 一樣;它仍然花費 987def 的輸出 3 並向 1Alice1 發送 1 個 BTC,簽名仍然驗證,但突變體具有不同的雜湊 456bca。不知何故,Alice 將 456bca 而非 123abc 放入區塊鏈。也許她在 p2p 網路上的連接比 Bob 更好,或者她賄賂礦池運營商 Polly 以優先考慮 456bca。由於 123abc 與 456bca 衝突,因此 123abc 永遠不會被確認。
一段時間過去了。
愛麗絲:嘿,鮑勃,還記得我應該得到的 1 個比特幣嗎?交易從未確認。
鮑勃:讓我檢查一下。是的,我明白了,區塊鏈中沒有像 123abc 這樣的交易。好吧,我猜你從來沒有得到你的硬幣;對於那個很抱歉。我會重新貸記您的帳戶;你的新余額是 1 BTC。
愛麗絲:謝謝。現在我的帳戶中有 1 BTC,我想再次嘗試提取它。發送給 1Alice2。
Bob:好的,我已經生成了一個交易,它的雜湊是 246fed。我剛剛將它發佈到 p2p 網路。它花費了先前交易 369dbc 的輸出 7。您的帳戶已被借記並且餘額再次為 0。
交易 246fed 被正常確認。
愛麗絲:明白了,鮑勃!畢竟,您的原始交易以 456bca 的突變形式完成了。現在我擁有它和新交易,我剛剛從你那裡偷了 1 個比特幣。哇哈哈!
鮑勃:哦,可悲的是我!
然而,這種攻擊似乎需要 Bob 進行一些相當粗心的簿記。即使 Bob 不知道有可塑性交易這樣的東西,他也知道他生成了 123abc 並將其放到網路上,並且據他所知,它仍然漂浮在外面。所以我認為在重新記入 Alice 的賬戶之前,常識應該規定 Bob 確保 123abc 不能在未來某個日期得到確認,也許是通過將相同的輸入(trans 987def output 3)花費到其中一個的新交易(963dad)他自己的地址(1Bob1),等待 963dad 確認。當然,在目前情況下,963dad 永遠不會確認(因為 456bca 取代了它),Bob 最終會厭倦等待並進一步調查。
或者,當 Alice 第二次要求提取 1 BTC 時,Bob 與 Alice 的新交易 (678bbb) 應該再次花費相同的輸入 (987def:3),以確保 Alice 以後無法以某種方式獲得 123abc 確認。這也阻止了攻擊,因為 678bbb 已被 456bca 無效。
此外,由於 Alice 的突變交易 456bca 實際上確實花費了 Bob 的輸入(987def:3),Bob 的客戶端軟體不應該通知他該輸入不再對他可用,並相應地調整他的餘額嗎?Bob 顯然認為 123abc 失敗,因此他仍然控制該輸入,因此這應該會使他的賬簿失去平衡並提醒他有問題。
我的理解是,世界上的 Bob 已經通過抱怨“可延展交易”是他們無法預料到的晦澀的協議錯誤來回應這個問題。不管這是否屬實,在我看來,為了變得脆弱,鮑勃的會計實踐已經不得不疏忽大意,所以他真的沒有任何辯護理由。
或者,如果 Bob 看到了危險信號但未能理解情況,為了客戶服務的利益,無論如何都將 Alice 的賬戶記入了賬戶,那麼仍然很難對他產生太多的同情。
這個帳戶本質上是準確的,還是我錯過了一些關鍵細節?
謝謝,很抱歉的長度。
從本質上講,你已經複製了沒有人需要擔心這個問題的論點,我們現在知道這是錯誤的。正是因為這種信念,我們才有了現在的爛攤子。
您錯過的一個關鍵細節是,在花費先前交易的輸出時,您必須在新交易中指定其交易 ID。所以還有很多其他可能的失敗場景。
例如,假設您只形成了花費您自己的輸出的交易,那麼您可能會假設您的交易最終肯定會成功,因此您可以在不等待確認的情況下連結交易。直到最近,這被認為是產生大量交易的正確方法。
但我們現在明白,你不能這樣做,因為如果鏈中的任何交易的 ID 發生更改,則鏈可能會完全中斷。引用任何這些輸出的下一個交易將永遠不會確認,因為它的一個輸入中指定了錯誤的交易 ID。從該交易中花費的後續交易也將失敗,您將遇到一團糟。
雖然您描述的大部分過程都是準確的,但我認為您的假設與現實不符,因此有一些細節可能會導致您(稍微)對 Bob 的批評比實際應得的更嚴格:
- 網路知道 tx 123abc 的事實並不一定意味著 Bob,即使不知道 456bca,也不得不擔心 123abc 可能會被重新使用。畢竟,不知何故,他的交易一直在繼續,對於像中心化錢包這樣的高交易量,這通常意味著進入 123abc 的未花費交易 987def 同時已經被花費(並確認)。Bob 可以通過查看任何後來的交易確認來判斷這一點,即使沒有調查什麼交易取代了 123abc。但當然,人們希望 Bob 採取的行動,調查什麼 tx 取代了 123abc(雖然也自然地假設他的熱錢包軟體只能生成其他有效的 tx),應該可以防止欺詐。
- 有什麼其他原因可能阻止交易通過——也許你沒有包含足夠的費用,或者正在形成一個交易,否則同行不喜歡傳播或礦工包含——這不是不合理的為了讓熱錢包自動重新同步到區塊鏈中包含的內容,本質上是雙花先前的 tx 987def,以便至少可以處理其他客戶。當然,適當的處理隨後會在內部標記這種情況,以手動處理失敗的交易,在此漏洞利用中 Alice 將不存在,並且在理想的過程中會提醒 Bob 有問題。
- 在分佈式系統中,並不總是存在一個通用的全域狀態。例如,如果熱錢包操作中斷一小時,比較實際的比特幣餘額和自己的賬戶,那麼看起來一定很自然,這並不像系統持續處於有許多尚未確認的交易狀態時那麼微不足道。 . 這不應該成為藉口,因為設計良好的審計和賬戶對賬流程應該能夠解決這個問題,但是,同樣可以想像,以前工作不太複雜的流程無法處理大量未確認的問題交易。
我同意,回想起來,鮑勃處理這種情況相當糟糕,而且沒有像你希望的那種受託管理他人比特幣的人那樣勤奮。但是,制定流程確實很難,尤其是在多人 24/7 運營中,以處理讓您認為完全不可能的誤解。Bob 可能確實一直在使用某種變通過程來處理他的熱錢包實施,而沒有提供足夠的通常不傳播交易的日誌記錄。