慢霧科技:智能合約 transferFrom 權(quán)限控制不當(dāng)導(dǎo)致的任意盜幣攻擊簡述


智能合約里的 transferFrom 是批準(zhǔn)轉(zhuǎn)賬流程里的關(guān)鍵函數(shù),這個由于不如 transfer 那么常用,容易被不小心忽略。這個流程最大的問題是權(quán)限問題??创a說話:

// 批準(zhǔn)轉(zhuǎn)賬上限(批準(zhǔn)目標(biāo)可以代我轉(zhuǎn)賬的上限)
function approve(address _spender, uint256 _value) public returns (bool success) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
}

// 代我轉(zhuǎn)賬的流程
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
    /// same as above
    require(_to != 0x0);
    require(balances[_from] >= _value);
    require(balances[_to] + _value > balances[_to]);

    uint previousBalances = balances[_from] + balances[_to];
    balances[_from] -= _value;
    balances[_to] += _value;
    allowed[_from][msg.sender] -= _value;
    Transfer(_from, _to, _value);
    assert(balances[_from] + balances[_to] == previousBalances);

    return true;
}

可以看出,這個流程并沒做 allowed[_from][msg.sender] 和 _value 的判斷,比如函數(shù)開始應(yīng)該判斷:

require(allowed[_from][msg.sender] >= _value);

如果 allowed[_from][msg.sender] 不存在,那么值是 0,判斷缺失,也就等于之前的 approve 函數(shù)形同虛設(shè)。然后,這還出現(xiàn)了個有趣的溢出:

allowed[_from][msg.sender] -= _value;

當(dāng) allowed[_from][msg.sender] 不存在,那么值是 0,減去 _value(大于 0 時),就溢出了(溢出并不會導(dǎo)致中斷回滾)。這就是為什么如果用了 SafeMath 就會沒問題,因為 SafeMath 會拋出錯誤,直接中斷回滾 transferFrom 函數(shù)。

整體這樣看下來,EDU 和 BAI 等合約的 transferFrom 盜幣事件最核心的問題是權(quán)限問題,溢出在這僅僅是個小插曲而已。


本文摘自慢霧區(qū)微信公眾號文章"智能合約 transferFrom 權(quán)限控制不當(dāng)導(dǎo)致的任意盜幣攻擊簡述"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (注:本文是在原文的基礎(chǔ)上,根據(jù)個人的理解,修改部分內(nèi)容并添加了一些注釋) 買賣部分代碼未調(diào)試通過 基礎(chǔ)版的代幣合...
    中v中閱讀 3,123評論 0 2
  • 下一篇:區(qū)塊鏈智能合約安全之二(重入漏洞)transferFrom權(quán)限控制不當(dāng)導(dǎo)致的任意盜幣攻擊智能合約里的tra...
    黑客不黑_閱讀 1,194評論 0 1
  • 最近一段時間,關(guān)于智能合約漏洞的問題層出不窮。我將以SMT為藍(lán)本進(jìn)行復(fù)盤,通過復(fù)盤去深層次了解和防止類似事件發(fā)生。...
    廖全磊LesterLiao閱讀 4,762評論 0 4
  • 寫在之前, 由于不慎裝的版本比較高,且初學(xué)對solidity也不熟,網(wǎng)上的教程現(xiàn)成的合約基用錢包本都未編譯通過。 ...
    中v中閱讀 1,349評論 0 1
  • 1、ERC20Basic 安全考慮定義抽象函數(shù)和發(fā)送事件,個人認(rèn)為隔離設(shè)計更安全 function totalS...
    08f1b6c52d2a閱讀 3,773評論 0 2

友情鏈接更多精彩內(nèi)容