本文深入探讨了Rebase代币的漏洞与局限性,分析了由于Solidity语言特性以及EVM的限制,在智能合约中可能出现的舍入误差问题,并探讨了针对智能合约的拒绝服务(DoS)攻击及其防范措施。文章还强调了开发者和审计人员在Web3安全中的作用。
请记住。在 Web3 世界中,警惕和专业知识对于保护去中心化经济的资产至关重要,因为每一行代码都可能是一把双刃剑!
这些独特的资产旨在根据市场情况调整其供应量,这可能会引入复杂性,从而导致无法预见的漏洞。虽然它们提供了有趣的优势,例如自动价格稳定,但它们也伴随着固有的风险,尤其是在集成到杠杆策略中时。换句话说,这些被赋予了根据神秘条件扩大或收缩其供应量的 Token,既是奇迹又是威胁。在熟练的人手中,它们塑造了优雅的 Token 经济学;在粗心的人手中,它们会散布不和谐。
Rebase Token 是独特的资产,它们会根据某些条件调整其供应量,通常是为了维持目标价格或价值。 虽然它们提供了有趣的优势,例如 自动 价格稳定,但它们也伴随着固有的风险,尤其是在集成到杠杆策略中时。
因此,rebase Token 有在 DeFi 系统中引起麻烦的历史。
价格稳定:通过调整供应量,rebase Token 可以帮助维持稳定的价格,使其对寻求避免波动的用户具有吸引力。
自动调整:用户无需手动管理其持有量,因为协议会根据市场情况自动调整余额。
复杂性:rebase Token 的机制 可能会让用户感到困惑,从而导致对其际持有量的误解。
舍入误差:调整余额的过程可能会引入舍入误差,这些误差看似很小,但会随着时间的推移而累积并导致显着差异。
拒绝服务 (DoS) 漏洞:rebase 机制的复杂性 使协议容易受到 DoS 攻击,恶意行为者会利用漏洞来中断正常运行,从而可能导致用户的经济损失。
然而,在金融世界中,精确至关重要,即使是最小的差异也可能产生巨大的后果……历史案例突出了这些问题的严重性。例如,KyberSwap 黑客攻击导致损失约 5300 万美元,部分原因在于智能合约逻辑中的舍入误差。在数字领域,此类攻击旨在瘫痪目标,使合约变得沉默和静止……
智能合约中的舍入,尤其是在 DeFi 应用程序中,是安全开发的一个重要方面。由于 Solidity 缺乏原生浮点运算,开发人员必须依赖整数除法,这可能导致可利用的舍入问题。这些错误可能导致巨大的财务差异、资金损失或不准确的奖励。
简单来说,当智能合约中的计算没有考虑小数位时,就会发生舍入误差,从而导致细微的不准确。在以太坊智能合约使用的语言 Solidity 中,这些错误通常发生是因为它只使用整数,并且会向下舍入任何分数,例如将 5/2 变成 2 而不是 2.5。
舍入的相关性主要在于当在 Solidity 中拆分整数时,由于小数部分被降低而导致精度损失。 需要记住的是,在复杂的 DeFi 协议中,即使是轻微的舍入误差也可能加起来造成相当大的金钱差异。 舍入误差可能会被利用,导致黑客篡改 Token 余额或挪用资金的攻击。
舍入误差是一种数学计算错误,是由将数字更改为整数或小数位数较少的数字引起的。
开发人员可以采用定点算术,即在除法之前缩放数值,以正确管理舍入,而不是仅依赖整数除法。 这减少了舍入错误,并能实现更准确的计算。
在计算比率时,还建议在除法之前进行乘法运算,以减少精度损失。例如,不要使用 (a / b) c,而是使用 (a c) / b。 考虑舍入模式(例如,银行家舍入、向下舍入或向上舍入)以及它可能如何影响你的计算。
为了找到任何舍入问题及其对财务计算的影响,请使用不同的输入和环境测试你的智能合约。 识别并减少双向舍入的风险,这允许攻击者使用输入来操纵向上或向下舍入。
开发人员还可以通过使用更大的单位(例如直接使用 wei(以太币的最小单位)而不是以太币)来使用更高的精度。 他们还可以延迟除法直到计算结束以保持准确性,并确保 Token 分配不会留下“灰尘”,而是按顺序分配。 像 MythX 这样的工具可以帮助在这些错误造成问题之前发现它们。
总而言之,Solidity 中舍入误差的根本原因是其基于整数的算术系统:
整数除法:当执行除法运算时,例如 5 / 2,结果是 2,而不是 2.5,因为小数部分 (0.5) 被丢弃。 这被称为截断,它总是向下舍入。
缺乏浮点支持:与 JavaScript 或 Python 等语言不同,Solidity 不支持浮点数据类型。 这迫使开发人员使用整数,这可能导致涉及分数计算中的精度损失。
EVM 约束:执行智能合约的 EVM 对固定大小的整数进行操作,进一步限制了在没有额外逻辑的情况下处理小数精度的能力。
DoS 攻击是 Web3 世界中众所周知的威胁。 成功的 DoS 攻击可能会使系统过载,使授权用户无法访问他们的资金,并对平台造成严重破坏。
可以通过拒绝服务攻击来破坏智能合约的功能,攻击者通过利用漏洞来消耗资源,从而使合约无法使用。 这可能会阻止用户按预期与合约进行交互。 针对智能合约的拒绝服务攻击方法相当简单,包括但不限于以下三种:
,合约的编码逻辑不准确,这会导致此类拒绝服务攻击。 最典型的例子是,当合约包含迭代遍历传入数组或映射的功能时。 当传入的映射或数组没有长度限制时,攻击者可以通过传入超长的映射或数组以进行循环遍历来使用大量 Gas。 这最终会导致事务的 Gas 溢出,并使智能合约无法使用。
基于外部调用的拒绝服务攻击:这种类型的攻击是由合约对外部调用的不正确管理引起的。 例如,智能合约有一个节点,可以响应外部函数的执行来修改合约的状态,但它忽略了事务的失败。 如果攻击者故意导致事务失败,智能合约将继续尝试处理相同的错误数据。 由于在这种环境下无法使用智能合约逻辑卡,因此智能合约要么永久或暂时失效。
基于操作管理的拒绝服务攻击:例如,在智能合约中,所有者帐户通常充当管理员,具有广泛的权限。 例如,当所有者角色受到损害或私钥丢失时,转移功能容易受到非主观的拒绝服务攻击。 这可能会导致启用或暂停转移功能等。
在快速发展的 Web3 格局中,安全性仍然是首要问题,尤其是在去中心化金融协议中。 在审计期间,必须审查和验证每个功能方法的可见性和访问权限:
作为开发人员:在创建智能合约时应小心处理频繁的错误,包括异步执行可能存在问题的外部调用逻辑。 使用 Call 进行遍历、循环和外部调用时,请注意 gas 的使用情况。 不要给一个角色太多的权力。 为了防止由于私钥泄漏而导致权限丢失,具有权限的角色应使用多重签名钱包管理,并且应以合理的方式划分合约权限来处理。
作为审计员:始终检查可能损害合约可用性的逻辑错误。 请注意由于虚拟机调用深度过大而可能造成的拒绝服务攻击(最大深度为 1024)。 密切关注代码的逻辑是否使用了大量的 gas。
在处理外部合约时,请特别注意兼容性问题。 验证从外部合约调用返回的值是否与预期的结果匹配。 此外,为 rebase Token 实施严格的制衡至关重要。 这包括确保 vault 准确跟踪总供应量,并在每次 rebase 事件期间相应地调整用户余额。
为了确保权限与审计期间的设计文档描述一致,必须结合项目方的设计文档。 为了保证一旦合约生效后避免管理和操作错误,如果发现存在不必要的授权或不明确的权限划分,与项目团队讨论流程和方法改进至关重要。
游戏已经开始,风险从未如此之高。 在这个由代码和密码学组成的美好新世界中,猎人、审计员和开发人员的集体努力将决定我们数字未来的命运。 让我们始终保持警惕,因为区块链的恶棍既狡猾又无情。
- 原文链接: x.com/officer_cia/status...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!