事件背景
5月23日晚間,edu(educoin)被爆出現合約漏洞,多達數十億代幣被盜。educoin是建立在區塊鏈和智慧型合約技術基礎上,面向**教育內容分享和服務的去中心化教育平台,而edu是基於以太坊erc-20協議發行的專案代幣,總量150億。
在曝出合約漏洞之前,edu的交易**就已出現了大量拋售的現象。從5月20日午夜開始,大量edu被人拋售,而持續的拋售帶來的則是市場的進一步恐慌,edu的**持續走低,直到edu的交易對被迫關停,期間累計售出的edu超過20億。
黑客之所以非常容易得竊取了代幣,正是因為edu的智慧型合約,存在乙個非常大的安全漏洞。
漏洞概述
針對edu&bai智慧型合約出現的問題,bugx團隊做了一些簡單分析,僅供參考:
在 transferfrom 函式中,未校驗 `allowed[_from][msg.sender] >= _value` 並且函式內 `allowed[_from][msg.sender] -= _value`; 沒有使用 safemath,導致無法丟擲異常並回滾交易。目前發現有大量洗劫行為,攻擊者不需要私鑰即可轉走你賬戶裡所有的 edu,並且由於合約沒有 pause 設計,導致無法止損。
本漏洞目前被發現在edu及bai合約中。
合約轉賬情況:
edu: >
bai:>
漏洞原理
合約中漏洞**如下:
// 批准轉賬上限(批准目標可以代我轉賬的上限)
function approve(address _spender, uint256 _value) public returns (bool success)
// 代我轉賬的流程
function transferfrom(address _from, address _to, uint256 _value) public returns (bool success)
可以看出,這個流程並沒做 allowed[ _from][msg.sender] 和 _value 的判斷,比如函式開始應該判斷:
require(allowed[ _from][msg.sender] >= _value);
如果 allowed[ _from][msg.sender] 不存在,那麼值是 0,判斷缺失,也就等於之前的 approve 函式形同虛設。然後,這還出現了個有趣的溢位:
allowed[ _from][msg.sender] -= _value;
當 allowed[ _from][msg.sender] 不存在,那麼值是 0,減去 _value(大於 0 時),就溢位了(溢位並不會導致中斷回滾)。這就是為什麼如果用了 safemath 就會沒問題,因為 safemath 會丟擲錯誤,直接中斷回滾 transferfrom 函式。
整體這樣看下來,edu 和 bai 等合約的 transferfrom 盜幣事件最核心的問題是許可權問題,溢位在這僅僅是個小插曲而已。
本地復現
使用remix即可簡單復現。
1 部署合約
edu:>
bai:>
2 執行攻擊
攻擊者:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
transferfrom裡輸入內容並執行:」0xca35b7d915458ef540ade6068dfe2f44e8fa733c」,」0x14723a09acff6d2a60dcdf7aa4aff308fddc160c」,」3″
可以看到攻擊者餘額增加了,變為3。
任意位置任意時長Toast
在設計師眼裡,想在 彈個提示框就可以在 彈乙個,想顯示多久就顯示多久。理想很豐滿,現實太骨感,我們的toast只能在螢幕中上,正中間,中下方,不能顯示在某一控制項下面,換背影顏色字型大小什麼的也不是很方便,時間也是不可控的,只有toast.length long,toast.length short...
計算任意整數的任意冪
最近複習資料結構,弱弱的寫了寫練習,這個是計算任意整數的任意次冪的演算法 color blue author kevin alps date 2010 09 12 function 計算任意整數的任意冪 color color green include include color color gr...
任意模數ntt 任意模數NTT
任意模數 ntt 眾所周知,為了滿足單位根的性質,ntt 需要質數模數,而且需要能寫成 a2 1 且 2 k ge n 比較常用的有 998244353,1004535809,469762049 這三個原根都是 3 如果要任意模數怎麼辦?n 次多項式在模 m 下乘積,最終係數一定不會大於 nm 2 ...