前兩天,跟一位HiBlock區塊鏈社區的用戶私聊,他問我一個問題,同樣是智能合約,為什麼會有以太坊和以太經典,又為什麼會有相應的ETH和ETC,兩者價格還相差如此之大。
轉給他一篇the DAO事件的文章後突然發現,the DAO攻擊事件已經過去2年了,今年的6月17日大家都在關注父親節、端午節以及德國和墨西哥隊的比賽爆冷,無論幣圈還是鏈圈,沒有人提及the DAO。
也許今年的6月17日有人因重注墨西哥隊而大賺一筆,但無論如何也比不上2年前6月17日黑客攻擊the DAO轉走了300多萬以太幣資產,當時價值6千萬美元,而以今年6月18日的ETH價格計算,則價值15億美元。
1
the DAO攻擊事件回顧
DAO代表的是去中心化自治組織,是區塊鏈法則裡不可少的一環,而the DAO含義為「DAO之母」,是建立在以太坊上的一個應用,功能類似於投資機構。參與者可以使用以太幣來換取DAO,也就是the DAO的token,持有DAO可以對the DAO的投資決策提出自己的意見。
the DAO在2016年5月初成立,到2016年6月16日成功募集到在當時價值1.5億美元的以太幣,短期高速發展讓the DAO成為了一個明星項目,但6月17日發生了黑客攻擊事件,事件的根本原因在於一行早已被發現的代碼漏洞。
康奈爾大學計算機科學系副教授Emin Gün Sirer在給他的一位學生發郵件時提到他正在研究智能合約第666行代碼可能存在的問題,甚至在2016年5月份也呼籲過投資者停止對DAO的投資,因為存在這樣的安全漏洞。
但是,Gün教授對於代碼漏洞無能為力,因為代碼發布在以太坊區塊鏈上就無法修改。事實上,發現這行代碼漏洞的並不止Gün教授,2016年6月9日,在網際網路上出現了與這次黑客攻擊相同手法的預警,6月10日智能合約語言Solidity的作者 Christian在以太坊官方博客上發表文章說明這個問題,the DAO團隊也接到了安全報告,但做出了不會受到攻擊的結論。
2
the DAO被攻擊的手段
說起the DAO被攻擊的手段需要講一下the DAO的運行機制。the DAO社區的每一位成員都可以利用自己手中的DAO進行投票,那麼就會有一個問題,持有DAO數量越多,投票的佔比就越大,會讓投資決策出現偏頗,導致基金運行虧損。
所以the DAO就設計了一個「子DAO」的機制,你可以申請創建一個子DAO,審查通過後你的DAO就可以通過代碼自動打入子DAO,從總資金池中剝離出來,而攻擊漏洞也由此開始。
正常情況下你的DAO打入子DAO後就會從總的資金池中刪除掉,但是看下圖這行代碼,裡面的withdrawRewardFor是將錢從總dao打到你的子dao合約,注意前面提到的fallback函數,發送金額到你子dao合約時會觸發fallback函數,但是如果你特別寫了fallback是再調用總dao的withdrawRewardFor呢?代碼會重新運行withdrawRewardFor再給你打錢,而扣錢的代碼就永遠不會運行到,如果你想,可以將總資金池中的DAO全部轉空。
攻擊者組合了2個漏洞,第一個漏洞是遞歸調用splitDAO函數,在第一次被合法調用後,會再次非法調用自己的DAO;第二個漏洞是DAO資產分離後避免從總資金池中銷毀,攻擊者在遞歸調用結束前將自己的DAO資產轉移到了其他帳戶,就可以避免這部分DAO資產被銷毀。
3
the DAO被攻擊後的補救措施
那麼,the DAO被攻擊後,是如何應對解決的呢?在攻擊事件發生後,攻擊者並不能馬上轉走這些資產,而是有一個28天的等待期,在這28天裡白帽黑客登場,V神提出方案,目的是要阻止黑客轉出這些資產。
事件發生後,以太坊創始人Vitalik在以太坊官方博客發布文章,提出以軟分叉的方案解決這次事件,軟分叉將從高度1760000開始把任何與the DAO和child DAO相關的交易認做⽆效交易,以此來組織攻擊者提現,軟分叉之後會進行一次硬分叉找回被轉走的以太幣。
但因為軟分叉的方案需要取得礦工們的同意,方案發布後黑客攻擊者暫停了攻擊,宣布對不支持軟分叉的礦工給與100萬以太幣獎勵。當然,軟分叉方案還是順利通過了,以太坊官方推出了針對TheDAO的軟分叉版本Gethv1.4.8,但這個軟分叉版本卻又一次出現了漏洞。
這個漏洞比較明顯,簡單地說,每個以太坊上的交易,驗證節點(礦工)都會檢查是否與TheDAO智能合約及其子DAO的地址相關。如果是則拒絕這個交易,從而鎖定TheDAO(包括黑客在內)的所有資金。這個邏輯實現本身並沒有問題,但是卻沒有收取執行交易的手續費,這就像節假日高速免費一樣,導致以太坊成為了DoS的攻擊目標,攻擊者可以零成本發起大量交易,導致以太坊網絡癱瘓,由此各個節點回滾了軟體版本,軟分叉方案宣告失敗。
之所以提出軟分叉,是為了避免回滾,軟分叉失敗後只能進行硬分叉,而距離黑客可以轉出提現的時間只有2周,同時還要進行所有礦工的投票來通過這次硬分叉方案。最終有大約450萬以太幣參與了投票,近90%表示同意硬分叉。程序預設在1920000個區塊時進行切換,2016年7月20日晚,第1920000個區塊在中國產生,TheDAO合約裡的所有資金,包括被黑客控制的資金,約1200萬以太幣,全部轉移到了一個新的智能合約中,該合約只有一個功能:退回TheDAO眾籌參與人的以太幣,眾籌參與人只要調用withDraw方法,就可用DAO幣換回以太幣。
4
the DAO事件的影響
硬分叉之後,被盜的幣找回來了,同時以太坊分為了兩個鏈,一條為原鏈(ETC),一條為新的分叉鏈(ETH),也就有了現在的ETC(以太經典)和ETH(以太幣)兩種TOKEN,分別代表新舊社區的共識和價值觀。
對於the DAO來說,這次事件無疑意味著項目的終結,甚至直接關聯到2017年7月,美國證券交易委員會發布報告時提出,DAO提供和出售的代幣是證券,因此受聯邦證券法的約束,DAO違反了聯邦證券法,所有的投資者也違法了。
5
為什麼ETH和ETC會同時存在
兩年過去了,當初硬分叉產生的ETH和ETC仍然同時存在,雖然ETH在2018年6月18日的價格不到100人民幣,遠不及ETC3200人民幣,但ETH仍然代表了一部分人對區塊鏈的共識和價值觀。
在當初硬分叉投票時,有大約10%的投票參與者反對硬分叉,這部分礦工仍然維持著舊鏈的算力,他們認為不能為了一己私利就隨意篡改代碼,代碼就是法律,這才是去中心化不可篡改的真諦,而硬分叉代表著代碼可以隨意修改,決策仍然是中心化的。
而隨後,P網宣布支持舊版以太幣的交易,代號為ETC,由於價格低,有願意冒風險的投資人買入,但由於支持人數少,並且依託於舊鏈的項目少,更新少等問題,價格一直不能和ETH相比。但ETC和ETH代表了區塊鏈世界裡的兩種價值觀。
6
兩年過去了,the DAO帶給我們什麼思考
距離the DAO攻擊事件已經過去了2年,這次事件讓我們認識到區塊鏈應用安全的重要性。the DAO被攻擊的漏洞是項目本身產生的,與智能合約無關,就像某一個網站出現了bug,不能說是網際網路技術的問題一樣。
2年裡,類似這樣的安全事故還有很多,2017年Parity錢包漏洞導致15萬個ETH被盜,導致幾家公司的ICO受阻,當時價值約三千萬美元。此外還有類似於CoinDash ICO攻擊、Enigma項目欺詐、Tether代幣攻擊、比特幣黃金欺詐以及EOS上線前被發現的安全漏洞。
關於區塊鏈安全,一直是一個繞不開的話題,傳統網際網路上是信息的存儲和傳遞,而區塊鏈的信息中,包含了大量與金融相關的數據,我們可以不在乎個人信息被各種「販子」們倒來倒去,但我們不可能不在乎自己銀行帳戶裡的錢被隨意轉來轉去。
區塊鏈的去中心化特點帶給我們很多未來應用的場景和創意,但去中心化組織在管理邏輯和生態上更加複雜,也就意味著更加容易出現漏洞。
區塊鏈的基礎架構由數據層、網絡層、共識層、激勵層、合約層、應用層六部分組成,技術本身的安全需要做好這六個方面的防護體系,而除了技術本身,還有類似於the DAO事件這樣由於代碼漏洞產生的安全問題,需要每一個區塊鏈開發者來維護安全,這該如何做到?是否又能有一個公鏈或組織來保護區塊鏈應用的安全呢?這個問題,歡迎加入HiBlock區塊鏈社區用戶群進行討論。