Starkware发现Cairo VM中存在一个关键问题,该问题可能导致程序在VM上成功执行但违反AIR约束,已通过PR修复并发布更新。
在1月26日星期日,Starkware告知我们,他们在Cairo VM中发现了一个关键问题,该问题与一个能够在虚拟机上成功执行但会违反AIR约束的程序有关。该漏洞是在调查第三方报告的其他问题时发现的,修复已在一个PR中实现。PR已合并,并已发布最新版,目前已更新。你可以在这里阅读Starkware的披露帖。
在拉取请求#1925中的修复添加了两个更改:
verify_secure_runner
进行额外验证。调用指令大致执行以下操作:
[ap]
[ap + 1]
fp
和ap
为ap + 2
,跳过保存的数据。pc
更新为目标函数的起始位置由于调用指令的一些标志是固定的,我们可以验证:
dst
寄存器保存ap+0
,其中当前帧指针将被存储。dst_register == AP
dst_offset == 0
op0
寄存器保存ap+1
,其中调用返回地址将被存储。op0_register == AP
op0_offset == 1
fp
和ap
都更新为ap+2
:ap_update == Add2
fp_update == APPlus2
如果这些条件未满足,则解码失败。
返回指令大致执行以下操作:
[fp - 2]
)[fp - 1]
)由于返回指令的一些标志是固定的,我们可以验证:
pc_update == Jump
res
,其等于fp-1
:res_logic == Op1
op1_offset == -1
op1_address == FP
dst
,其等于fp-2
fp_update == Dst
dst_register == FP
dst_offset == -2
如果这些条件未满足,则解码也失败。
该PR还强制规定,当pc_update
等于4
(条件跳转)时,res_logic
必须等于0
(这意味着忽略该字段)。
这一行为在Cairo白皮书第33页中有文档记录:
if pc_update == 4:
if res_logic == 0 && opcode == 0 && ap_update != 1:
res = Unused
else:
Undefined Behavior
verify_secure_runner
函数验证在运行者中完成的运行是否安全,可以被重新定位并被其他Cairo程序使用。
PR验证最终帧指针与调用者的帧指针一致,存储在[initial_frame_pointer - 2]
。
ExecutionMode::ProofModeCanonical
时,整个地址必须匹配。ExecutionMode::RunnerMode
时,只有偏移量必须匹配。正如Starkware在发布中提到的:
"由于缺少的检查在sequencer中而不是在prover中,因此这对Starknet的正确性或安全性没有任何影响。理论上,它可能会导致一种情况,表面上已经通过的交易会在以后被撤销(重组)"
主要风险在于Cairo0
合约的交易在sequencer上执行并撤销,而不是被证明。因为该交易不会通过prover,因此没有不正确的交易被证明,但撤销会影响用户体验。
正如我们之前所说,这种问题在复杂软件中总是可能和常见,突显了让多个团队关注安全性、密切合作、拥有简单代码库以及详细检查组件之间交互的重要性。
非常感谢Starkware的通知和快速修复!
- 原文链接: blog.lambdaclass.com/res...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!