Polygon zkEVM ROM Spearbit审计报告解读(2023年8月calldata bug修复)

1. 引言

前序博客有:

主要内容见:

审计内容见:

本轮审计历时2天,共发现6个问题,其中低危漏洞1个,信息提示类5个。
在这里插入图片描述

在本审计报告中,风险分级为:

风险级别 影响:高 影响:中等 影响:低
可能性:高 致命 中等
可能性:中等 中等
可能性:低 中等

其中:

  • 1)影响:
    • 高:会导致丢失协议中 > 10 % >10\% >10%资产,或对大多数用户有重大危害。
    • 中等:丢失 < 10 % <10\% <10%资产,或仅丢失一部分用户的资产,但仍不可接受。
    • 低:丢失很烦人但可接收。适用于可以很容易修复的网格攻击,甚至是gas不足。
  • 2)概率:
    • 高:几乎确定会发生,易于操作,或不易于操作但激励诱人。
    • 中等:仅有可行性可能或动机,但相对有可能发生。
    • 低:需要stars to align,或者几乎没有动机。
  • 3)风险级别:
    • 致命:(若已部署)必须尽快修复。
    • 高:(若未部署),需在部署前修复。
    • 中等:应该修复。
    • 低:可修复。

2. 低危漏洞

2.1 低危漏洞1:CREATE2在存储calldata指针之后设置txCalldataLen

上下文见:

CALL* 系列opcodes和CREATE具有共同的模式:

  • 先设置txCalldataLen为argsLengthCall参数
  • 然后调用saveCalldataPointer。

而CREATE2中的这2个动作是相反的,其不会影响helper输出,但基于一致性考虑,应与其他opcodes保持相同的顺序。
建议:

  • 先设置txCalldataLen,再调用saveCalldataPointer。

修复PR见:

3. 信息类提示

3.1 信息类提示1:常量命名混乱

上下文见:

%CALLDATA_CTX常量名混乱,因同时还有calldataCTX变量。
建议:

  • 将%CALLDATA_CTX常量,重命名为%CALLDATA_RESERVED_CTX。

修复PR见:

3.2 信息类提示2:

上下文见:

注释中声称readFromCalldataOffset helper的输出变量为readFromCalldataOffset,但实际为readXFromCalldataResult。

A :MSTORE(readXFromCalldataOffset), CALL(readFromCalldataOffset); in: [readXFromCalldataOffset: offset value, readXFromCalldataLength: length value], out: [readXFromCalldataOffset: result value]

建议:

  • 修改注释中的输出为readXFromCalldataResult。

修复PR见:

3.3 信息类提示3:无需在readFromCalldataOffset helper中保存D寄存器

上下文见:

readFromCalldataOffset helper中未修改D寄存器,因此无需存储其之前值,并在结束时恢复原值。
建议:

  • 移除tmpVarDReadXFromOffset变量,以及对D寄存器的存储和恢复代码。

修复PR见:

3.4 信息类提示4:注释过期

上下文见:

CALL和CREATE opcodes中的注释,所描述的上下文与修复后的实现不匹配。

; copy calldata from origin CTX to current CTX

建议:

  • 重写这些注释,以反映新方法实现。

修复PR见:

3.5 信息类提示5:不需要的标签

上下文见:

由本PR添加的addBatchHashByteByByteEnd标签,实际未被使用且与本修复无关。

建议:

  • 移除该标签。

修复PR见:

附录:Polygon Hermez 2.0 zkEVM系列博客

猜你喜欢

转载自blog.csdn.net/mutourend/article/details/135337746