
9 月5 日,在由Odaily主辦、36Kr 集團戰略協辦的POD 大會安全論壇上,PeckShield 研發副總吳家誌發表題為《區塊鏈智能合約及公鏈安全》的演講。
在演講中,吳家志指出,整個區塊鏈生態存在的安全問題包括智能合約、基礎設施、錢包問題、礦池問題等。
他還表示,因為區塊鏈相關的項目方眾多,有各種公鏈,公鏈有各種實現,智能合約也有各種實現,這些安全問題不是一家公司可以搞定的,需要更多的人來共同做好這件事,所以PeckShield 與白帽匯旗下的BCSEC 共同成立了DVP 漏洞平台。該平台在7 月24 號上線,目前收到1700 多個漏洞,相關的廠商已經有705 個,總共註冊白帽子1 萬多。 PeckShield 希望跟所有相關方合作,把整個生態做得更好。
以下為吳家志演講全文,enjoy:
各位嘉賓下午好,我是吳家志,我來分享一下PeckShield 的研究成果,我們公司是從今年年初開始區塊鏈研究的,算起來到現在,差不多有半年的時間。最早從代碼開始研究區塊鏈相關的信息,到現在研究範圍擴大到整個區塊鏈生態的各個環節。大家知道我們名字可能從是智能合約問題曝光開始,後來我們也做了很多跟公鏈相關的漏洞披露,也有做像前面嘉賓所說數據分析方面的研究,發了一些跟數據有關的快訊,還有熱門遊戲相關的漏洞分析等等。
我們有一個目標就是希望整個生態能夠在一個安全的狀態下運轉。我們認為區塊鏈某一定程度會取代人類的一些經濟行為,跟以往的經濟行為很大不一樣的是“去中心化”。所以沒有這種機構保證你的資金安全,你錢丟了是沒辦法找一個法院或者銀行幫你追回來的,在這樣環境下,整個生態安全問題就顯得至關重要。
先做一下自我介紹。最早之前是在學校,2015 年來到北京工作,在360。如果說你們從2013 年開始到2015、2016 年,有用安卓手機的話,可能裡面就有我寫的一些代碼。今年之前,我都是以系統安全研究白帽子的身份,在做一些事情,後面開始做區塊鏈相關的安全研究。
我最近也在做一些數據分析,這是一個比較大的趨勢圖。我第一次看這個圖怎麼這麼大,你可以看到,我們現在在這,9 月初是在這,去年的時候是在這裡,有兩條線,藍色是我們監控上面每個月新增的合約數,可以看到藍色的波動,綠色是我們監控到的數,可以看到去年這時候是有一個下滑,這個原因大家應該也知道。到年底的時候,有各種包括以太貓在這個時間點,有一個攀升。 7 月份稍微有點返升,上個月又稍微涼了一點,大家也明白。
剛才那個圖是比較簡單的數據,我們統計每個月的量,看他的情況是怎麼樣。下面這個圖就比較有趣,我來解釋一下。 Homestead,這個階段是到155 萬個blknum,一個圈代表一萬個區塊,所以這個圖上有115 個圈。再來是X坐標,意思是說這一萬個區塊裡面存在一個以上交易的塊數,舉個例子,這一塊可能差不多是8200,這一萬個塊裡面有82% 左右不是空塊。所以就你可以理解為這個圈如果在圖的越右邊的話,就表示這個網絡是滿載的情況。
再來看Y 坐標,就是這一萬個塊裡面的平均TX 數,最大的值是200 多,為什麼是這個值,原因是每一個塊是有gas 上限的,你可以理解為每一個塊承載的TX數是有限制的,最一開始狀態是點都是在很低的地方,但是有一個往右邊的增長,一開始可能很多都是空塊,像創世塊就在左下角,就是沒有任何TX ,進入下一個階段可以看到這個圖開始有一些往上增長,但也有往左的,還是屬於一個網絡不是太擁塞的情況。
到拜占庭這個時間點往右邊的圈越來越多了,整個網絡變得比較擁擠。
到最近這一年以來,基本就是貼到最右邊去,可能是由於各種現象級的遊戲,還有包括黑客攻擊什麼的,所以現在,可能隨便出來一個現象級事件,包括Fomo3D 這一類遊戲,都可能導致這種結果。這個是我們PeckShield 從數據方面觀察到一些現象。
接下來分幾個層面去講整個區塊鏈生態的一些安全問題,這裡面大家可以看到,比如智能合約,有infrastructure,還有錢包問題等其他環節,我們都有一些研究。
首先我先講一下智能合約的問題,這個跟大家最早知道PeckShield 的美鏈事件是類似的一個問題,代碼在這個地方,這些value 加起來之後出現一個溢出的數,導致amount 檢查會被繞過,我們看畫面右邊有一個案例,右面可以看到兩個手機的樣子,旁邊是我攻擊的流程,等一下你會看到右邊我更新的一下會憑空造出兩個很大的數字,後面的零數不過來,就是通過這種方式,我們生成兩個不同地址,分別是那兩個手機的錢包地址,造成這個地方溢出,然後這個檢查繞過,這邊就等於看到生成很多數字資產的地方,就是在balance + = value 這個地方,空手套白狼,這是一個挺嚴重的問題。
這樣的問題有一個比較公認的解決方法,就是在這個地方,是一種比較嚴謹的計算函數庫,叫Safemath。
這邊是一個allowance 的運算,它可以保證你不會溢出,那為什麼你看我標題寫的是Unsafemath 呢?我們最近發現一個很有趣的現象,在你右手邊,這裡safeSub 的實現裡,用assert 確保B 小於或對於A,也就是說你不能用一個比較小的數減一個比較大的數。 assert 這個方法可以保證你這邊錯的時候,會可以把你的gas 燒完,讓這個TX 結束,這也是剛剛郭老師講的攻擊裡面的細節。就是說本來架構裡面有一個這樣的機制存在,但他的這個safeMath 實現裡,多加了一個assert 函數,在發生錯誤的時候直接return。所以選擇你的安全函數庫的時候也要注意一下。
再來我講一下關於infrastructure 的研究, 左邊這個截圖是漏洞獎勵計劃的網站,PeckShield 現在是暫時排名第五,目前已公開有三個比較早期提交給基金會的漏洞,都是跟公鏈有關。我今天稍微介紹一下其中的一個,已經修復的,大家不用擔心,如果你把Geth 升級到最新的,這個漏洞不存在。
這個漏洞簡單說一下,我們命名為叫做EPoD,只要發一個數據包給你,你筆記本現在跑一個客戶端,我知道你的IP,直接發給你,你收到後,你的客戶端就會崩潰,這個崩潰聽起來好像沒什麼,但是我直接廣發這個數據部就直接死一片,你其實可以很簡單聯想到這個可以拿來做算力的攻擊。
代碼的細節不講太多,簡單說就是我把某一個數據弄成負1,這邊代碼實現是把這個數+ 1,當你要分配內存大小,負1 + 1 就是零,我又去access負1 這個地方的位置,最終導致越界訪問,程序就崩潰了。
我們直接看案例比較簡單一點。
右邊這個就是我運行的客戶端,這邊先去證明一下我客戶端是從官網上面下載,保證說這個客戶端不是我自己修改過的,是官網直接下載的。等一下檢查完之後左邊會出現兩個窗口,左上角是攻擊代碼運行情況,左下角是一個抓包的畫面,剛剛我做了一個操作,就是先把網關掉,確保這個機器已經沒有網了,所有網絡測的數據包都是來自本機的包。看到最右邊已經把Geth 客戶端領跑起來了,這邊是我剛才抓到的UDP 包,如果你們有了解,這種包不需要建立連接,我可以在網關或者什麼地方,可以擴散我的攻擊,左上角是我攻擊代碼,我攻擊的目標是127.0.0.1,這我們本機的IP,這個是攻擊的包,所以只要在某一個版本以下的Golang 客戶端收到這個包就會崩潰。
這樣的漏洞其實我們有一整個系列,這是最早被公開的一個,我們在明天的互聯網大會上會講,這整個系列會有好幾個類似這樣的案例。
以上是我針對公鏈還有智能合約的安全問題簡單做的兩個案例,大家理解一下就可以,如果真的要看代碼,可以關注下PeckShield 的官網。
最後,我要說是我們最近跟白帽匯旗下BCSEC 合作的一個項目,我們感覺區塊鏈相關的項目方實在太多了,有各種公鏈,公鏈有各種實現,智能合約有各種實現,所以我們就開始覺得說,這個安全的問題其實不是我們一家公司可以搞定的,我們需要更多的人同時來把這件事做的更好,所以我們成立一個平台叫做DVP 漏洞平台。最右邊是漏洞提交的情況,簡單說我們就是利用一種眾測方式,集合所有有安全能力的研究人員或者白帽子,讓項目方把他的項目在我們平台上面懸賞。比如說我現在要測試1.0 版本,你找到一個什麼樣等級漏洞給你怎麼樣的報酬,通過這樣方式鼓勵白帽子幫我們把整個生態做的更好。這個平台是在7 月24 號上線,目前收到1700 多個漏洞,相關的廠商已經有705 個,總共註冊白帽子一萬多。這些是已經入駐這個平台的廠商,包括我們自己公司網站也放在上面做懸賞。
PeckShield 其實希望跟所有項目方合作,把整個生態做的更好,一開始我也講到這件事情,最右邊是我們公司的官網,我們會不定期在上面發布我們最新的研究成果,大家可以關註一下。
以上就是我今天的分享,謝謝。