DAO攻擊簡單解釋 - 數位貨幣
By Hardy
at 2016-06-19T04:20
at 2016-06-19T04:20
Table of Contents
這兩篇寫得還不錯,可以讓局外人稍微了解一下
https://www.bikeji.com/t/4027#reply3
DAO 提現bug
簡述
惡意用戶通過一個合約地址而不是普通的用戶地址(不含智能合約)參與DAO,之後通過
Split(DAO概念裡的退出、提現),利用這個合約地址反複調用DAO的提現方法,在餘額
減少N的情況下提現k*N的提現。
攻擊表現
[DAO項目]的合約地址0xbb9bc244d798123fde783fcc1c72d3bb8c189413上可以看到大量到
地址[0x304a554a310c7e546dfe434669c62820b7d83490]的內部交易[
https://etherscan.io/txsInternal?a=0xbb9bc244d798123fde783fcc1c72d3bb8c189413&p=3
]
(內部交易:Internal transaction是指合約執行過程中產生的交易,比如在合約內給用
戶轉賬)
目前DAO還有餘額7,930,715.340858306 Ether ($137,915,139.78),黑客地址
3,641,694.241898506 Ether ($63,583,981.46)
原理
DAO合約記錄著用戶的餘額,提現時候的偽代碼如下:
// msg.sender為交易發送方的地址,這裡就是提現的用戶
if (balance[msg.sender]>=withdrawRequest) { //檢查是否有足夠的錢
msg.sender.send(withdrawRequest); //給用戶轉賬
balance[msg.sender] -= withdrawRequest; //在記錄中扣除相應的數額
}
合約在執行這裡的msg.sender.send(withdrawRequest)時會產生一個內部交易,這個交易
很簡單,就是從這個合約轉賬withdrawRequest給提現用戶地址。但是以太坊所有交易在
轉賬的同時會執行交易接收方地址的合約。通常提現的地址是個普通用戶,所在的地址沒
有智能合約,而這裡,黑客從一個自己寫的合約發送提現申請,當這個地址收到錢時就會
執行黑客合約裡定義的默認操作。
//黑客合約的默認操作
function defaultAction() {
//設定DAO合約的地址
address DAO = 0xbb9bc244d798123fde783fcc1c72d3bb8c189413;
if (attackMode) { //是否開啟了攻擊模式
DAO.withdraw(200); //遞歸調用DAO的提現操作
}
}
這樣當黑客發起提現時,以太坊的執行過程如下: 執行到msg.sender.send這行,觸發黑
客合約執行,繼續調用DAO的提現,再次執行到msg.sender.send,注意這裡的代碼是在
msg.sender.send執行後完才扣除用戶在DAO裡記錄的餘額,因此再次執行時用戶的餘額還
是不變的...... 只要DAO合約還有錢,黑客給定的手續費足夠,黑客不終止,這個過程可
以一直進行下去。
這個問題可以在寫合約的時候解決。
-先扣除用戶餘額,再轉賬
-在轉賬給用戶時只給足夠小的手續費(Gas),即使遞歸調用也因為Gas耗盡而結束
-一旦開始提現,鎖定合約的狀態,不允許其他提現操作進行
DAO的開發人員已經考慮了這個問題,但是沒有修復所有有這個漏洞的地方,被黑客所利
用。
目前的解決方案
DAO不能暫停,因此黑客的攻擊還可以繼續下去。黑客地址已經偷取了近三分之一DAO合約
裡的以太幣。目前開發人員號召DAO的用戶否決黑客所用的Split申請,以及廣播大量垃圾
交易阻塞以太坊的網絡,不讓黑客的交易被打包。終極的解決方案是以太坊回滾,會嚴重
影響以太坊的聲望。
--
https://www.bikeji.com/t/4027#reply3
DAO 提現bug
簡述
惡意用戶通過一個合約地址而不是普通的用戶地址(不含智能合約)參與DAO,之後通過
Split(DAO概念裡的退出、提現),利用這個合約地址反複調用DAO的提現方法,在餘額
減少N的情況下提現k*N的提現。
攻擊表現
[DAO項目]的合約地址0xbb9bc244d798123fde783fcc1c72d3bb8c189413上可以看到大量到
地址[0x304a554a310c7e546dfe434669c62820b7d83490]的內部交易[
https://etherscan.io/txsInternal?a=0xbb9bc244d798123fde783fcc1c72d3bb8c189413&p=3
]
(內部交易:Internal transaction是指合約執行過程中產生的交易,比如在合約內給用
戶轉賬)
目前DAO還有餘額7,930,715.340858306 Ether ($137,915,139.78),黑客地址
3,641,694.241898506 Ether ($63,583,981.46)
原理
DAO合約記錄著用戶的餘額,提現時候的偽代碼如下:
// msg.sender為交易發送方的地址,這裡就是提現的用戶
if (balance[msg.sender]>=withdrawRequest) { //檢查是否有足夠的錢
msg.sender.send(withdrawRequest); //給用戶轉賬
balance[msg.sender] -= withdrawRequest; //在記錄中扣除相應的數額
}
合約在執行這裡的msg.sender.send(withdrawRequest)時會產生一個內部交易,這個交易
很簡單,就是從這個合約轉賬withdrawRequest給提現用戶地址。但是以太坊所有交易在
轉賬的同時會執行交易接收方地址的合約。通常提現的地址是個普通用戶,所在的地址沒
有智能合約,而這裡,黑客從一個自己寫的合約發送提現申請,當這個地址收到錢時就會
執行黑客合約裡定義的默認操作。
//黑客合約的默認操作
function defaultAction() {
//設定DAO合約的地址
address DAO = 0xbb9bc244d798123fde783fcc1c72d3bb8c189413;
if (attackMode) { //是否開啟了攻擊模式
DAO.withdraw(200); //遞歸調用DAO的提現操作
}
}
這樣當黑客發起提現時,以太坊的執行過程如下: 執行到msg.sender.send這行,觸發黑
客合約執行,繼續調用DAO的提現,再次執行到msg.sender.send,注意這裡的代碼是在
msg.sender.send執行後完才扣除用戶在DAO裡記錄的餘額,因此再次執行時用戶的餘額還
是不變的...... 只要DAO合約還有錢,黑客給定的手續費足夠,黑客不終止,這個過程可
以一直進行下去。
這個問題可以在寫合約的時候解決。
-先扣除用戶餘額,再轉賬
-在轉賬給用戶時只給足夠小的手續費(Gas),即使遞歸調用也因為Gas耗盡而結束
-一旦開始提現,鎖定合約的狀態,不允許其他提現操作進行
DAO的開發人員已經考慮了這個問題,但是沒有修復所有有這個漏洞的地方,被黑客所利
用。
目前的解決方案
DAO不能暫停,因此黑客的攻擊還可以繼續下去。黑客地址已經偷取了近三分之一DAO合約
裡的以太幣。目前開發人員號召DAO的用戶否決黑客所用的Split申請,以及廣播大量垃圾
交易阻塞以太坊的網絡,不讓黑客的交易被打包。終極的解決方案是以太坊回滾,會嚴重
影響以太坊的聲望。
--
Tags:
數位貨幣
All Comments
By Una
at 2016-06-22T20:57
at 2016-06-22T20:57
By Tristan Cohan
at 2016-06-27T16:41
at 2016-06-27T16:41
By Madame
at 2016-07-02T06:57
at 2016-07-02T06:57
By Una
at 2016-07-04T07:18
at 2016-07-04T07:18
By Jack
at 2016-07-07T10:43
at 2016-07-07T10:43
By Daniel
at 2016-07-11T05:30
at 2016-07-11T05:30
By Regina
at 2016-07-13T10:58
at 2016-07-13T10:58
By Bennie
at 2016-07-13T23:19
at 2016-07-13T23:19
By Thomas
at 2016-07-16T12:15
at 2016-07-16T12:15
By Frederic
at 2016-07-20T01:56
at 2016-07-20T01:56
By Donna
at 2016-07-20T20:58
at 2016-07-20T20:58
By Erin
at 2016-07-23T20:35
at 2016-07-23T20:35
By Oscar
at 2016-07-24T22:23
at 2016-07-24T22:23
Related Posts
DAO 在一小時前被駭將近兩百萬
By Barb Cronin
at 2016-06-17T16:48
at 2016-06-17T16:48
交易所大金額入金
By Quanna
at 2016-06-17T03:40
at 2016-06-17T03:40
如何重新廣播比特幣交易
By Dinah
at 2016-06-16T11:04
at 2016-06-16T11:04
比特幣大塞車 徹底癱瘓啦~~~
By Ula
at 2016-06-16T09:43
at 2016-06-16T09:43
blockchain 入帳問題
By Wallis
at 2016-06-16T08:24
at 2016-06-16T08:24