本文深入探讨了现代重入漏洞,这种漏洞不仅仅是传统意义上的在状态更新完成前进行外部调用。文章通过实例展示了如何在只读视图(view)函数中利用重入漏洞,以及自动化检测工具的局限性。同时,强调了安全审计的重要性,并提出了有效的防御措施,例如在执行过程中防止关键视图调用。
当智能合约以意想不到的方式执行时,漏洞就会出现。重入攻击仍然是最危险的例子之一,自以太坊早期以来,它一直是一个关键的威胁。
现代重入漏洞有多种形式,需要复杂的检测方法和彻底的安全分析来防止利用。但是,我们如何才能有效地识别和防范这些攻击媒介?让我们来研究一下。
当合约进行外部调用并在初始执行完成之前再次获得控制时,就会发生重入。如果在这种情况下,状态尚未确定,则依赖于准确值的逻辑可能会被操纵。
这种漏洞出现在与不受信任的合约交互期间。如果在外部调用之前没有更新内部余额或标志,攻击者可以通过回调或递归路径利用这些值。
常见的重入类型包括:
与当前系统相关的其他形式:
这些都涉及到由于执行时间而中断的假设。当中间值用于通知操作或授权结果时,它们变得至关重要。
现代合约系统在以下领域暴露了重入风险:
这些环境引入了在状态最终确定之前读取和使用的路径。
为了说明这种类型的漏洞如何显现,请考虑一个在提款期间使用 View 函数执行价格检查的金库。攻击者可以部署一个启动标准提款的合约。在执行期间,当金库通过 View 调用查询价格时,攻击者的合约可以使用回退函数来操纵预期的返回值。这将导致金库基于不正确的定价完成提款,可能导致重大的资产误算。
易受攻击的金库
利用合约
在这个例子中,当金库执行 View 调用以确定定价时,攻击者的回退会返回一个被操纵的值。金库依赖于这个值来计算支出。由于操纵发生在 staticcall 中,传统的保护措施(如 CEI 或重入保护)不适用,这使得它成为一种微妙而有效的向量。
大多数工具检测签名重入模式。当一个函数在完成状态更新之前调用时,它们会发出警报。这些检测是有用的,但不完整。
主要限制包括:
检测工具不应被视为完整的分析。审查团队必须验证调查结果并模拟潜在的行为。
有效的审计会跟踪每个触及外部调用或依赖上游数据的执行路径。这包括影响核心逻辑的 View 函数。
审计团队必须使用模拟的攻击者合约来测试逻辑,这些合约在执行期间回调到系统中。这有助于确认可以访问哪些状态,以及决策是否依赖于不完整的信息。
可靠的防御需要设计和执行。推荐的做法包括:
Spearbit的高信号审查使用跨执行状态的结构化攻击者建模。我们跟踪所有合约间的调用,并模拟回退触发的重入。当 View 函数影响访问或状态转换时,它们被视为安全表面的一部分。
每次审查包括 • 范围内所有合约的执行映射 • 在 View 逻辑期间对回退行为的定向模拟 • 外部调用前后的状态跟踪 • 共享模块、代理和包装器的隔离测试
Spearbit 专注于通过模拟验证假设,而不是模式匹配。这确保了可以触发重入的条件被识别、建模和减轻。
安全审查必须模拟真实的攻击者行为。这包括时间操纵、View 逻辑访问和相互依赖的调用流程。仅靠模式检测无法捕获这些情况。
Spearbit 审查直接模拟这些行为。我们对跨回退路径的执行进行建模,将逻辑跟踪到共享模块中,并测试 View 逻辑,就好像它是可变的一样。这种方法揭示了基于检查表的审查会遗漏的条件。
- 原文链接: cantina.xyz/blog/modern-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!