EIP-7921: 跳过 `JUMPDEST` 立即数参数检查
所有 `JUMPDEST` 字节都变为有效的 `JUMPDEST`
Authors | William Morriss (@wjmelements) |
---|---|
Created | 2025-03-26 |
Discussion Link | https://ethereum-magicians.org/t/eip-7921-skip-jumpdest-immediate-argument-check/23279 |
摘要
允许 JUMP
和 JUMPI
到达任何匹配 JUMPDEST
(0x5b
) 的字节,即使该字节是立即数参数。
动机
立即数参数是在代码中提供的,而不是在堆栈中的操作码参数。
目前,确定 JUMPDEST
的有效性需要确定哪些字节是其他操作码(例如 PUSH1
)的立即数参数。
这会带来几个问题:
- 代码大小是一个线性的 DoS 向量,因为必须对代码进行预处理才能确定
JUMPDEST
的有效性。 - 带有立即数参数的新操作码无法安全地采用。
CODECOPY
数据跨度会使后续的JUMPDEST
失效。
此 JUMPDEST
有效性检查的基本原理是防止意外的代码执行。
但是,几乎所有的 JUMP
和 JUMPI
目标都是常量目标。
删除此检查可以允许更大的程序和更好的操作码。
因此,此安全检查的成本超过了收益。
规范
激活后,所有 0x5b
字节对于 JUMPI
和 JUMP
操作码都是有效的 JUMPDEST
。
理由
删除检查可以解决几个问题,同时降低 EVM 的复杂性。
向后兼容性
以前,代码只有一种反汇编解释。
通过此更改,位于立即数参数内的 JUMPDEST
可能会导致多个反汇编解释。
通常,这些解释会在几个字节后收敛,但是这种争议的长度可能是无限的。
CODECOPY
数据一直难以识别。
建议反汇编器在其输出中提供所有可能的解释,以揭示可能存在的幕后功能。
安全注意事项
如果可以跳转到包含 JUMPDEST
的立即数参数,则执行动态跳转的当前合约可能会获得新的意外功能。
预计只有极少数合约会因此而变得脆弱。
大多数智能合约编程语言甚至不允许动态跳转,而在允许动态跳转的语言中,很少有语言会在可访问的立即数参数中包含 JUMPDEST
。
因此,预计只有少数合约会变得脆弱,并且对于其中的许多合约,新提供的代码路径将包含无效的操作码。
应该开发一种静态分析工具并公开提供,以测试合约是否可能变得脆弱,并且应该为所有当前合约运行该程序,以便通知项目有关潜在的安全问题。
受影响的程序将有充足的时间进行迁移。
版权
版权和相关权利通过 CC0 豁免。
Citation
Please cite this document as:
William Morriss (@wjmelements), "EIP-7921: 跳过 `JUMPDEST` 立即数参数检查 [DRAFT]," Ethereum Improvement Proposals, no. 7921, March 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7921.