Created
April 26, 2018 03:14
-
-
Save hm0429/84e9910dd3d7c071e2726d6dc778141b to your computer and use it in GitHub Desktop.
batchOverflow with comments in Japanese
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) { | |
uint cnt = _receivers.length; | |
// _value に大きな値を渡せば、オーバーフローさせることができる | |
// ここで SafeMath を使っていないのが問題(桁溢れの対処ができていない) | |
uint256 amount = uint256(cnt) * _value; | |
// cnt が 1以上 かつ 20以下 であれば通る | |
require(cnt > 0 && cnt <= 20); | |
// _value が 0 以上 かつ amount がこのトランザクションを実行した address の token 残高未満であれば通る | |
// amount の計算でバッファーオーバーフローがおきていると、 | |
// amountを非常に小さい値にできてしまうので、_ value の値が token の残高以上でもここが素通りされてしまう。 | |
require(_value > 0 && balances[msg.sender] >= amount); | |
// このトランザクションを実行した address の token 残高から、amount ぶんを差し引く | |
balances[msg.sender] = balances[msg.sender].sub(amount); | |
// 以下 _value の値を他の address(es) に送るコード | |
// 上の require を通ってしまえば、実際に所有していない量の token でも、 | |
// _value に設定されたものが _receivers のアドレス残高に追加されてしまう。 | |
for (uint i = 0; i < cnt; i++) { | |
balances[_receivers[i]] = balances[_receivers[i]].add(_value); | |
Transfer(msg.sender, _receivers[i], _value); | |
} | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment