聯盟鏈中的安全: 智能合約典型漏洞淺析

漏洞往往會重複出現

我們可以對智能合約的典型漏洞進行分類:

  • 變量/函數命名混合:FirePonzi,Rupixi
  • 不應公開的公開數據:公共RNG種
  • 重入(A調用B調用A)
  • gas限制

已經提出了許多關於智能合約安全的解決方案,從更好的開發環境到更好的編程語言再到形式驗證和符號執行,研究人員已經開始開發這種工具。我的個人看法是:智能合約安全性的進步必將是分層的,增量的,並且必定依賴於縱深防禦。會有更多的錯誤,我們將學習更多的課程;不會有任何魔術技術能夠解決所有問題。

該基本結論的理由如下。智能合約被盜或丟失的所有實例-實際上,智能合約被盜或丟失的定義本質上是關於實現與意圖之間的差異。如果在給定的情況下,實施和意圖是同一回事,那麼“盜竊”的任何實例實際上都是捐贈,而“損失”的任何實例都是自願燒錢,在經濟上等同於向ETH的比例捐贈通貨緊縮使代幣持有者社區這導致了下一個挑戰:意圖從根本上講是複雜的。

友好的AI社區已將這一事實背後的哲學最好地加以規範化,該社區的名稱爲“價值的複雜性”和“價值的脆弱性”。命題很簡單:我們作爲人類有很多價值,也有非常複雜的價值-如此複雜以至於我們自己無法完全表達它們,而任何試圖不可避免地包含一些未發現的極端案例的嘗試。該概念對AI研究的實用性很重要,因爲超級智能的AI實際上會遍歷每個角落,包括我們發現的直覺到我們甚至都沒有想到的角落,以最大化其目標。告訴一個超級智能的人工智能來治療癌症,它將通過分子生物學中的一些適度複雜的調整而獲得99.99%的治療方法,但是它很快就會意識到,通過核戰爭和人類滅絕引發人類滅絕,它可以將這一比例提高到100%。 /或生物大流行。告訴它在不殺死人類的情況下治癒癌症,這隻會迫使所有人凍結自己,理由是它並不是從技術上殺死人,因爲如果願意的話,它可以喚醒人類,但不會。依此類推。

在智能合約土地上,情況類似。我們相信我們重視“公平”之類的東西,但是很難定義公平甚至意味着什麼。您可能要說諸如“某人不可能僅從DAO竊取10000 ETH”之類的事情,但是如果對於給定的提款交易,DAO確實批准了轉讓,因爲接收者提供了有價值的服務該怎麼辦?但是,如果轉移獲得了批准,我們怎麼知道決定這種轉移的機制沒有被博弈論的弱點所欺騙?什麼是博弈論漏洞?那“分裂”呢?在基於區塊鏈的市場中,前行呢?如果給定的合同指定了可以收取費用的“所有者”,那麼如果任何人成爲所有者的能力實際上是規則的一部分,又會增加樂趣呢?

所有這些都不是對形式驗證,類型理論,怪異的編程語言等專家的打擊。聰明的人已經知道並讚賞這些問題。但是,它確實表明,要實現的目標存在根本障礙,“公平”並不是在一個定理中可以用數學方式證明的東西-在某些情況下,公平要求的集合是如此之長和複雜,以至於您擁有想知道這組聲明本身是否有錯誤。

緩解之路

也就是說,在很多領域中,意圖和實現之間的差異可以大大減小。一種類別是嘗試採用通用模式並對它們進行硬編碼:例如,可以通過將owner設爲只能在構造函數中初始化爲等於msg.sender並可能在transferOwnership函數中進行轉移的關鍵字來避免Rubixi錯誤。另一類是嘗試創建儘可能多的標準化中級組件。例如,我們可能希望阻止每個娛樂場創建自己的隨機數生成器,而是將人們引導到RANDAO。

但是,更重要的解決方案類別包括減輕EVM執行環境的特定和不直觀。 其中包括:gas限制,重入(負責DAO和Maker ETH合同)和調用堆棧限制。 可以完全禁止重入(即一次只允許每個合同的一個執行實例),但這可能會引入新形式的不直觀性,因此可能需要更好的解決方案。

但是,gas限制並沒有消失。 因此,唯一的解決方案可能是在開發環境本身內部。 如果沒有數據的情況下合同的gas消耗量不能少於2300,則編譯器應發出警告。 如果功能無法在安全的gas範圍內終止,他們還應該發出警告。 變量名可能帶有顏色(例如,基於名稱哈希的前三個字節的RGB),或者,如果兩個變量名彼此之間過於接近,則可能會發出啓發式警告。

另外,有些編碼模式比其他的更危險,儘管不應該禁止使用它們,但是應該清楚地突出顯示它們,要求開發人員證明使用它們的合理性。 一個特別涉及的例子如下。 很明顯,有兩種類型的調用操作是安全的。 第一個是包含2300gas的發送(前提是我們接受這樣的規範,即在數據爲空的情況下,接收方有責任不消耗超過2300gas)。 第二個是對您信任的合約的調用,該合約本身已經確定是安全的(請注意,此定義禁止重入,因爲在證明A安全之前,您必須先證明A安全)。

解決方案的第三類是縱深防禦。爲了防止損失(而不是盜竊),一個例子是鼓勵所有非永久性的合約都具有到期日,在此之後,所有者可以代表合同採取任意行動;這樣,只有在(i)合同搞砸了,同時(ii)所有者失蹤或不誠實時,損失纔有可能發生。受信任的多重簽名“所有者”可能會出現以緩解(ii)。可以通過增加等待時間來緩解盜竊。 DAO問題的範圍得到了極大的緩解,這恰好是因爲DAO子被鎖定了28天。 MakerDAO中的一項建議功能是在任何治理變更生效之前創建一個延遲,從而使token持有者對變更時間出售其token不滿意;這也是一個好方法。

形式驗證可以放在最上面。一個簡單的用例是一種證明終止的方法,可以大大減輕與gas有關的問題。另一個用例是證明特定的屬性-例如,“如果所有參與者合謀,他們可以在所有情況下取出錢”,或“如果您將代幣A發送到此合同,則可以保證獲得代幣的數量B您想要或能夠全額退還自己的款項”。或“該合同適合於Solidity的受限制子集,這使得重新進入,gas問題和調用堆棧問題無法實現”。

儘管到目前爲止,所有關注點都與意外錯誤有關,但惡意錯誤是一個額外的關注點。對於MakerDAO分散交易所沒有漏洞讓他們拿走所有資金的情況。但是智能合約安全模型的整個目的是提供足夠強大的保證,即使情況並非如此,也可以生存下去,以便實體它們之間沒有很好的聯繫並且建立起來不足以使人們自動信任他們。因此,任何檢查或突出顯示不僅應存在於開發環境的級別,還應存在於塊瀏覽器和其他工具的級別,在這些級別,獨立的觀察者可以驗證源代碼。

檢查清單

社區可以採取的檢查步驟是:

  • 承擔創建一個高級開發環境以及一個高級塊/源代碼瀏覽器的項目,該項目包括其中的一些功能
  • 儘可能多地標準化組件
  • 承擔嘗試不同智能合約編程語言以及形式驗證和符號執行工具的項目
  • 討論可減少意外或故意錯誤風險的編碼標準,EIP,對Solidity的更改等
  • 如果您正在開發價值數百萬美元的智能合約應用程序,請考慮與安全研究人員聯繫並與他們合作,將您的項目用作各種驗證工具的測試用例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章