Page 51 - 《软件学报》2026年第1期
P. 51
48 软件学报 2026 年第 37 卷第 1 期
类似的方法, 如 Zhang 等人 [86] 提出 Smart Shield 用于自动修复智能合约中的安全漏洞, 并确保修复的合约对
后续重入、拒绝服务等攻击免疫, 而且对 Gas 消耗友好. 如图 18 所示, Smart Shield 工具通过 3 个步骤来修复合约
中的安全漏洞.
源代码 0xAB 0xCD
... JUMPDEST
PUSH 1 0x01 ...
补丁点 ADD
POP
...
重写代码 0xAB 0xCD
PUSH 2 0x0FFB JUMPDEST 0xFFB JUMPDEST
JUMP ... ...
PUSH 1 0x01
INVALID [CHECKED_ADD]
INVALID POP
... ...
INVALID PUSH 1 0xCD
JUMP
图 17 源代码和重写代码的控制流图
语义提取
合约修复
控制流 整改修复
转换
抽象语法树
字节码 字节码
智能合约 重定位 验证
0000: PUSH1 0x80
0002: MLOAD
0003: ISZERO 数据插入
0004: PUSH
0x0011 保护机制 修复后的
0007: JUMPI 智能合约
0008: STOP
0009: JUMPDEST 字节码层面语义信息
...
未经修正的 EVM 字节码
图 18 Smart Shield 工作流程
1) 语义提取: 分析每个合约的抽象语法树及其未校正的 EVM 字节码, 修复不安全的代码模式, 同时保持其他
功能的一致性.
2) 合约修复: 采用控制流转换和数据插入保护机制两种策略来修复合约中的漏洞, 并优化 Gas 消耗.
3) 修正合约生成: 字节码重定位和字节码验证可能导致功能行为变化或兼容性副作用, 并将修复报告发送给
开发人员改进合约的代码质量.
EVM Patch 和 Smart Shield 都是利用纯硬编码模板的补丁修复模式, 因此无法动态适应正在打补丁的字节码,
这严重限制它们的灵活性和可扩展性. 例如, 当使用硬编码模板修补整数溢出时, 需要使用特定的补丁模板, 因为
要检查的边界对于每个整数大小都是不同的 (即一个模板用于 uint256, 另一个模板用于 uint64). Ferreira 等人 [87] 提
出 Elysium, 能够在字节码级别实现自动智能合约修复的可扩展. 通过从字节码推断上下文信息, 结合基于模板和
语义补丁自动修补合约中的 7 种不同类型的漏洞, 并且可以使用新的模板和漏洞查找工具进行扩展. Qin 等人 [88]
提出一种可理解描述语言合约, 实现从自然语言合约到“可理解描述句子”的合约转换, 用于修补合谋风险. Chen
等人 [89] 提出一种将 EVM 智能合约升级到 WASM 的二进制翻译方案 (EVMBT), 并配备 LLVM 汇编的优化能力
和 5 个修复智能合约漏洞的插件. Chu 等人 [90] 总结现有的研究, 主要集中在合约部署前如何对检测到的漏洞进行
修复. 表 4 为基于可升级智能合约的应用升级需求方法的小结.

