新闻加密货币XRP Ledger 修复可能导致账户陷入负债的漏洞

XRP Ledger 修复可能导致账户陷入负债的漏洞

作者: Coindoo·

要点速览

  • •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 修复可能导致账户陷入负债的漏洞

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、一个网关和一笔超额支付

提交中的测试使用了三个账户。Alice 持有由名为 gateway 的账户发行的 50 USD。gateway 则开通了一条信任线,接受最多 200 USD 由 alice 发行的代币,代码注释将其描述为为支付引擎提供了"信任线达到零后可用的发行流动性"。

随后,Alice 向第三个账户 bob 授予 PaymentBurn 权限,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