核心问题:publi c的恶意使用(本次案例合约为例) ) )
作者-毕竟话少
描述:合约没有设置合理的访问控制模型,以及没有对合约有效的校验导致访问控制漏洞的发生
核心问题:public的恶意使用(本次案例合约为例)
针对函数和变量,限制其所能被修改和调用的作用域
通常针对函数,限制某些特权用户访问
默认状态下,可以进行任何形式的调用
可以通过其他合约或者交易来调用,不能在合约内部进行调用
只能在合约(含子合约)内部进行调用
只能在合约(不包含子合约)内部进行调用
1.用于函数执行前的函数检查
2.可以设置参数
3.特殊符号“_”用于指代函数代码的执行位置
modifier noReetrancy() {
if (locked) throw;
locked = true;
_;
locaked = false;
}
pragma solidity ^0.4.24;
contract AccessGame{
uint totalSupply=0;
address public owner;
mapping (address => uint256) public balances;
event SendBouns(address _who, uint bouns);
modifier onlyOwner {
if (msg.sender != owner)
revert();
_;
}
constructor() public {
initOwner(msg.sender); //initOwner()初始化管理员权限
}
function initOwner(address _owner) public{
owner=_owner;
}
function SendBonus(address lucky, uint bouns) public onlyOwner returns (uint){
require(balances[lucky]<1000);
require(bouns<200);
balances[lucky]+=bouns;
totalSupply+=bouns;
emit SendBouns(lucky, bouns);
return balances[lucky];
}
}
漏洞点:第21行,在进行初始化管理员的时候,并没有对init0wner()函数设置合理权限,使用public函数进行调用(默认状态下,可以进行任何形式的调用),攻击者可以自己调用init0wner()函数使自己成为管理员,从而调用SendBonus()增加自己的balances