以太坊智能合約編碼安全之重放攻擊區(qū)塊鏈

                  區(qū)塊鏈安全檔案 2018-09-13 23:42
                  分享到:
                  導(dǎo)讀

                  區(qū)塊鏈安全咨詢公司曲速未來帶你回顧重放攻擊:在比特幣的某次硬分叉后,出現(xiàn)了一條新鏈,其代幣為BCH。比特幣硬分叉后,新鏈與原鏈?zhǔn)菗碛邢嗤慕灰讛?shù)據(jù)、地址、私鑰、交易方式。

                  介紹:

                  帶你回顧重放攻擊:

                  什么是重放攻擊?

                  1.顧名思義,重復(fù)的會話請求就是重放攻擊。

                  2.可能是因為用戶重復(fù)發(fā)起請求,也可能是因為請求被攻擊者獲取,然后重新發(fā)給服務(wù)器。

                  重放攻擊的危害

                  請求被攻擊者獲取,并重新發(fā)送給認(rèn)證服務(wù)器,從而達(dá)到認(rèn)證通過的目的。

                  我們可以通過加密,簽名的方式防止信息泄露,會話被劫持修改。但這種方式防止不了重放攻擊。

                  為什么會出現(xiàn)重放攻擊?

                  在比特幣的某次硬分叉后,出現(xiàn)了一條新鏈,其代幣為 BCH。比特幣硬分叉后,新鏈與原鏈?zhǔn)菗碛邢嗤慕灰讛?shù)據(jù)、地址、私鑰、交易方式。你在硬分叉之前的一種幣,會因為分叉而變成兩種,即原有的 BTC 和等額的 BCH。您只需要下載 BCH 對應(yīng)的錢包,并且把原 BTC 的錢包私鑰導(dǎo)入,即可得到等額的 BCH 。

                  同時,如果你在沒有解決重放攻擊問題之前,在自己錢包里把分叉前的一個 BTC 轉(zhuǎn)到一個地址A上,有趣的事就發(fā)生了,你在 BCH 錢包內(nèi)對應(yīng)的一個 BCH 也會被轉(zhuǎn)入到地址 A 里面去。因為你在分叉前的幣,會自動被分叉后的兩條鏈都承認(rèn)是合法的。只要你發(fā)起一筆交易,另一筆會被同步到比特幣網(wǎng)絡(luò)中去,然后被礦工打包處理,該交易生效,這就是重放攻擊!

                  智能合約中比較特殊的委托概念:

                  在資產(chǎn)管理體系中,常有委托管理的情況,委托人將資產(chǎn)給受托人管理,委托人支付一定的費(fèi)用給受托人。這個業(yè)務(wù)場景在智能合約中也比較普遍。

                  這里舉例子為transferProxy函數(shù),該函數(shù)用于當(dāng)user1轉(zhuǎn)token給user3,但沒有eth來支付gasprice,所以委托user2代理支付,通過調(diào)用transferProxy來完成。

                  上述代碼nonce值可以被預(yù)測,而其他變量不變的情況下,可以通過重放攻擊來多次轉(zhuǎn)賬。

                  影響范圍

                  截止2018年9月5日,發(fā)現(xiàn)了18個存在重放攻擊隱患問題的合約代碼,其中16個仍處于交易狀態(tài),其中交易量最高的10個合約情況如下:

                  修復(fù)方式

                  合約中如果涉及委托管理的需求,應(yīng)注意驗證的不可復(fù)用性,避免重放攻擊。其中主要的兩點在于:

                  1.避免使用transferProxy函數(shù)。采用更靠譜的簽名方式簽名。

                  2.nonce機(jī)制其自增可預(yù)測與這種簽名方式違背,導(dǎo)致可以被預(yù)測。盡量避免nonce自增。

                  重放攻擊的防御

                  1)時間戳驗證

                  請求時加上客戶端當(dāng)前時間戳,同時簽名(簽名是為了防止會話被劫持,時間戳被修改),服務(wù)端對請求時間戳進(jìn)行判斷,如超過5分鐘,認(rèn)定為重放攻擊,請求無效。

                  時間戳無法完全防止重放攻擊。

                  2)序號

                  顧名思義,在客戶端和服務(wù)端通訊時,先定義一個初始序號,每次遞增。這樣,服務(wù)端就可以知道是否是重復(fù)發(fā)送的請求。

                  3)挑戰(zhàn)與應(yīng)答的方式

                  我們一般采用這種方式來防御重放攻擊。

                  客戶端請求服務(wù)器時,服務(wù)器會首先生成一個隨機(jī)數(shù),然后返回給客戶端,客戶端帶上這個隨機(jī)數(shù),訪問服務(wù)器,服務(wù)器比對客戶端的這個參數(shù),若相同,說明正確,不是重放攻擊。

                  這種方式下,客戶端每次請求時,服務(wù)端都會先生成一個挑戰(zhàn)碼,客戶端帶上應(yīng)答碼訪問,服務(wù)端進(jìn)行比對,若挑戰(zhàn)碼和應(yīng)答碼不對應(yīng),視為重放攻擊。

                  4)Https防重放攻擊

                  對于https,每個socket連接都會驗證證書,交換密鑰。攻擊者截獲請求,重新發(fā)送,因為socket不同,密鑰也不同,后臺解密后是一堆亂碼,所以https本身就是防止重放攻擊的,除非能復(fù)制socket,或者進(jìn)行中間人攻擊。

                  總結(jié):

                  由于智能合約代碼公開透明的特性,加上這類問題比較容易檢查出,一旦出現(xiàn)就會導(dǎo)致對合約的毀滅性打擊,所以大部分合約開發(fā)人員都會注意到這類問題。但在不容易被人們發(fā)現(xiàn)的未公開合約中,或許還有大批潛在的問題存在。建議所有的開發(fā)者重新審視自己的合約代碼,檢查是否存在編碼安全問題,避免不必要的麻煩或嚴(yán)重的安全問題。

                  攻擊 合約 方式 請求 問題
                  分享到:

                  1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標(biāo)注作者和來源;
                  2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
                  3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。