XRP Ledger 修復可能使帳戶陷入負債的漏洞
重點速覽
- •fixCleanup3_4_0 修正案於 11 月 4 日 14:52 UTC 在已驗證帳本 108,112,129 中生效,終結了自 10 月 8 日 PermissionDelegationV1_1 修正案上線委託功能以來的漏洞窗口。
- •修補前,僅持有 PaymentBurn 權限的受託人可發送超出帳戶餘額的贖回,超額部分會以委託帳戶發行的債務代幣形式出現,造成其從未批准的負債。
- •該漏洞需要接收的發行方已開設接受委託帳戶 IOU 的信託線,原生 XRP 不受影響,而多功能代幣(MPT)被標記為修正案測試未涵蓋的相關案例。
- •該修正案限制了僅限銷毀受託人的贖回金額,但未限制權限涵蓋哪些貨幣,因為 XRPL 的細粒度權限無法按貨幣分割。
- •由於 Delegate 帳本條目為公開資訊,帳本 108,112,129 之前的任何利用行為皆可在鏈上查證,方法是識別由僅限銷毀受託人簽署、且留下負信託線餘額的付款。

XRP Ledger 的驗證者於 11 月 4 日 14:52 UTC 啟用 fixCleanup3_4_0 修正案,終結了近四週以來委託代幣銷毀可能將帳戶餘額推至零以下的風險窗口。Coindoo 已在已驗證帳本 108,112,129中確認該啟用交易,Ripple 的公開主網伺服器亦將該修正案列為已啟用。
啟用之前,該修正案在 10 月下旬的一次投票中曾短暫失去絕對多數支持,此挫折已記錄於 Coindoo 的啟用前報告。該報告列出了建議發行方執行的檢查清單。隨修正案一併提交的程式碼與測試回答了一個更狹義的問題:這次超額銷毀實際上創造的是誰的代幣。
近四週沒有零餘額檢查
根據 XRPL 修正案儀表板,委託功能於 10 月 8 日在 PermissionDelegationV1_1 修正案下上線。從那時到 11 月 4 日,在某些設定下,僅持有 PaymentBurn 權限的受託人可以將贖回推至零以下。因此,XRPL 的權限參考文件建議在該修正案啟用前,不要委託此權限。這項條件已於 11 月 4 日達成。
修正案背後的 rippled 提交由 GitHub 帳號 yinyiqian1 撰寫,補上了缺失的檢查。當受託人僅持有 PaymentBurn 時,帳本會將付款金額與帳戶實際持有的餘額進行比較,並拒絕任何超出餘額的金額。XRPL 的文件早已說明銷毀會在零時停止;但對於委託付款,程式碼在此修正案之前並未強制執行該限制。
測試內幕:Alice、一個 Gateway 與一筆超額付款
提交中的測試使用三個帳戶。Alice 持有 50 個由名為 gateway 的帳戶發行的 USD。而 gateway 則開設了一條信託線,接受最多 200 個由 alice 發行的 USD,程式碼註解將此描述為為付款引擎提供「信託線歸零後可用的發行流動性」。
Alice 隨後將 PaymentBurn 權限授予第三個帳戶 bob,bob 則以 alice 的名義向 gateway 發送一筆金額為其持有量兩倍的付款。測試追蹤記錄顯示帳本在每套規則下如何處理該付款及後續操作。
舊規則 · 僅 PaymentBurn
- 100 USD:接受
- Alice 的 50 被贖回,隨後創建 50 個 alice 發行的 USD
- 最終狀態:gateway 持有 50 個 alice 發行的 USD
新規則 · 僅 PaymentBurn
- 100 USD:拒絕
- 20 USD:接受,剩餘 30
- 30 USD:接受,餘額歸零
- 1 USD:拒絕
新規則 · PaymentBurn + PaymentMint
- 100 USD:接受
- 跨越零點,因為鑄造已獲授權,且 gateway 接受 alice 的 IOU
新代幣是 Alice 的債務
在舊規則下,該付款並未增加任何 gateway 的 USD 單位。gateway 對 alice 的債務從 50 降為零。取而代之出現的是 50 個由 alice 發行、由 gateway 持有的 USD:alice 在交易結束時欠發行方債務,而依據僅是一筆由她僅授權贖回的受託人簽署的付款。
帳本將兩者視為不同的資產。XRPL 的資產格式文件以貨幣代碼和發行帳戶來識別信託線代幣,因此 alice 的 USD 與 gateway 的 USD 共用代碼但發行方不同。原生 XRP 沒有發行方,完全不受此漏洞影響。
在所記錄的案例中,風險因此落在兩方:委託銷毀權限的帳戶,可能承擔其從未批准的負債;以及接收這些 IOU 的發行方。gateway 的 USD 持有人並未面臨其所持代幣的新增單位。
縮小漏洞影響範圍的前提條件
這次超額取決於 gateway 端的一項設定。若沒有接受 alice IOU 的信託線,該付款便無法創造 alice 發行的 USD。發行方必須自行提交該信託線,這是漏洞實際影響範圍有限的最有力論據。
這一論點有其依據。XRPL 的委託文件在修補前也曾將多功能代幣(MPT)列為僅限銷毀的受託人可鑄造的資產之一,而提交中的測試僅涵蓋信託線案例。兩份來源均未描述實際發生的事件,但在未有針對 MPT 的測試之前,不應將信託線的結論延伸至 MPT 發行方。
該修正案限制了僅限銷毀的受託人可贖回的金額,但未觸及該權限所涵蓋的代幣範圍。細粒度權限是硬編碼的,同一份文件指出,帳戶無法授予受託人發送部分貨幣的權利而保留其他貨幣。
對於同時持有 USD 和 EUR 代幣、或來自兩個發行方的穩定幣的營運帳戶而言,單一 PaymentBurn 授權即允許受託人贖回所有代幣,各以其餘額為上限。任何按貨幣的分割只能透過持有量在不同帳戶間的分佈來實現。Payment 交易類型權限的涵蓋範圍更廣,涵蓋該類型的所有付款,因此僅檢查兩個細粒度值的審查可能遺漏它。Coindoo 先前關於 XRPL 如何在帳戶間劃分營運權限的文章說明了機構如何架構這些角色。
如何判斷漏洞是否曾被利用
每筆授權都是公開的。Delegate 帳本條目記錄了授權帳戶、受託人及其權限清單,任何人皆可在鏈上查證是否遭到濫用。
鏈上識別模式:
- 一筆在 10 月 8 日之後、帳本 108,112,129 之前獲得驗證的付款。
- 在當時由僅持有 PaymentBurn、但未持有 PaymentMint 或 Payment 的受託人簽署。
- 發送至代幣的發行方,使授權帳戶在該信託線上留下負餘額。
同時符合這三項條件的付款即可確認主網上發生過超額銷毀。若對該窗口內所有 PaymentBurn 授權的審查未發現任何此類情況,即可排除信託線代幣受影響的可能,MPT 則需另行檢查。由於 DelegateSet 會整體替換權限清單,如啟用前報告所解釋,檢查必須使用每筆付款獲得驗證當時生效的權限。
該修正案自帳本 108,112,129 起適用。在此之前獲得驗證的任何付款均按記錄維持原樣,包括任何曾跨越零點的付款。對於審查該變更前後交易的營運者而言,已驗證帳本編號因此是判斷適用規則的相關邊界。
來源:Coindoo