智能合約:訪問控制缺陷


訪問控制缺陷是由於編寫 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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索