天天看點

阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務

阿裡雲BaaS智能合約掃描服務

區塊鍊技術,是一種交易記錄的存儲技術。它對交易記錄進行永久性存儲,而且在存儲之後永遠無法删除,隻能按照次序加入新的交易,由此對所有的交易曆史進行永不結束的記載。這個看似簡單的功能描述,實則含義深刻,它促使我們重新思考如何去建立交易、存儲資料和交換資産,它是一場巨大變革的起點。

區塊鍊通過不可變的特性提高參與方的可信度,還能通過交易中提供更大的透明度來減少各個參與方之間的摩擦,這些特性使得更多行業的應用場景得以重塑。如果說網際網路徹底改變了資訊傳遞的方式,那麼區塊鍊作為構造和傳遞信任的媒介,将可能徹底改變整個人類社會價值傳遞的方式。

智能合約是區塊鍊最關鍵的特性,也是區塊鍊能夠被稱為颠覆性技術的主要原因。智能合約肩負着交易資料的處理和最終上鍊共識的重任。又由于區塊鍊不可纂改的特性,上鍊資料的正确性就需要得到極高的保證,智能合約的安全性和完備性也變的更加重要。

在一些公鍊上,一個小小的智能合約bug就可能導緻上億美元的損失。2018年3月,美鍊(BEC)被爆出 ERC20 協定安全漏洞,攻擊者利用整數溢出BUG,可無限生成代币。被黑客進行漏洞攻擊的美鍊,引發了價格閃崩,當日币價幾乎歸0。

最著名的黑客攻擊事件要數The DAO。早在2016年,這個平台被盜了高達1.5個億美金的ETH。攻擊者利用了遞歸調用 splitDAO 函數這一技術層面的漏洞,這起事件同時也暴露了智能合約安全性的早期缺陷。據英國和新加坡的研究人員統計,超過34000個智能合約都有可被利用的安全隐患。

而在企業級的聯盟鍊應用場景,鍊上資料與企業日常業務運作有着緊密的關聯。在供應鍊金融、大宗商品倉單等場景下,智能合約漏洞可能直接給企業在企業信用及經濟上都造成無法挽回的損失。

阿裡雲區塊鍊服務

是由螞蟻金服在阿裡雲上提供的企業級區塊鍊平台服務,支援Hyperledger Fabric、螞蟻金服自研區塊鍊技術、以及企業以太坊Quorum三種區塊鍊引擎,能夠幫助使用者簡單快速的建構更安全穩定的區塊鍊環境,實作業務快速上鍊。同時,不僅在

産品控制台

裡提供了便捷的智能合約掃描服務,使用者直接可以在控制台内上傳智能合約,即可擷取掃描的結果,在

AlibabaCloud BaaS VS Code插件

中,使用者也可以直接遠端調用智能合約掃描服務,對目前正在開發的智能合約進行掃描檢測。

下面我們使用一個可以運作成功但有明顯缺陷的示例智能合約來試用一下阿裡雲BaaS的智能合約掃描服務。

示例合約代碼:

sacc.go

建立檢測任務

我們可以看到,目前阿裡雲BaaS的智能合約掃描服務支援 Hyperledger Fabric的Golang 和以太坊/Quorum的Solidity 兩種智能合約。

阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務
阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務

由于智能合約的邏輯并不複雜,掃描時間在1分鐘内就傳回了結果。

阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務

下載下傳結果,并且解壓之後,直接打開 findings.html 檔案,既可以看到完整的掃描報告。

掃描結果概覽

阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務

從掃描結果的概覽中,我們看到一共掃描處11處需要關注的地方,其中,有4處安全隐患以及7處最佳實踐缺陷。

安全隐患

安全隐患是指智能合約中存在直接影響資料安全的隐患,可能是代碼的bug,也可能是不符合智能合約開發規範導緻。

點選标題,可以看到該缺陷的詳細說明。我們挑選了其中的4個缺陷給大家做下詳細的說明。

錯誤的依賴

下屬錯誤是由于引入了可能會導緻執行結果不确定性的庫導緻。智能合約的運作需要保證多個 peer 節點上運作結果是一緻的,而引入 

time

 可能會導緻不用的 peer 節點得到不同的結果,如果該結果參與到賬本資料的計算,很可能導緻鍵值不一緻而背書失敗。

Tips:點選

Show Code

可以看到源碼的資訊,這樣有助于快速定位問題所在。點選

Hide Code

 則可以隐藏源碼。
阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務

全局狀态變量

在智能合約中,對賬本資料的操作不應該依賴全局變量。全局變量僅存在目前的節點中,并沒有存儲到賬本中,當有節點當機或出現錯誤時,有可能會導緻該全局變量在多個

peer

節點中不一緻。

阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務

最佳實踐隐患

最佳實踐隐患不會對智能合約的安全性産生影響,但是可能會導緻異常退出、記憶體洩露、性能降低等問題。示例掃描結果中,有2類最佳實踐隐患:未處理異常及寫後讀。

未處理異常

點選

unhandled_error

可以看到所有的6處缺陷資訊。忽略異常可能會導緻程式的執行錯誤或者異常退出,是以,所有的異常資訊都需要被處理。

示例代碼中,

func set(stub shim.ChaincodeStubInterface, args [] string) (string, error)

 在被

line 62

調用時,使用

_ 占位符

來忽略掉了本應該處理的錯誤。

阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務

寫後讀

寫操作需要在送出事務并将其寫入分類賬之後才能生效。 是以,當讀取在同一筆交易中已經被寫入的值時,将從賬本中檢索其舊值,該舊值往往與上面

PutState

的值是不一緻的,這很可能會導緻一些非預期的行為産生。

阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務
Tips:如果該缺陷檢測有誤或者已經被處理,可以點選 Mark as False Positive進行忽略。

上述我們使用了一個示例智能合約來對阿裡雲BaaS的智能合約掃描服務進行了講解,為了編寫安全和高品質的智能合約,趕緊把寫好的智能合約來掃描下看看吧!

聯系我們

最後,歡迎感興趣的同學加入釘釘群(釘釘群号: 23181816)。

阿裡雲BaaS智能合約掃描服務使用詳解阿裡雲BaaS智能合約掃描服務

繼續閱讀