曲速未來 :以太坊智能合約設計缺陷之條件競爭區塊鏈
智能合約安全咨詢公司曲速未來表示:開發者在進行代碼開發時常常傾向于認為代碼會以線性的方式執行,而且他們忽視了并行服務器會并發執行多個線程,這就會導致意想不到的結果。
前言
智能合約安全咨詢公司 曲速未來 表示:2016年11月29號,有人在一篇文章中提到到了一個在ERC20標準中存在的隱患問題,條件競爭。
首先了解一個定義——競爭條件是什么?條件競爭漏洞是一種服務器端的漏洞,由于服務器端在處理不同用戶的請求時是并發進行的,因此,如果并發處理不當或相關操作邏輯順序設計的不合理時,將會導致此類問題的發生。
開發者在進行代碼開發時常常傾向于認為代碼會以線性的方式執行,而且他們忽視了并行服務器會并發執行多個線程,這就會導致意想不到的結果。
線程同步機制確保兩個及以上的并發進程或線程不同時執行某些特定的程序段,也被稱之為臨界區(critical section),如果沒有應用好同步技術則會發生“競爭條件”問題。
在很多系統中都會包含上傳文件或者從遠端獲取文件保存在服務器的功能(如:允許用戶使用網絡上的圖片作為自己的頭像的功能),下面是一段簡單的上傳文件釋義代碼:
這段代碼看似一切正常,先通過copy($GET['src'],$GET['dst'])將文件從源地址復制到目的地址,然后檢查$GET['dst']的安全性,如果發現$GET['dst']不安全就馬上通過unlink($_GET['dst'])將其刪除。但是,當程序在服務端并發處理用戶請求時問題就來了。如果在文件上傳成功后但是在相關安全檢查發現它是不安全文件刪除它以前這個文件就被執行了那么會怎樣呢?
假設攻擊者上傳了一個用來生成惡意shell的文件,在上傳完成和安全檢查完成并刪除它的間隙,攻擊者通過不斷地發起訪問請求的方法訪問了該文件,該文件就會被執行,并且在服務器上生成一個惡意shell的文件。至此,該文件的任務就已全部完成,至于后面發現它是一個不安全的文件并把它刪除的問題都已經不重要了,因為攻擊者已經成功的在服務器中植入了一個shell文件,后續的一切就都不是問題了。
由上述過程我們可以看到這種“先將猛獸放進屋,再殺之”的處理邏輯在并發的情況下是十分危險的,極易導致條件競爭漏洞的發生。
介紹
這里舉一個approve函數中會出現的比較典型的例子,approve一般用于授權,比如授權別人可以取走自己的多少代幣,整個流程是這樣的:
1.用戶A授權用戶B 100代幣的額度
2.用戶A覺得100代幣的額度太高了,再次調用approve試圖把額度改為50
3.用戶B在待交易處(打包前)看到了這筆交易
4.用戶B構造一筆提取100代幣的交易,通過條件競爭將這筆交易打包到了修改額度之前,成功提取了100代幣
5.用戶B發起了第二次交易,提取50代幣,用戶B成功擁有了150代幣
想要理解上面這個條件競爭的原理,首先我們得對以太坊的打包交易邏輯有基礎認識。
簡單來說就是
1.只有當交易被打包進區塊時,他才是不可更改的
2.區塊會優先打包gasprice更高的交易
所以當用戶B在待打包處看到修改的交易時,可以通過構造更高gasprice的交易來競爭,將這筆交易打包到修改交易之前,就產生了問題。
以下代碼就存在條件競爭的問題
影響范圍
使用Haotian平臺智能合約審計功能可以準確掃描到該類型問題。
基于Haotian平臺智能合約審計功能規則,我們對全網的公開的共39548 個合約代碼進行了掃描,其中共24791個合約涉及到這類問題。
截止2018年8月10日為止,我們發現了22981個存在approve條件競爭的合約代碼,其中15325個合約仍處于交易狀態,其中交易量最高的10個合約情況如下:
修復方式
關于這個問題的修復方式討論很多,由于這屬于底層特性的問題,所以很難在智能合約層面做解決,在代碼層面,我們建議在approve函數中加入
將這個條件加入,在每次修改權限時,將額度修改為0,再將額度改為對應值。
在這種情況下,合約管理者可以通過日志或其他手段來判斷是否有條件競爭發生,從風控的角度警醒合約管理者注意該問題的發生。范例代碼如下:
總結
智能合約安全咨詢公司 曲速未來 表示:條件競爭是個比較特殊的問題,這里的條件競爭涉及到了智能合約底層實現邏輯,本身打包邏輯存在條件競爭,我們無法在代碼層面避免這個問題,但對于開發者來說,比起無緣無故的因為該問題丟失代幣來說,更重要的是合約管理者可以監控到每一筆交易的結果,所以我們加入置0的操作來提醒合約管理者、代幣持有者該問題,盡量避免這樣的操作發生。這里 曲速未來 再次建議所有的開發者重新審視自己的合約代碼,檢查是否存在設計缺陷問題,避免不必要的麻煩以及安全問題。
本文內容由 曲速未來安全咨詢公司編譯,轉載請注明。 曲速未來提供包括主鏈安全、交易所安全、交易所錢包安全、DAPP開發安全、智能合約開發安全等相關區塊鏈安全咨詢服務。
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。