{"content":{"title":"apricot 阶段6：本地资产调用弃用","body":"![](https://img.learnblockchain.cn/2025/03/09/1FU5sqm32kyfo4V1s_6C-5A.png)\r\n\r\n## 摘要\r\n\r\nTL;DR: 资金是安全的。多个开发团队在过去几天内昼夜工作，以解决一个已修复的潜在问题。本报告解释了发生了什么。\r\n\r\n2022年9月4日星期日，我们收到来自Abracadabra和Sushi开发团队的报告，他们是根据[Statemind](https://statemind.io/)在[Immunefi](https://immunefi.com/)上的提示得知的。Native Asset Call 预编译，这是C-Chain上一项特殊功能，用于与[Avalanche Native Tokens](https://docs.avax.network/specs/coreth-arc20s#what-is-an-avalanche-native-token)交互，可能被滥用以欺骗某些执行黑名单保护调用的合同，从而调用不良目标 **.** 此功能在 subnet-evm 上不存在，因此子网不受影响。\r\n\r\n我们非常高兴和感激地报告，在社区的帮助和合作下，所有资金都是安全的，报告的问题没有被利用，代码已经修复，Avalanche保持稳定。出于谨慎考虑，Abracadabra和Sushi团队暂时将其用户的资金从受影响的合约中转移，以确保安全，并将返回给他们的用户。你可以期待很快听到他们团队的更多细节，了解用户的资金将如何返回。\r\n\r\nAva Labs 将为 Statemind、Abracadabra 和 Sushi 因其负责任的披露而提供丰厚的奖金。\r\n\r\n## 问题\r\n\r\n[预编译合约](https://www.evm.codes/precompiled)提供了一种标准化的方法，将自定义功能添加到虚拟机中。这类合约可以通过指定预编译的地址并传入所需的输入参数直接调用。该特性通常用于实现难以和昂贵在 Solidity 中实现的加密功能。相反，常见的、经过良好测试的库可以直接高效地执行这些操作。\r\n\r\n本报告中的问题源自Avalanche C-Chain独特的预编译：Native Asset Call。这个预编译用于提供与处理AVAX相同的低级调用功能给[Avalanche Native Tokens](https://docs.avax.network/specs/coreth-arc20s#what-is-an-avalanche-native-token)。\r\n\r\nEVM 提供了 CALL 操作码，可以执行两个操作：\r\n\r\n1. 将原生代币从调用者转移到被调用者\r\n2. 如果被调用者是合约（或预编译合约），则使用指定的 calldata 调用它\r\n\r\nNative Asset Call 的添加是为了提供相同的功能，唯一的例外是，它将转移 Avalanche Native Token，而不是 EVM 的原生代币。它接受以下参数作为输入：\r\n\r\n1. 接收者地址\r\n2. 要转移的 Avalanche Native Token 的 AssetID\r\n3. 要转移的 Avalanche Native Token 的数量\r\n4. 要传递给接收者地址调用的 calldata\r\n\r\nNative Asset Call 执行两个简单的步骤（类似于 EVM 的低级 CALL 操作码）：\r\n\r\n1. 将 Avalanche Native Token 转移到接收者地址\r\n2. 如果被调用者是合约，则使用指定的 calldata 调用它\r\n\r\n实现 Native Asset Call 的关键在于使用的调用上下文地址，即 Native Asset Call 调用接收合约时的地址。\r\n\r\n为了提供与 CALL 操作码相同的功能，调用必须被视为来自 Native Asset Call 的原始调用者，而非 Native Asset Call 自身的地址。因此，调用者地址被设置为直接调用 Native Asset Call 的地址。\r\n\r\n这做出了一个重要的假设，即调用者明确选择调用预编译，因此传播调用者上下文应该是安全的。虽然这个假设在每次调用中都成立，但在允许用户提供回调地址且未将此预编译从黑名单中筛选掉的合约的情况下，它却失效了。\r\n\r\n例如，这影响了 Abracadabra 团队的 Cauldron 合约，因为它提供了代表用户执行低级调用的功能，并在检查调用的接收地址不是 BentoBox 地址或 Cauldron 地址之后：\r\n\r\n[https://github.com/Abracadabra-money/magic-internet-money/blob/23266d17969a95e69199670cba9d0060bff33340/contracts/CauldronV3\\_1.sol#L410](https://github.com/Abracadabra-money/magic-internet-money/blob/23266d17969a95e69199670cba9d0060bff33340/contracts/CauldronV3_1.sol#L410)\r\n\r\n这种低级调用如果指向 Native Asset Call，可能导致潜在问题，因为调用者假设没有被调用者会保留调用上下文，导致对输入参数的验证检查失效。\r\n\r\n感谢 Sushi 和 Abracadabra 开发者的辛勤工作，调查并报告了此问题，也感谢 Statemind 的提示。\r\n\r\n## 修复\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/1lyMpRWQBwwOyLcz3JXtyHA.png)\r\n\r\n在潜在问题被报告后，Avalanche 平台的开发者立即进行了调查和验证。此时的主要目标是尽快保护Avalanche上所有受影响的合约，而不引起任何潜在攻击者对该问题的警觉。\r\n\r\nAva Labs 迅速发布了一个快速修补程序，禁止任何包含与 Native Asset Call 交互的未来区块的生成为无效。随后，我们与全球的节点运营商协调，以尽可能多地将权益升级到这个版本。多亏了节点运营者的快速行动，绝大多数的股份在几小时内升级，防止了任何人执行此交互。\r\n\r\n计划发布一个新版本，以通过彻底弃用 Native Asset Calls 来提供更清晰、更优雅的修复。但该升级实施不当，未能弃用 Native Asset Calls，同时停用了之前的补丁。如果在 Apricot Phase 6 激活后看到 Native Asset Calls 短暂重新出现（通常被自动复利机器人使用），这就是原因。所有这些交易都不包含利用。\r\n\r\n为了重新处理该问题，开发者发布了最终补丁，再次拒绝未来任何包含与 Native Asset Call 交互的区块。多亏了节点运营者的快速行动，绝大多数的股份在几小时内升级，以防止任何人执行此恶意交互。\r\n\r\n目前，无法在 Fuji Testnet 或主网与 Native Asset Call 预编译进行交互。Avalanche平台上所有易受此利用的合约都是安全的，无需进行交互或修改。AvalancheGo@v1.9.0 将完全弃用此预编译，并引入更安全的替代方案，以恢复 C-Chain 上 Avalanche Native Tokens 的完整功能。\r\n\r\n## 结论\r\n\r\n感谢 Statemind、Abracadabra 和 Sushi 团队，以及整个Avalanche验证者社区，在节假日周末迅速更新他们的节点，以防止攻击者利用这一问题。没有资金丢失，几乎所有人都在过去几天继续与Avalanche交互而没有问题。\r\n\r\n负责任的披露计划是保护不断演变的区块链平台（如 Avalanche）安全的重要组成部分，我们期待通过我们的 [Bug Bounty Program](https://hackenproof.com/avalanche/avalanche-protocol) 继续支持安全研究人员。\r\n\r\n>- 原文链接： [medium.com/avalancheavax...](https://medium.com/avalancheavax/apricot-phase-6-native-asset-call-deprecation-a7b7a77b850a)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/26967","address":null},"history":null,"timestamp":1741498919,"version":1}