【本篇內容僅用作學習 科研所需 禁止用作任何違法行為 學安全為安全】
作為區塊鏈方向的學生 最近在學合約審計 總結一下
整數溢位:
漏洞簡介:
簡單來說,就是Solidity整形變數被賦值高于或者低于可以表示的范圍時 值會發生改變 一般會溢位為2的uint型別次方 -1 或者 0:
**上溢:會溢位為0
下溢:會溢為2*n-1 如果是uint256 即為:2的256次方 -1
漏洞通常出現地方:
1.條件檢測的地方容易出現
2.任何計算的地方都可能出現
規避方法:
1.在solidity中運算之前 必須對輸入和輸出進行有效性認證
在進行任何計算之前,務必對運算元進行可能溢位與否的預判,或者用safemath庫來撰寫計算邏輯,否則就可能會出現溢位問題;
實際案例:
Beauty Chain中出現的整數溢位漏洞:
eth address: 0xC5d105E63711398aF9bbff092d4B6769C82F793D
原始碼搜索此地址:
https://etherscan.io/address/0xC5d105E63711398aF9bbff092d4B6769C82F793D#code
整數溢位部分代碼:
function batchTransfer(address[] _reveivers,uint256 _value) public whenNotPaused returns(bool) {
//在這里只討論存在溢位的部分的代碼 其余部分省略 有興趣可以在上述網址查看原始碼進行審計
uint cnt = _reveivers.length;
uint256 amount = uint256(cnt) * _value;
require(cnt >0 && cnt <= 20);
requitre(_value >0 && balances[msg.sender]>=amount);
(接下來是一些轉賬運算)
}
代碼邏輯分析:
在這里 代碼邏輯主要是檢測交易發起人的余額是否大于要轉賬的總余額(轉賬人數 * 轉給每個人的錢) 如果大于 就轉賬
漏洞利用:
注意該合約在進行乘法運算的時候,直接用cnt強轉uint256然后乘以_value, 這個時候如果乘積溢位uint256最大值,那么就可以繞過require中的要求,并且進行非法請求
具體操作:
將_value 傳值 2**256 +1 / 2
2為address陣列長度 即兩個收款人地址 這個具體是幾無所謂 只要保證溢位條件即可(即 2 * (2的256次方+1)/2 = 2的256次方 +1 > uint256最大值)
那么 amount就溢位為0 那么就繞過了下面的require 從而進行非法操作
P.S.
python生成的數 方便審計檢測使用:
unsigned int range:
Unsigned int(uint) 最大表示數 超過此數會上溢為0:
uint8 最高為: 255
uint16 最高為: 65535
uint24 最高為: 16777215
uint32 最高為: 4294967295
uint40 最高為: 1099511627775
uint48 最高為: 281474976710655
uint56 最高為: 72057594037927935
uint64 最高為: 18446744073709551615
uint72 最高為: 4722366482869645213695
uint80 最高為: 1208925819614629174706175
uint88 最高為: 309485009821345068724781055
uint96 最高為: 79228162514264337593543950335
uint104 最高為: 20282409603651670423947251286015
uint112 最高為: 5192296858534827628530496329220095
uint120 最高為: 1329227995784915872903807060280344575
uint128 最高為: 340282366920938463463374607431768211455
uint136 最高為: 87112285931760246646623899502532662132735
uint144 最高為: 22300745198530623141535718272648361505980415
uint152 最高為: 5708990770823839524233143877797980545530986495
uint160 最高為: 1461501637330902918203684832716283019655932542975
uint168 最高為: 374144419156711147060143317175368453031918731001855
uint176 最高為: 95780971304118053647396689196894323976171195136475135
uint184 最高為: 24519928653854221733733552434404946937899825954937634815
uint192 最高為: 6277101735386680763835789423207666416102355444464034512895
uint200 最高為: 1606938044258990275541962092341162602522202993782792835301375
uint208 最高為: 411376139330301510538742295639337626245683966408394965837152255
uint216 最高為: 105312291668557186697918027683670432318895095400549111254310977535
uint224 最高為: 26959946667150639794667015087019630673637144422540572481103610249215
uint232 最高為: 6901746346790563787434755862277025452451108972170386555162524223799295
uint240 最高為: 1766847064778384329583297500742918515827483896875618958121606201292619775
uint248 最高為: 452312848583266388373324160190187140051835877600158453279131187530910662655
uint256 最高為: 115792089237316195423570985008687907853269984665640564039457584007913129639935
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/209058.html
標籤:其他
