本文深入探讨了传统金融(TradFi)机构的许可型资本市场(PCM)智能合约协议中存在的独特漏洞,这些协议用于在受监管的环境中进行代币化真实世界资产(RWA)的链上交易和结算。文章揭示了审计中发现的多种漏洞类别,包括数据跟踪损坏、不一致的状态管理、权限配置错误、以及跨链问题等,强调了与DeFi协议相比,TradFi协议因其合规性和监管要求而面临的特殊安全挑战,并提出了Gas优化建议。
Dacian
TradFi 的机构许可制资本市场智能合约协议中的漏洞是独有的。 通过这个深度案例展示来学习如何缓解这些漏洞。 自从 2018 年 11 月 Uniswap 创建以来,去中心化金融(DeFi)协议一直是 Ethereum 和其他区块链生态系统上 智能合约的主要形式。 最近,传统金融(TradFi)机构也开始拥抱智能合约技术。 首先通过现实世界资产(RWA)的代币化,然后通过开发日益复杂的许可制资本市场(PCM)协议,从而在受监管且合规的环境中实现代币化 RWA 的链上交易和结算。 虽然公开发布审计报告和智能合约安全漏洞深度分析对于 DeFi 协议来说很常见,但 TradFi 的审计报告几乎从未公开,这是应重视保密的机构客户的要求。 本文将 展示 Cyfrin 私人审计中发现的不同类别的 TradFi 漏洞,同时尊重并维护我们 TradFi 客户的机密性。
TradFi 和 DeFi 协议之间有三个主要区别:参与许可、资本要求和监管合规。
DeFi 协议通常是无需许可的。 这意味着任何人都可以创建一个钱包,为地址充值,并自由地与之交互。 在“纯粹”的 DeFi 协议中,一旦获得代币或其他资源,用户就对其资产拥有“主权”,因此它们不会被协议管理员冻结或没收。 他们可以 自由交易,而不依赖于或负责任于受信任的第三方“管理员”。 虽然最大限度地提高了个人自由,但也 使 DeFi 成为部署代码最具敌意的环境。 允许任何人与 DeFi 协议交互的一个后果是,完全无需许可和匿名的实体执行了许多引人注目的价值数百万美元的黑客攻击。 在 2022 年之前的牛市高峰期,DeFi 的最高 TVL 达到了 1370 亿美元,但同年,黑客窃取了高达 37 亿美元(2.7%)! 与 DeFi 的开放和无需许可的性质相反,TradFi PCM 协议 只允许已知、预先批准的参与者 与协议进行交互,这些人通常需要遵守 KYC/AML,并且可以通过“合格投资者”检查。 虽然这可能会限制参与,但它也消除了在无需许可的 DeFi 中发现的一整类攻击向量。 当 PCM 配置正确时,未经许可的攻击者无法调用任何改变状态的函数,因此无法进入协议。 PCM 协议的第二个方面是,受信任的管理员 通常有权冻结和没收用户的代币化 RWA。 获得 RWA 的用户对其资产没有完全的主权,并且依赖于协议管理员的持续许可才能拥有这些资产。 虽然这进一步限制了个人的自由和所有权,但它也大大 增强了在发生黑客攻击时潜在的安全响应。 快速响应的管理员可以扣押黑客窃取的资产,并将其归还给合法的拥有者。 这种情况最近发生在另类 L1 链的“伪 DeFi”世界中,这些链没有真正分布式的验证器集,以及使用中心化 sequencer 的 L2 链。 协议团队 审查了黑客的交易,冻结了他们的资金 [1, 2],甚至 使用了非凡的权力来没收黑客的资产。 今天的现实是,虽然一些纯粹的 DeFi 协议确实存在,但大多数 DeFi 协议,包括主要的“去中心化”区块链,实际上是伪 DeFi。 他们使用去中心化进行营销,但实际上高度中心化,拥有限制用户交易自由和冻结/没收资产的有效权力。 在这方面,PCM 协议和伪 DeFi 协议之间几乎没有区别,除了 PCM 协议:
对协议团队和管理员的权力 更加坦率,而伪 DeFi 协议则悄悄地保持着类似的权力,并在应对紧急情况时迅速使用这些权力。
具有 更小的攻击面。 因为,当正确配置以防止未经许可的实体调用改变状态的函数时,PCM 可以免受那些削弱真正的 DeFi 和伪 DeFi 协议的壮观的未经许可/匿名黑客攻击。
许多 DeFi 协议不对用户施加资金要求。 或者,如果他们这样做,这些要求也相对较小,以至于几乎所有发达国家的人都可以满足。 相比之下,PCM 协议通常施加很高的资金要求,并且要求交易最低额度达到数千甚至数百万美元。 虽然关于交易自由和资产主权的哲学辩论很有趣,但 资金要求的更实际的现实 意味着,即使在发达国家,绝大多数人也负担不起参与。
DeFi 在很大程度上是狂野的西部。 新的创新与 meme 币、庞氏骗局和 rug-pull 并列,争夺用户的资本和注意力。 另一方面,TradFi PCM 协议 在高度监管和合规的环境中运作,即使在相同的区块链上运行也是如此。 为了满足监管和业务合规性要求,PCM 协议实施链上和链下基础设施代码,以 跟踪多个数据点 并 对投资者和产品执行合规性规则。 当用户与 DeFi 智能合约进行交易时,他们仅与该代码进行交互,通常没有明确的法人实体或政府批准的监管框架来监督交互。 相比之下,当用户与 PCM 智能合约进行交互时,他们正在与 已知的、受监管的实体 进行交互和交易。 用户拥有充分的 法律追索权,包括能够向许可和监督受监管金融实体的政府监管机构提出申诉。
在为 TradFi 机构合作伙伴进行的多次 Cyfrin 私人审计中,我们发现了以下范围的 PCM 漏洞类别:
为了 在链上执行监管和业务合规性规则,PCM 协议会:
包含许多跟踪“Hook”,在操作后调用,用于跟踪与用户和产品相关的数据点。
包含合规性Hook,在操作前后调用,用于检索数据并针对其执行检查。
如果检查失败,通常会恢复交易或施加其他限制,例如金额限制。
我们发现的一类持续存在的 高影响漏洞 导致此跟踪数据因以下原因而损坏:
跟踪数据参数的 编码/解码不匹配。
缺少跟踪Hook,导致在应该更新的交易期间未更新特定的数据点。
堆叠的跟踪Hook,导致每次交易对相同的数据点进行多次更新,而应该只发生一次更新。
缺少合规性Hook,导致在某些交易的部分过程中未执行特定的合规性规则,而应该执行。
合规性Hook内部的 逻辑错误,这些错误往往比跟踪Hook更复杂。
传递给跟踪Hook的 不正确的参数,导致数据点损坏。
边缘案例状态,在这些状态下 无法禁用或删除Hook,即使管理员有正当理由这样做。
边缘案例状态,其中合规性Hook看起来正在工作,但由于它所依赖的跟踪Hook被禁用,该 Hook静默地发生故障。
跟踪数据损坏错误的 最常见影响 是:
拒绝服务:由于下溢/溢出,核心协议函数 panic revert,并且协议在很大程度上变得不可用。 虽然严重且具有很强的破坏性,但它确实使协议 管理员知道 该问题,他们可以通过修复损坏的数据点来纠正错误,从而将协议恢复到正确运行的状态。
细微的不当行为:监管和合规性规则看起来按设计工作,但实际上由于合规性Hook获得不正确的数据作为输入而略有故障。 这种问题可能更严重,因为 没有明显的错误。 协议管理员认为一切正常,但实际上发生了监管和业务合规性违规行为。
更大更复杂的 PCM 协议还具有一系列 管理员操作,旨在用于强制执行监管或业务合规性规则的场景中。 我们的审计发现,经常在不常用的复杂管理员函数代码中 发现漏洞和错误,这些代码必须在大量潜在的用户和协议状态下运行。 示例包括:
在特定状态下强制赎回用户资产会损坏变量的值,从而 破坏了关键的不变量,导致未来的结算因下溢而 panic revert。
在特定状态下强制赎回会损坏跟踪数据点,从而导致其关联的合规性 Hook静默地发生故障。
在特定状态下强制取消订单会损坏跟踪数据点,从而导致未来的 合规性检查略微出现故障。
吊销用户凭据 阻止用户 在将来接收新凭据。
更新凭据架构 阻止将来根据旧架构吊销以前创建的用户凭据。
必须使用细粒度的访问控制以及所有用户的特定级别的特权访问来仔细配置 PCM 协议。 我们发现了访问控制逻辑中的各种 错误,例如:
缺少访问控制,在添加了公共可调用的状态更改函数时,没有任何访问控制,而访问权限应仅限于协议管理员。 当这些漏洞发生在用于更改重要合约地址的函数上时,可能会造成极大的损害。
缺少覆盖,因此标准 ERC-20/ERC-721/ERC-4626 合约中的一些继承的、公共可调用的状态更改函数仍然可以不受限制地访问。
权限提升,其中在协议中获得某种级别访问权限的用户可以利用访问控制系统中的错误来获得额外的、未经授权的权限。
资金经理 可以为其自己的资金和他们无权管理的其 他资金执行特权操作。
应该仅由 KYC 认证的地址持有的代币 可以由普通用户转移到未进行 KYC 认证的地址,该地址未注册到任何用户。
用户可以发起购买或出售等操作,并将 输出代币定向到违反合规性规则的非 KYC 认证的地址。
删除跟踪Hook时,授予它们的权限角色 未被撤销。
缺少管理员函数 以在私钥泄露事件发生时快速轻松地做出响应。
虽然抢跑交易攻击和经济利用在 DeFi 中很常见,但 TradFi PCM 协议的受限和许可性质降低了此类攻击媒介的影响。 在我们迄今为止进行的 TradFi PCM 审计中,我们发现 一种可以滥用抢跑交易的方式。 它允许用户通过抢跑交易并将代币转账到他们控制的另一个地址来规避管理员操作(例如强制赎回以恢复)。
与 DeFi 类似,TradFi 协议涉及财务计算,并且必须注意输入验证、舍入方向、滑点 和 精度损失 错误。 向上舍入针对用户的费用、指定滑点参数、注意精度缩放、向下舍入为零错误——我们在 TradFi 审计中发现了所有相同的 DeFi 错误,包括:
缺少或不充分的输入验证 允许代表他人进行交易。
由于乘法之前的除法和向下舍入为零而导致的 精度损失,从而导致资金损失。
当交换/清算输出基于净资产价值(NAV)提供商返回的动态汇率时,缺少滑点参数 可能会导致输出代币少于预期。
不匹配或缺失的精度缩放。 我们在 TradFi vault 实现中发现了至少三个严重漏洞,其中 NAV 汇率的集成导致:
使用 不正确地较小的十进制精度 返回 vault 份额,从而导致 vault 用户遭受重大财务损失。
使用 不正确地较大的十进制精度 返回输出代币的赎回,向用户支付更大的金额,并导致协议遭受重大财务损失。
由于与 使用不匹配的十进制精度的 值进行比较,对可用流动性的检查会恢复。 即使有足够的流动性可用,这也会错误地阻止用户赎回。
高级 PCM 协议 跨链运行,允许用户将凭据和代币化 RWA 桥接到其他区块链。 在审计跨链 PCM 功能时,我们发现的一些漏洞包括:
目标链上的 源验证不足 允许攻击者制作包含有效数据的恶意消息,从而触发在目标链上铸造代币。
可以在目标链上 多次执行交易 的边缘情况。
可能破坏跨链用户凭据同步 的边缘情况。
无法在目标链上重试失败的交付,从而导致源链上的代币被锁定。
对区块重组的处理不正确 导致用户在目标链上收到代币,但由于源链上发生区块重组,他们从未放弃在源链上的代币。
外部链上的 相同的跨链地址 可以与源链上的多个投资者关联。
对于使用不同地址格式的 alt-L1,地址验证不正确 会破坏与这些链的桥接。
在对 PCM 协议进行的 基于 Rust 的 ZK 和 Solana 审计 中,我们发现了一系列缺失或约束不足的漏洞,例如:
由于缺少 mint 检查而导致的 精度操纵,允许操作员在 vault 中铸造任意大量的份额,并将其兑换为真实资产。 因此,耗尽 vault 并稀释所有其他用户。
由于 约束不足的 zk 电路 而 绕过一系列合规性检查。
除了通常的代码外,由于需要大量的防御性保护以及跟踪/合规性检查, TradFi 智能合约协议可能特别“重”。 对于基于 EVM 的协议,相同的 gas 优化技术 [1, 2] 同样适用,包括:
缓存相同的存储 读取:在每次交易中,仅读取一次相同的存储槽。
缓存常用变量 并将其传递给子函数,而不要在子函数中从存储中重新读取它们。
缓存存储写入:不要多次写入相同的存储槽,而是更新一个局部变量,然后在交易结束时写入存储一次。
避免迭代每个列表元素:这很昂贵,并且在最坏的情况下,可能导致 gas 不足,拒绝服务。
当它可以优化掉局部变量声明时,使用命名返回值变量,特别是对于 memory 返回变量。
对于只读函数输入,首选calldata 而不是 memory。
快速失败:尽快恢复,并使用与恢复无关的最少量的存储读取或其他代码执行。
对于不可升级合约,在构造函数中只能设置一次 的存储变量应声明为 immutable。
不要初始化为默认值。
启用优化器。
当只需要几个字段时,不要将整个结构体 从存储复制到 memory。
有效地打包存储槽,尤其是在一起读取或写入变量的地方。
尽管 PCM 协议通常不允许公开审计报告,但 研究人员和安全专业人员可以从中学习很多东西。 由于许可制 TradFi 协议的合规性和监管要求引入了新的用例和 独特的漏洞,因此 TradFi 和 DeFi 协议之间发现的错误重叠得到了增强。 了解潜在的攻击面对于更好的安全性和更强大的区块链行业至关重要。 通过概括这些发现,我们希望 扩展行业知识,使研究人员能够更好地磨练他们的技能。 如果你正在构建机构 RWA 或 PCA(TradFi)应用程序或寻求加强安全性的 DeFi 协议,Cyfrin Audits 可以提供帮助,立即联系我们!
- 原文链接: cyfrin.io/blog/vulnerabi...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!