智能合约:访问控制缺陷


访问控制缺陷是由于编写 solidity 智能合约的时候,对于某些判断的定义不严谨或者笔误,致使的某些敏感功能的访问验证被绕过问题。攻击者能够恶意使用某些敏感功能javascript


漏洞分析css


先看一段代码片断java

 
  
//函数修改器用于检验是否容许转移Tokenmodifier isTokenTransfer{ //if token transfer is not allow if(!tokenTransfer){ revert(); } _;}//函数修改器用于检验是否来自钱包自己modifier onlyFromWallet{ require(msg.sender != walletAddress); _;}contructor(uint initial_balance,address wallet){ require(wallet !=0); require(initial_balance !=0); _balances[msg.sender]==initial_balance; _supply = initial_balance; walletAddress = wallet;}function transfer(address to, uint value) isTokenTransfer checkLock returns (bool success){ require(_balances[msg.sender] >= value); _balances[msg.sender] = _balances[msg.sender].sub(value); _balances[to] = _balances[to].add(value); Transfer(msg.sender,to,value); return true;}function enableTokenTransfer() external onlyFromWallet{ tokenTransfer = true; TokenTransfer();}function disableTokenTransfer() external onlyFromWallet{ tokenTransfer = false; TokenTransfer();}


在代码中的 transfer 函数,除了转帐功能还增长了两个修饰符 isTokenTransfer 和 checkLock,咱们主要讨论 isTokenTransfer 函数微信

modifier isTokenTransfer{ if(!tokenTransfer){ revert(); } _;}

当 tokenTransfer 变量为 false 时,被 isTokenTransfer 修饰的函数是没法正常执行的,在 disableTokenTransfer 函数能够把这个变量改为 false,disableTokenTransfer 有一个修饰符是 onlyFromWallet 字面意思上看应该是只能合约自己去调用的函数

 
  
function disableTokenTransfer() external onlyFromWallet{ tokenTransfer = false; TokenTransfer();}

onlyFromWallet 函数定义在这里区块链

 
  
modifier onlyFromWallet{ require(msg.sender != walletAddress); _;}

加这个本意是只能合约自己去调用的,可是这里 != 的条件判断下来的话就是 若是调用者不是合约自己反而是经过的了测试


代码调试flex


https://cn.etherscan.com/address/0xb5a5f22694352c15b00323844ad545abb2b11028#codeui

去这里复制一下代码spa


用默认帐户选择 IceToken 合约,在 wallet 中填上默认帐户的地址,在 initial_balance 中填上 100,而后部署



切换到第二个帐户

0x14723a09acff6d2a60dcdf7aa4aff308fddc160c

先点击 enableTokenTransfer,而后使用 reansfer() 向本身转移 0 个 Token,测试一下是否



而后咱们使用 disableTokenTransfer 让转帐不可用,注意,咱们如今并非合约的部署者,理论上说是不能修改这样的东西的,不然随便一我的就能让你的用户无法转账?不能接受吧



他的问题在这里

modifier onlyFromWallet { require(msg.sender != walletAddress); _; }

!= 应该是 == 的,这样结果反而是除合约全部者以外的全部人均可以更改了,实际上韩国有个区块链项目 ICON(ICX) 的智能合约就出现过这个问题


漏洞防范


必须对因为表征权限的变量和表示进行严格的控制,即这些敏感变量也应经过函数修饰符进行权限控制,从而保证权限闭环


本文分享自微信公众号 - 陈冠男的游戏人生(CGN-115)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。