以太坊智能合約編碼安全之重放攻擊區塊鏈
區塊鏈安全咨詢公司曲速未來帶你回顧重放攻擊:在比特幣的某次硬分叉后,出現了一條新鏈,其代幣為BCH。比特幣硬分叉后,新鏈與原鏈是擁有相同的交易數據、地址、私鑰、交易方式。
介紹:
帶你回顧重放攻擊:
什么是重放攻擊?
1.顧名思義,重復的會話請求就是重放攻擊。
2.可能是因為用戶重復發起請求,也可能是因為請求被攻擊者獲取,然后重新發給服務器。
重放攻擊的危害
請求被攻擊者獲取,并重新發送給認證服務器,從而達到認證通過的目的。
我們可以通過加密,簽名的方式防止信息泄露,會話被劫持修改。但這種方式防止不了重放攻擊。
為什么會出現重放攻擊?
在比特幣的某次硬分叉后,出現了一條新鏈,其代幣為 BCH。比特幣硬分叉后,新鏈與原鏈是擁有相同的交易數據、地址、私鑰、交易方式。你在硬分叉之前的一種幣,會因為分叉而變成兩種,即原有的 BTC 和等額的 BCH。您只需要下載 BCH 對應的錢包,并且把原 BTC 的錢包私鑰導入,即可得到等額的 BCH 。
同時,如果你在沒有解決重放攻擊問題之前,在自己錢包里把分叉前的一個 BTC 轉到一個地址A上,有趣的事就發生了,你在 BCH 錢包內對應的一個 BCH 也會被轉入到地址 A 里面去。因為你在分叉前的幣,會自動被分叉后的兩條鏈都承認是合法的。只要你發起一筆交易,另一筆會被同步到比特幣網絡中去,然后被礦工打包處理,該交易生效,這就是重放攻擊!
智能合約中比較特殊的委托概念:
在資產管理體系中,常有委托管理的情況,委托人將資產給受托人管理,委托人支付一定的費用給受托人。這個業務場景在智能合約中也比較普遍。
這里舉例子為transferProxy函數,該函數用于當user1轉token給user3,但沒有eth來支付gasprice,所以委托user2代理支付,通過調用transferProxy來完成。
上述代碼nonce值可以被預測,而其他變量不變的情況下,可以通過重放攻擊來多次轉賬。
影響范圍
截止2018年9月5日,發現了18個存在重放攻擊隱患問題的合約代碼,其中16個仍處于交易狀態,其中交易量最高的10個合約情況如下:
修復方式
合約中如果涉及委托管理的需求,應注意驗證的不可復用性,避免重放攻擊。其中主要的兩點在于:
1.避免使用transferProxy函數。采用更靠譜的簽名方式簽名。
2.nonce機制其自增可預測與這種簽名方式違背,導致可以被預測。盡量避免nonce自增。
重放攻擊的防御
1)時間戳驗證
請求時加上客戶端當前時間戳,同時簽名(簽名是為了防止會話被劫持,時間戳被修改),服務端對請求時間戳進行判斷,如超過5分鐘,認定為重放攻擊,請求無效。
時間戳無法完全防止重放攻擊。
2)序號
顧名思義,在客戶端和服務端通訊時,先定義一個初始序號,每次遞增。這樣,服務端就可以知道是否是重復發送的請求。
3)挑戰與應答的方式
我們一般采用這種方式來防御重放攻擊。
客戶端請求服務器時,服務器會首先生成一個隨機數,然后返回給客戶端,客戶端帶上這個隨機數,訪問服務器,服務器比對客戶端的這個參數,若相同,說明正確,不是重放攻擊。
這種方式下,客戶端每次請求時,服務端都會先生成一個挑戰碼,客戶端帶上應答碼訪問,服務端進行比對,若挑戰碼和應答碼不對應,視為重放攻擊。
4)Https防重放攻擊
對于https,每個socket連接都會驗證證書,交換密鑰。攻擊者截獲請求,重新發送,因為socket不同,密鑰也不同,后臺解密后是一堆亂碼,所以https本身就是防止重放攻擊的,除非能復制socket,或者進行中間人攻擊。
總結:
由于智能合約代碼公開透明的特性,加上這類問題比較容易檢查出,一旦出現就會導致對合約的毀滅性打擊,所以大部分合約開發人員都會注意到這類問題。但在不容易被人們發現的未公開合約中,或許還有大批潛在的問題存在。建議所有的開發者重新審視自己的合約代碼,檢查是否存在編碼安全問題,避免不必要的麻煩或嚴重的安全問題。
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。