今天在書店終於看到 Harry 老師的新書上架,所以就買了。書名是《Web3 專業開發者教你如何守護數位資產:30 種詐騙攻防手法全面解析》。分類是資訊安全、網路安全。購書連結: https://www.books.com.tw/products/0010999038
剛買回來先看了第十章的幾頁,在談合約安全的議題,也是我很有興趣了解的議題。這本新書沒有標示頁碼我不知道怎麼講第幾頁,沒有頁碼的情況下甚至不知道有沒有缺頁或順序錯誤?希望沒有。
Harry 老師寫得很棒的有很多地方。先看 10-6 第十章的「權限控管問題」,提到一個知名的權限控管沒有寫好的例子。提到 2017 年的 Parity 多簽錢包安全事件。當時有聽說這個災難,但其實不曉得背後那麼多的技術細節。好高興老師都有寫出來。
第 10-6,Harry 老師寫,Parity MultiSig wallet 多簽合約其實是以一個 library 的形式,讓其他錢包合約來呼叫的。有這一個地址去部署了這個多簽錢包的 library。「delegatecall
的作用是可以在當下合約的執行環境下,重複利用另一個合約的程式碼邏輯,以達到智能合約更加模組化的目的。」
可搭配 OpenZeppelin 針對此安全事件的分析文章一起讀 https://blog.openzeppelin.com/parity-wallet-hack-reloaded 。OpenZeppelin 文章有句寫說是為了省合約部署的 gas costs。“This allows for each deployed wallet to re-use the same code, greatly reducing gas costs for deployment.”
第 10-7 寫,會有這麼嚴重的安全事件發生,就是因為這個 library 地址上的合約觸發了自毀機制,導致所有引用這個 library 的合約功能全部失效。哈利老師說,會觸發自毀是因為裡面的 initWallet 方法沒有加上權限控管,導致任何人都能呼叫這個 library 的 initWallet,把自己設為 owner。
也就是 initWallet method 沒有寫好。任何路人都可以把自己設定成為 owner。所以今天這位路人小哥才會這麼有名,他的帳號才會被印在 T-shirt 上,表示程式碼沒寫好,initWallet method 根本沒有寫權限控制。大家穿這個 T-shirt 衣服嘲笑 Parity 團隊。這是霸凌行為,不建議跟著穿這個衣服。我只是解釋曾經有發生過這個事情。
寫到這像在講古,不過這個可怕的災難挺令人印象深刻。2017 年 11 月 Parity MultiSig wallet 多簽合約程式碼,就如老師所描述的,合約的權限控管邏輯沒寫好,就這樣被一個網路街上閒晃的路人小哥,網路匿名 GitHub 帳號 @devops199,程式碼東戳西戳,就這麼輕易地拿到多簽合約的 ownership,直接呼叫 self-destruct 自毀機制,還留言寫說 "I accidentally killed it." 我不小心把它給毀了。一個瞬間所有錢都鎖住了,沒人能使用。