根據 GitHub 上的一份拉取請求,以太坊的共識客戶端之一已合併了一項修復,針對的是驗證者公鑰快取投毒攻擊。該補丁解決了 Gloas 分叉附近的一個漏洞,該漏洞可能導致部分節點因全域公鑰快取中的錯誤而拒絕有效簽名。
Gloas 是即將到來的 Glamsterdam 升級的共識層部分。
三筆存款,兩條鏈
問題出在一個機制上,客戶端將驗證者公鑰及其索引儲存在全域快取中。
從技術上講,已經最終確定的存款應該在每條鏈上產生相同的驗證者,不過在分叉邊界處情況則不同。

攻擊者需要在分叉前恰好有三筆待處理的存款。第一筆是對現有驗證者的大額充值。另外兩筆是新密鑰:A 帶有建構者憑證,B 帶有常規驗證者憑證。
在規範鏈上,該充值消耗了餘額變動額度,因此 A 和 B 在分叉後才被處理。A 成為建構者,B 取得下一個驗證者索引。
在攻擊者的側鏈上,被充值的驗證者在分叉前被罰沒,其存款被跳過。這導致 A 被更早處理,實質上取得了 B 的索引。
有缺陷的快取假設兩條鏈會產生相同的驗證者,並將 A 的密鑰全域匯入。
在分叉時,受影響的節點會拒絕 B 在規範鏈上的所有有效簽名並分叉出去。
實際上,該攻擊有些複雜,因為它需要在恰當的時機發生罰沒並需要一條側鏈,因此不太可能意外發生。
修復改變了什麼?
根據該 PR,修復方案是僅在密鑰的啟動資格 epoch 最終確定後,才將其加入全域公鑰快取。
一個新的 HeadPubkeys 結構還結合了頭部狀態和全域快取中的密鑰,因此即使鏈在沒有新區塊的情況下最終確定,節點也不會遺漏密鑰。
其他共識客戶端是否有類似問題尚待確認。換句話說,Glamsterdam 越臨近,開發者就必須捕捉越多分叉邊界附近的邊緣情況。






