原文標題:《區塊鏈黑暗森林自救手冊》
原文作者:餘弦,慢霧安全團隊
引子
首先,需要先恭喜你的是:你看到了這本手冊。我不清楚你是誰,但如果你持有加密貨幣或對這個世界有興趣,未來可能會持有加密貨幣,那麼這本手冊值得你反复閱讀並謹慎實踐。
其次,需要有心理準備的是:本手冊的閱讀需要一定的知識背景,我盡量照顧初學者,但很難。我希望初學者不必恐懼這些知識壁壘,因為其中大量是可以「玩」出來的。如果你遇到不懂的知識點,需要擴展了解的話,建議你用好Google。並強烈建議你掌握一個安全原則:網絡上的知識,凡事都參考至少兩個來源的信息,彼此佐證,始終保持懷疑。
是的,始終保持懷疑!包括本手冊提到的任何知識點:)
區塊鍊是個偉大的發明,它帶來了某些生產關係的變革,讓「信任」這種寶貴的東西得以部分解決。這已經很難得了,不需要中心化、不需要第三方角色,有些「信任」基於區塊鏈就可以得到很好解決,不可篡改、按約定執行、防止抵賴。但,現實是殘酷的,人們對區塊鏈的理解會存在許多誤區。這些誤區導致了壞人輕易鑽了空子,頻繁將黑手伸進了人們的錢包,造成了大量的資金損失。這早已是黑暗森林。
在區塊鏈黑暗森林世界裡,首先牢記下面這兩大安全法則:
1. 零信任。簡單來說就是保持懷疑,而且是始終保持懷疑。
2. 持續驗證。你要相信,你就必須有能力去驗證你懷疑的點,並把這種能力養成習慣。
注:本手冊中,安全法則就這兩條,其他都可以認為是這兩條推論出來的安全原則。
好,引子部分就到這。下面我們從一張圖開始,進入到這個黑暗森林,看看我們都會遇到哪些風險及我們應該如何應對。
一張圖
在仔細看後文之前,你可以先粗略過下這張圖。這張圖是你在這個世界(無論你如何稱呼這個世界,區塊鏈、加密貨幣還是Web3 都行)里關鍵活動有關的內容,從流程上包括三大部分:創建錢包、備份錢包及使用錢包。
我們順著這三大流程,將涉及到的每個關鍵點展開分析。
創建錢包
錢包最最最核心的就是那個私鑰(或助記詞)。
私鑰長這樣:
0xa164d4767469de4faf09793ceea07d5a2f5d3cef7f6a9658916c581829ff5584
助記詞長這樣:
cruel weekend spike point innocent dizzy alien use evoke shed adjust wrong 注:用以太坊舉例,關於私鑰/助記詞的基礎知識請自行擴展。
私鑰即身份,如果私鑰丟了或被盜了,那麼這個身份也就不是你的了。錢包應用其實很多,知名的也不少,我並不打算也不可能一一介紹。但該手冊確實會提到一些具體的錢包,請注意,能被提到的必然是我有基本信任的,但我不擔保你在使用過程中可能出現的安全問題或目標錢包可能出現並不在我預期內的安全風險(後文我不會再不斷去廢話這些,引子裡提到的兩大安全法則希望你牢記心中)。
錢包從應用分類來說主要包括幾種:PC 錢包、瀏覽器擴展錢包、移動端錢包、硬件錢包及網頁錢包等。從觸網與否來說主要可以分為冷錢包和熱錢包。當我們要進入這個世界,首先要思考將擁有的錢包的用途,用途決定了你將用哪個錢包,同時用途也決定了你會如何對待這個錢包。
無論你選擇什麼錢包,但至少有一點可以肯定的:在這個世界玩久了後,你不可能只有一個錢包。
於是這裡我們又需要記住一個安全原則:做好隔離,也就是雞蛋不要放在一個籃子裡。一般來說使用越頻繁的錢包,自然也加大了出問題的風險。時刻牢記:面對一個新事物時,先準備個單獨的錢包,用單獨的小資金去玩一段時間。除非你已經如我這般,經歷無數,對許多事物都了然於心。但,常在河邊走,哪有不濕鞋呢?
· Download
單這麼簡單的一點,其實也不簡單,原因:
1. 許多人(真是許多人)找不到正確的官網,正確的應用市場,於是安裝了假錢包。
2. 許多許多人對下載了的應用不知道如何確認是否被篡改過。
於是,出師未捷身先死。還沒來得及進入這個世界,就已經錢包空空了。
針對上面的第1 點,找到正確的官網是有技巧的,比如:
· 行業知名收錄,如CoinMarketCap
· 多問一些比較信任的人
好,上面這幾點得到的信息可以全部結合起來參考,互相佐證,最終真相只有一個:) 恭喜你,找到了正確的官網。
接著,你要下載安裝應用了,如果是PC 錢包,根據官網提供的下載鏈接,下載後需要自己去安裝。但在安裝之前,建議做下是否篡改的校驗工作,雖然這個做法並無法防止源頭就被完全篡改的情況(比如官方自己內部作惡、內部被黑、官網被入侵替換了相關信息等等),但可以防止如:源頭被部分篡改、被中間人劫持篡改等這些情況。
是否篡改的校驗,實際上就是文件一致性校驗。常見的方式有兩種:
· 一種是哈希校驗,比如MD5、SHA256 等,MD5 絕大多數情況下夠用,但存在被哈希碰撞的極小風險,所以業內一般選擇SHA256,夠用且夠安全。
· 另一種是GPG 簽名校驗,這個其實也很流行,強烈建議掌握GPG 工具、命令、方法,雖然對於新人來說有那麼些費力,但上手後,相信我,你會很快樂的。
話雖至此,其實業內這樣做的項目方並不多,所以一旦遇到,真是難能可貴,彌足珍惜,比如一款比特幣錢包Sparrow Wallet,下載頁面的「Verifying the Release」簡直良心了,提到的兩種方式都有清晰指南,可以直接參考學習:
https://sparrowwallet.com/download/
這個頁面提到的GPG 工具有兩個:
· GPG Suite,macOS 下運行的。
· Gpg4win,Windows 下運行的。
如果你細心觀察,你會發現這兩個GPG 工具的下載相關頁面其實都有給出兩種方法的一致性校驗說明,但不好意思的是,並沒手把手教你如何校驗。估計吧,都是認為你會是聰明人,該補上的知識你已經補上了:)
如果是瀏覽器擴展錢包,比如這世界家喻戶曉的MetaMask,你唯一有機會注意的就是目標擴展下載頁面裡的用戶數多不多、評分情況如何,比如MetaMask 在Chrome 網上應用店裡,用戶數可是超過一千萬的,同時有兩千多用戶評分的,雖然最終評分並不高。有人要說這不可以刷出來嗎?這位朋友,是這樣的,刷,我相信,不過刷的量如此之巨大,當各方是傻子呢。
如果是移動端錢包,判斷方式類似擴展錢包,不過需要注意的是,iPhone 的App Store 是分區的,加密貨幣在中國大陸被驅趕得不行,所以如果你用App Store 中國區賬號下載到了錢包,建議只有一個:別用,換成如美區的App Store 賬號下載吧。另外,通過正確的官網也能引導到正確的下載位置(比如全球知名的imToken、Trust Wallet 等,官網安全一定要做好,官網都被黑了,那這安全責任就真大了)。
如果是硬件錢包,簡單來說,可以從官網源頭的引導下購買,不要直接去在線商城,到手後也需要留意是否存在被異動手腳的情況,當然有些針對硬件包裝的異動是很高明的,不一定都能看得出。此時建議:無論如何,使用時,先連續至少三次從頭開始的創建,記錄下生成的助記詞、相關錢包地址,不會重複就行。
如果是網頁錢包,非常不建議使用這種在線的錢包,除非你不得已,那麼識別好是官方的後,速戰速決吧,千萬別有任何感情依賴。
· Mnemonic Phrase
一般來說,我們創建了錢包後,直接打交道的關鍵信息是助記詞(而不是私鑰),畢竟助記詞是方便人類記憶的。助記詞是有標準約定的(如BIP39),這就對助記詞提了要求,比如一般12 個英文單詞,也可以是其他數量(3 的倍數),不過不會超過24 個單詞,要不然太複雜也就不助記了,數量少於12 的話,安全性也不靠譜,12、15、18、21、24 都好說。不過從業內習慣來說,一般流行的是12 位,安全性足夠,有的安全嚴謹到變態的如Ledger 這類硬件錢包,24 位標配走起。還有除了英文單詞,也可以是其他的,比如中文、日文、韓文等等。但也不是什麼單詞都可以,有一個固定2048 個單詞列表,具體參考:
https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md
創建錢包時,助記詞的出現是非常敏感的,請留意你身邊沒有人、攝像頭等一切可以導致偷窺發生的情況。同時留意下助記詞是不是足夠隨機出現,正常來說這些知名錢包生成的助記詞隨機數是絕對足夠的,這不以防萬一?你真的很難知道,拿到手的錢包到底有沒有萬一的貓膩。你也不要嫌麻煩,這些安全小習慣形成後,相信我,你真的會很快樂。最後,有的場景下,你甚至可以考慮斷網來創建錢包,尤其是你準備把該錢包當成冷錢包使用時,斷網簡直就是暴力美學。
· Keyless
Keyless,顧名思義是無私鑰的意思。在這我們把Keyless 分為兩大場景(注意,這裡的區分不代表業內公認區分方式,只能說是方便我講解):
· Custody,即託管方式。比如中心化交易所、錢包,用戶只需註冊賬號,並不擁有私鑰,安全完全依託於這些中心化平台。
· Non-Custodial,即非託管方式。用戶唯一掌握類似私鑰的權力,但卻不是直接的加密貨幣私鑰(或助記詞)。比如依托知名Cloud 平台做託管、認證授權,此時知名Cloud 平台成為木桶的那塊短板。還有利用了安全多方計算(MPC) 來確保不存在單點風險,同時也結合知名Cloud,將用戶體驗做到最好。
對我來說,Keyless 的幾種方式我都有使用。實力雄厚及口碑良好的中心化平台體驗好,只要不是因為自身原因導致的被盜幣(比如賬號相關權限被盜),這些平台也會兜底賠付。至於MPC 為主的Keyless 方案是我覺得很有前景且應該盡快普及的,我用過不錯的如(ZenGo、Fireblocks、Safeheron)。優勢很明顯,我這簡單提幾點:
· MPC 算法工程實踐在這些知名區塊鏈上,越來越成熟,只需針對私鑰開展即可。
· 一套思路可以解決不同區塊鏈的多簽方案差異巨大的問題,使其在用戶感知上通用,這是我們常說的:通用多簽。
· 可以確保真實的私鑰從不出現,通過多方計算解決單點風險。
· 結合知名Cloud(或有人提的Web2)讓MPC 不僅安全且體驗更順滑。
優點明顯,但缺點也是有的,我也簡單提幾點:
· 滿足業內公認標準且開源的,這方面的成熟度還遠不夠,各位仍需努力。
· 有不少人說基本只玩以太坊系列(或者說基於EVM 的區塊鏈),那麼Gnosis Safe 這種智能合約方式的多簽方案也就夠了。
無論哪種方式,只要是你覺得安全可控的、用起來舒服的,那麼都是好方式,仁者見仁智者見智。
好,創建錢包的相關安全注意點就先介紹這些,有一些通用性的安全問題會統一在之後介紹,先不著急:)
備份錢包
許多挺厲害的人都在這踩坑了,其中包括我,常在河邊走,濕鞋我也認,好在這不是個大資產錢包,並且最終我在慢霧的兄弟幫我破解解決了。這也是厲害的地方,我沒備份好,我踩坑了,但我卻有厲害的資源能幫我解決這個坑。不過我也會冒冷汗,人之常情。冒冷汗的感覺你肯定也不喜歡,那就集中精力學習下如何安全地備份錢包吧。
· 助記詞/私鑰類型
我們所說的備份錢包,其實歸根結底是備份助記詞(或私鑰,為了方便介紹,後文一般情況下只提助記詞)。我們拿到的助記詞其實可以主要分為幾種類型:
· 明文
· 帶密碼
· 多簽
· Shamir's Secret Sharing,簡稱SSS
這幾種類型,我簡單展開說說。
明文,很好理解,那12 個英文單詞你拿到了,裡面的資產就是你的了。其實這個時候可以考慮做些特別的「亂序規律」,甚至把某個把單詞替換為其他的單詞。這樣做對於壞人來說頭疼了,但如果這個「規律」你自己忘記了,就輪到你頭疼了。千萬不要覺得你頭疼是不可能的,相信我,一年、兩年、五年後,記憶這東西真的會錯亂。幾年前,我玩Ledger 硬件錢包時,就踩坑了,助記詞24 個單詞,我抄寫備份時打亂了順序,幾年後我忘記了排序規律,且不記得自己是不是替換了其中的單詞。如前面說的,我的問題後來解決了,專門的破解程序碰撞出了正確的助記詞順序且糾正了其中的個把單詞。
帶密碼,根據標準,助記詞是可以帶密碼的,助記詞還是那樣的助記詞,只是帶上密碼後會得到不一樣的種子,這個種子就是之後拿來派生出一系列私鑰、公鑰及對應地址。此時,你不僅要備份好助記詞,這個密碼也千萬別忘記了。順便說下,帶密碼的形式,除了配套助記詞,私鑰也有相關標準(如BIP38),還有如以太坊系列常見的Keystore 文件。
多簽,可以理解為目標資金需要多個人簽名授權才可以使用,多簽很靈活,可以設置審批策略,比如3 個人都有鑰匙(助記詞或私鑰),需要滿足至少2 人的簽名審批,目標資金才可以使用。每個區塊鏈都會有自己的多簽解決方案,比特幣系列的很好理解,知名的比特幣錢包都原生支持多簽。不過以太坊系列的,主要通過智能合約來實現多簽,如Gnosis Safe。另外,除了這些比較普遍的多簽方案,還有一類正在流行的:MPC(Secure Multi-Party Computation),即安全多方計算,和傳統多簽體驗接近,但原理卻很不一樣,通過MPC,可以實現通用多簽,並不需要不同鏈不同的多簽方式。
SSS,Shamir 秘密共享方案,作用就是將種子分割為多個分片(常見的每個分片有20 個單詞),恢復錢包時,需要使用指定數量的分片才能恢復。具體參考業內最佳實踐:
https://support.keyst.one/v/chinese/gao-ji-gong-neng/zhu-ji-ci/chuang-jian-dao-ru-fen-pian-zhu-ji-cihttps://wiki. trezor.io/Shamir_backup
用了多簽、SSS 這類方案,其實會放心很多,避免了單點風險,但管理上也相對複雜了,而且這很多時候會涉及到多個人。便捷與安全是永恆的矛盾,具體看自己。但在法則、原則上千萬別偷懶。
· Encryption
加密是個非常非常大的概念,無論對稱、非對稱還是其他什麼高級的,只要加密了後,多年以後,你或者你的災備人可以很好解開,而其他人解不開的加密就是好加密。
根據「零信任」這個安全法則,當我們在備份錢包時,每個環節都要假設可能會被入侵,哪怕物理環境,如保險箱。別忘了,這個世界除了你自己,並沒有其他人是完全可信的,其實有的時候自己也不可信,比如記憶可能會淡忘、錯亂等。但我不會把這個世界假設的如此可怕,否則最終還是會把事情搞砸了。
備份時一定要特別考慮災備。災備主要就是要避免單點風險,萬一你沒了,萬一你備份目標所在的環境沒了,該怎麼辦?所以重要的東西,一定要有災備人;重要的東西,一定有多處備份。
那麼,災備人的選擇我就不廢話了,看你信任誰吧。我重點提提多處備份。先看看備份位置的幾個基本形態:
· Cloud
· Paper
· Device
· Brain
Cloud,許多人談雲備份色變,似乎黑客真的就上天入地,來無影去無踪的。其實攻防對抗永遠都是成本對抗,看誰投入的大,無論是人才還是錢。對於我來說,我會比較信任Google、Apple、微軟等提供的相關雲端服務,因為我知道他們的安全團隊是如何實力,安全投入是如何之大。但除了對抗外部黑客入侵,我還很關心內部安全風控的能力及隱私數據保護有關的約束力。我比較信任的幾個,都算是把這些我在意的安全風險規避得不錯的。但凡是絕無絕對。如果我選擇這些雲來備份我非常重要的數據(如錢包),我一定還會給錢包再做至少一次加密的。
我強烈推薦掌握GPG,除了前面提到的「簽名驗證」用途之外,加解密方面安全性也足夠強了。關於GPG 這塊的入門可以參考:
https://www.ruanyifeng.com/blog/2013/07/gpg.html
好,你掌握了GPG:) 現在你已經在離線安全環境下用GPG 加密了你的錢包(助記詞或私鑰)有關內容,你可以把加密後的文件直接扔到這些雲服務裡去了,保存好,沒事的。但這裡我需要提醒下,你GPG 的私鑰別丟了、私鑰密碼別忘記了...
到這,安全帶來的麻煩似乎還沒適應,GPG 好不容易入門了,你還得備份好GPG 的私鑰及私鑰密碼。其實真到這步了,你也熟悉了,再備份這點東西其實也就不麻煩了。這點我不展開,留給實踐出真知的你。
如果你想偷懶,還有一種方案是可以考慮的,只是安全性上會打點折扣,我不好衡量具體折扣多少,但有時候有的場景下我也會偷懶,於是我會考慮用知名的工具來做輔助。這個工具就是1Password。 1Password 新版本已經支持直接保存錢包相關內容,如助記詞、密碼、錢包地址等,這方便用戶。其實其他同類型工具(如Bitwarden)也可以,只是使用起來不像這樣方便。
Paper,許多硬件錢包都會附帶幾張質量上乘的紙卡片,你可以將助記詞(明文、SSS 等形式的)抄寫在上面。除了紙質的,還有鋼板的(抗火抗水抗腐蝕,當然我沒驗證)。助記詞抄寫完成後,會做一次驗證,沒問題後,放進你覺得安全的位置,比如保險箱。其實我個人挺喜歡Paper 的,Paper 所處環境不錯的話,壽命遠大於電子設備。
Device,各種設備吧,電子設備是常用的一種,電腦、iPad、iPhone、移動硬盤、U 盤等都可以拿來做備份,看個人喜好。然後設備間的安全傳輸,讓我比較有安全感的是:隔空投送(AirDrop)、USB 等這類點對點且挺難出現中間人劫持情況的方式。只是我天然對電子設備不放心的一點是多年後可能就壞了,所以會保持每年至少一次的檢查習慣。有一些重複做法(如加密)參考Cloud 小點裡的說法就行。
Brain,腦記很爽很刺激,其實每個人都有自己的「記憶宮殿」的,這玩意不玄乎,可以訓練,熟能生巧,加深記憶。有不少東西確實還是腦記好,至於到底是不是只唯一用腦記看你自己。反正注意兩種風險:一是時間會讓記憶淡忘或錯亂;二是自己可能出意外。這塊不多說了,請自行擴展。
現在你都備份好了。加密不能太過分了,否則多年以後等於「同歸於盡」,因為到時候你可能自己都解不開。根據安全法則「持續驗證」,無論過不過分的加密及備份方法,一定要做到定期不定期地驗證,驗證頻率得看你的記憶,有時候轉頭可能就忘記了。驗證不代表一定都要完整解開看看,只要整個過程不會錯,採用部分驗證也是可以的。最後,也需要注意驗證過程的機密性及安全性。
好了,長舒一口氣,其實入門是最難的,以上你都準備好後,咱們開始真正進入這個黑暗森林吧:)
使用錢包
當你創建及備份好錢包後,真正的大挑戰才來了。除非你非常的佛系,不怎麼折騰持有的價值資產,平時也不會去玩以太坊系列的DeFi、NFT、GameFi 等智能合約有關的項目,或者說當下喜歡提的Web3。那麼實際上你的資金是挺安全的。
· AML
嗯,也只是「挺安全」,因為這裡還是有風險的,所謂「人在家中坐、禍從天上來」。為什麼這樣說呢?你想呀,你最開始的加密貨幣是從哪裡來的?不會是憑空出現的吧?那麼在加密貨幣活動可能中,你拿到的加密貨幣都可能遇到AML(Anti Money Laundering) 即反洗錢風控。也就是說你此刻持有的加密貨幣可能是不干淨的,甚至如果足夠倒霉,還可能存在被直接在鏈上凍結的情況,比如公開報告中Tether 曾經在執法單位的要求下凍結了一些USDT 資金。被凍結列表可以看這:
https://dune.xyz/phabc/usdt---banned-addresses
驗證是否被Tether 凍結,可以在USDT 合約地址進行:
https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#readContract
在isBlackListed 輸入目標錢包地址即可判斷。 USDT 所在的其他鏈大體同理(別較真)。
但你的比特幣、以太坊是不會出現鏈上凍結情況的,也許未來出現了這個情況,那這點本來非常堅定的去中心化信仰可能也就沒了。我們現在經常聽到的加密貨幣凍結實際上絕大多數並不是發生在鏈上的,而是發生在中心化平台裡,如中心化交易平台(Binance、Coinbase 等)。你的加密貨幣在這些中心化平台裡,意味著你並不是真正意義上持有這些加密貨幣,中心化平台凍結的其實是你的賬號,尤其是你的交易、提幣權限。凍結這個概念其實很容易對圈外人造成無解,於是出現一些很爛的自媒體胡亂解讀及散播比特幣的各種陰謀論。
雖然你的比特幣、以太坊等不會在鏈上被凍結,但如果你的這些加密貨幣本身就涉及到相關執法單位在處理的案件,一旦你的加密貨幣轉移進中心化平台,這些中心化平台就有可能因為AML 等要求將你的加密貨幣凍結。
為了比較好地避免AML 問題,需要選擇口碑好的平台、個人等作為你的交易對手。別瞎搞基本問題不大。如果要深度地解決這些問題實際上也是有不少辦法的,比如以太坊系列上,幾乎所有壞人及特別在意隱私的人都會選擇Tornado Cash 進行混幣。更多的方法就不提了,因為這些方法實際上也會被用來作惡。
· Cold Wallet
冷錢包有好幾種使用方法,對於錢包本身來說是不聯網的,那麼就可以認為這是個冷錢包。那麼不聯網如何使用?首先,如果僅僅是接收加密貨幣,問題不大,配合個觀察錢包體驗就已經挺不錯了,比如imToken、Trust Wallet 等都可以直接添加錢包地址,成為目標錢包地址對應冷錢包的觀察錢包。
如果冷錢包要發送加密貨幣,常見的方式有幾種:
· QRCode
· USB
· Bluetooth
這幾種都需要專門的應用(這裡稱之:Light App)搭配冷錢包使用,這個Light App 是聯網的,包括前面提到的觀察錢包。我們只需明白其中本質原理就會明白這些方式了。本質是:最終只需想辦法把簽名後的內容廣播上鍊。我大概解析下過程:
· 待簽名的內容由Light App 通過這些方式傳輸給冷錢包。
· 簽名由擁有私鑰的冷錢包搞定後再通過這些方式傳輸回Light App。
· Light App 將簽名後的內容廣播上鍊。
所以這裡無論是二維碼(QRCode)、USB、還是藍牙(Bluetooth) 等方式,用途就是如上所說。當然不同的方式會有不同的細節,比如二維碼信息容量是有限的,遇到簽名數據很大的時候就得拆分。
這樣使用似乎麻煩了點,不過習慣了就好,甚至滿滿安全感。但,千萬別把安全感加滿,因為這裡還是有風險的,已經許多案例是因為這些風險而導致損失慘重。風險點如:
· 轉幣的目標地址沒嚴格檢查,導致幣轉給了其他人。人都是有慣性或惰性的,比如很多時候檢查一個錢包地址主要就看開頭、結尾幾位是不是正確的,而沒有幾乎完整檢查。於是壞人就激動了,專門用程序來跑出頭尾幾位一樣的地址,然後通過一些手法把你的轉幣目標地址給替換為他控制的地址。
· 授權相關幣種給了未知地址,通常來說授權是以太坊系列智能合約代幣的機制,就是那個approve 函數,一個參數是授權給目標地址,另一個參數是數量。許多人不了解這個機制,於是就可能把無限數量的代幣授權給目標地址,此時目標地址就有權限把這些代幣轉走了。這就是所謂的授權盜幣,手法還有其他變種,這裡就先不擴展了。
· 一些看去不重要的簽名,實際上藏著巨大的陷阱,這點也先不展開,之後會有解析。
· 冷錢包可能並沒給你足夠的必要信息展示,導致你大意了、誤判了。
這一切都可以歸結為兩點:
· 所見即所簽這種用戶交互安全機制缺失。
· 用戶的有關知識背景缺失。
· Hot Wallet
相比冷錢包,冷錢包有的風險熱錢包基本都會有,除此之外,熱錢包多了個:助記詞(或私鑰)被盜風險。此時的熱錢包要考慮的安全就多了,比如運行環境的安全,如果運行環境有相關病毒,那麼就有被盜風險。還有熱錢包如果存在某些漏洞,通過漏洞也可以直接盜走助記詞。
熱錢包除了常規的轉幣功能外,如果要與那些DApp(DeFi、NFT、GameFi 等)交互,要么直接用自帶的瀏覽器訪問,要么通過WalletConnect 協議與PC 瀏覽器打開的DApp 交互。
注:本手冊提到的DApp 默認指運行在以太坊系列區塊鏈上的智能合約項目。
默認情況下,這樣的交互是不會導致助記詞被盜的,除非錢包安全設計本身有問題。從我們的安全審計及安全研究歷史數據來看,存在錢包助記詞被目標頁面惡意JavaScript 直接盜取的風險。但這個情況比較罕見,因為這實際上屬於極其低級的錯誤,知名錢包都不大可能會犯這種錯誤。
這裡我最擔心的問題實際上都不是以上這些,這些對我來說都可控(你也可以的),我最關心/擔心的問題是:知名錢包的每次版本迭代是如何確保不會被植入惡意代碼或後門?這個問題言下之意很清楚:當前的錢包版本我驗證了沒什麼安全問題,我敢放心用,但我不知道下一個版本安全性如何,畢竟,我或者我的安全團隊不可能有那麼多時間與精力都去做驗證。
這裡所說的惡意代碼或後門造成的盜幣事件已經好幾起了,如曾經的CoPay、近期的AToken 等,具體事件可以自行搜索了解。
對於這種情況,作惡主要有幾種方式:
· 錢包運行時,惡意代碼將相關助記詞直接打包上傳到黑客控制的服務端裡。
· 錢包運行時,當用戶發起轉賬,在錢包後台偷偷替換目標地址及金額等信息,此時用戶很難察覺。
· 破壞助記詞生成有關的隨機數熵值,讓這些助記詞比較容易被破解。
安全這東西,無知者無畏、知者敬畏,許多點是細思恐極的。所以對於存有重要資產的錢包,我的安全原則也簡單:不做輕易更新,夠用就好。
· DeFi 安全到底是什麼
當我們提DApp 時,可能是DeFi、NFT 或GameFi 等等,這幾個的安全大多是相同的,但會有自身的特別點。我們這里以DeFi 為例先講解下,當我們提DeFi 安全時,到底指的是什麼?業內幾乎都只看智能合約部分,似乎智能合約安全了也就沒事了。其實遠遠並非如此。
DeFi 安全至少包括如下幾部分:
· 智能合約安全
· 區塊鏈基礎安全
· 前端安全
· 通信安全
· 人性安全
· 金融安全
· 合規安全
智能合約安全
智能合約安全確實是安全審計最重要的切入點,慢霧針對智能合約的安全審計點可以參考:
https://www.slowmist.com/service-smart-contract-security-audit.html
對於高級玩家來說,如果智能合約部分本身安全性可控(無論是自己能安全審計還是讀懂專業機構的安全審計報告),那麼也就無所謂其他部分的安全了。可控是個很有差異的理解,有的得看玩家實力。比如說智能合約權限過大的風險,玩家是有要求的,除非項目方本身實力雄厚及口碑良好,完全中心化也都無所謂。但對於那些不大知名的、有爭議的或新出現的項目,如果你說這個項目的智能合約有權限過大的風險,尤其是這種權限還可以影響你的本金或收益,你肯定就不願意了。
權限過大這種風險是很微妙的,很多時候權限這東西是方便項目方做相關治理及風險應急的。但對我們來說,這就是人性考量了,萬一項目方作惡呢?於是業內有了折中的實踐:增加時間鎖(Timelock) 來解決一些權限過大的風險,比如:
Compound,這個老牌知名的DeFi 項目,它核心的智能合約模塊Comptroller 及Governance 的admin 權限都加了Timelock 機制: Comptroller(0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b) Governance(0xc0da02939e1441f497fd74f78ce7decb17b66529) 的admin 地址是: Timelock(0x6d903f6003cca6255d85cca4d3b5e5146dc33925)
鏈上可以直接看到Timelock 的時間鎖(delay 參數)是48 小時(172800 秒):
也就是說,如果Compound 的admin(項目方)需要變更目標智能合約的一些關鍵值時,這筆交易上鍊後會有記錄,但必須等到48 小時後才可以最終完成執行。這意味著,只要你願意,你是可以審計admin 的每一次操作,你至少有48 小時來反應。比如如果你不放心,你可以在48 小時內把資金撤走。
還有一種削弱項目方權限過大風險的做法是:將admin 多簽了,比如用Gnosis Safe 進行多簽管理,這樣至少不會出現一言堂。這裡需要注意的是,多簽可以是「皇帝的新衣」,比如一個人掌握了多把鑰匙。所以目標項目的多簽策略需要公示說明清楚,鑰匙都由誰保管,保管鑰匙的角色也一定是有口碑的。
這裡需要特別注意,任何安全策略,都可能出現「皇帝的新衣」問題,表面做得好,實際上卻不是,呈現出了一種虛假安全感。再舉個例子,Timelock 這玩意,看去似乎挺好,實際上出現過有的項目方部署的Timelock 是有後門的情況。用戶一般也不會直接去看Timelock 源碼,而且也不一定看得懂,於是放了個後門在那,一時半會還真不一定有人留意到。
除了權限過大風險,智能合約安全的其他內容也都很關鍵,但理解門檻還是挺高的,這裡就不展開了,我的建議是這樣:至少可以逐步學會閱讀安全審計報告,熟能生巧。
區塊鏈基礎安全
區塊鏈基礎安全指的是區塊鏈本身的安全性,如:共識賬本安全、虛擬機安全等。如果區塊鏈本身安全性堪憂,其上運行的智能合約項目也可以直接喝西北風了。選擇一條擁有足夠安全及知名度的區塊鏈,甚至大概率可以源遠流長的區塊鍊是多麼的重要。
前端安全
前端安全真是魔鬼,與用戶走得太近了,特別容易讓用戶魔怔後上當受騙。可能大家主要的注意力都在自己的錢包上和目標項目的智能合約安全上了,前端安全非常容易被忽視。這裡我需要再次強調,前端安全是魔鬼!我重點說說。
前端安全裡我最在意的點是:我怎麼知道我在這個前端頁面裡的交互對象就是我以為的智能合約?
造成這種不安全感主要是因為以下這兩種風險:
· 內部作惡
· 第三方作惡
內部作惡很好理解,比如開發人員偷偷將前端頁面裡的目標智能合約地址替換為一個有後門的合約地址,或者直接植入個授權釣魚腳本。當你訪問該前端頁面時,你錢包後續的一系列涉及加密貨幣的操作都可能是在陷阱裡完成的。神不知鬼不覺,幣沒了。
第三方作惡,主要指的是兩種:
· 一種是供應鏈作惡,比如前端依賴的第三方模塊被植入了後門,隨著打包發布一起被直接帶入目標前端頁面了。如SushiSwap(僅僅舉例子,並不代表截圖裡的項目有發生這個問題):
· 一種是前端頁面引入的第三方遠程JavaScript 文件,如果這個JavaScript 文件作惡或被黑,那麼目標前端頁面可能就會被影響,如OpenSea(僅僅舉例子,並不代表截圖裡的項目有發生這個問題):
為什麼這裡說可能會被影響是因為,如果項目方在前端頁面以下面這樣的方式來引用第三方遠程JavaScript 文件的話,就可能不會被影響:
這裡的關鍵點是HTML5 的一個不錯的安全機制:標籤裡的integrity 屬性(SRI 機制),integrity 支持sha256, sha384, sha512,如果第三方JavaScript 資源不滿足integrity 的哈希完整性校驗,就不會加載,這個可以很好防止非預期的代碼執行。但使用這個機制需要目標資源支持CORS 響應。具體參考:
https://developer.mozilla.org/zh-CN/docs/Web/Security/Subresource_Integrity
等等,為什麼我前面又提了「可能」,是因為有存在被繞過的場景。至於繞過方式我就不提了,因為大多情況下,你只需關注目標前端頁面在引入第三方遠程JavaScript 文件時是否有integrity 機制。可惜的是,OpenSea 沒有,讓我們祝福它。
通信安全
通信安全這部分,重點看HTTPS 安全就好。首先目標網站一定要HTTPS,絕不允許存在HTTP 明文傳輸的情況。因為HTTP 明文傳輸實在太容易被中間人劫持攻擊了,現在HTTPS 這種安全傳輸協議已經非常普遍。如果HTTPS 出現中間人劫持攻擊,比如植入了惡意JavaScript 代碼到目標前端頁面,此時瀏覽器必然會出現HTTPS 證書錯誤的高顯目提醒。舉個例子,曾經MyEtherWallet 的坑。
MyEtherWallet 曾經是個很流行的網頁錢包,現在也挺知名,不過已經不僅僅是網頁錢包了。我前面有說過,網頁錢包我非常不建議使用,除了前端安全的各種貓膩之外,還可能出現HTTPS 劫持的風險。
2018.4.24,MyEtherWallet 就出現過HTTPS 劫持的重大安全事件,回顧可見:
https://www.reddit.com/r/MyEtherWallet/comments/8eloo9/official_statement_regarding_dns_spoofing_of/https://www.reddit.com/r/ethereum/comments/8ek86t/warning_myetherwalletcom_highjacked_on_google/
當時黑客是通過BGP 這個上古協議劫持了MyEtherWallet 大量用戶所用的DNS 服務(Google Public DNS),這導致許多用戶訪問MyEtherWallet 時,瀏覽器出現HTTPS 錯誤證書的提醒。其實吧,遇到錯誤證書了,原則上就別繼續訪問了,因為這表示目標頁面已經被劫持了。但是真的許多用戶不懂這個安全風險,頂多猶豫下就忽略錯誤證書的提醒繼續強制訪問了。
由於目標頁面已經被劫持,黑客注入了惡意JavaScript 代碼,直接就盜走了目標用戶在目標頁面上的明文私鑰,之後批量轉走這些用戶相關的加密貨幣(主要是ETH)。
這絕對是個經典案例,黑客為了盜幣,動用了BGP 劫持,真是殺雞用了牛刀。之後也出現過幾起類似的案例,這裡就不提了。這裡對於用戶來說實際上只需要注意一點,當你真的要用網頁錢包或玩相關DApp 時,一定要注意:當目標頁面出現HTTPS 錯誤證書提醒時,就立即停止繼續訪問、關閉頁面,那麼你什麼事都不會有。
安全上有個殘酷現實,是這樣的:當已經出現風險時,就別給用戶選擇,一旦給了,總會有用戶無論出於何種原因會掉坑里。其實這裡項目方是需要肩負起相關責任的,比如這個HTTPS 劫持,其實已經有很好的安全解決方案,項目方的開發人員只需配置好HSTS 即可。 HSTS 全稱HTTP Strict Transport Security,是瀏覽器支持的一個Web 安全策略,如果開啟了這個配置,瀏覽器發現HTTPS 證書錯誤後就會強制不讓用戶繼續訪問。明白什麼意思了吧?
人性安全
人性安全這塊很好理解,比如項目方內部作惡,這點在前面已經提了些內容,暫時就不過多展開。因為之後,這塊還會專門展開講講。
金融安全
金融安全是個很需要敬畏的概念,放在DeFi 上,涉及到金融的點,用戶最關心的是幣價、年化收益,一定要好,至少要穩。簡而言之是,我作為用戶,我玩這個DeFi,我要賺錢。如果虧了,得讓我心服口服。嗯,這也是人性。
這部分可能出現詬病的有:
· 不公平啟動,比如預挖、老鼠倉。
· 巨鯨攻擊,所謂的鈔能力。
· 黑莊,看誰跑得快。
· 市場黑天鵝,比如突然的大瀑布,還有如目標DeFi 與其他DeFi/Token 套娃或互操作,這個時候木桶短板可能就決定於其他DeFi/Token 了。
· 還有一些比較技術性的或者說科學家手法,比如搶跑、三明治攻擊、閃電貸攻擊等。
合規安全
合規安全是個非常大的話題,前面提到的AML(Anti Money Laundering) 只是其中一點,還有如KYC(Know Your Customer)、制裁地區限制、證券風險有關的內容等等。其實對於用戶來說,這些不是我們可以對抗的,只能說當玩一個項目時,目標項目可能會受到某些國家的安全監管,因此可能會出現我們在意的隱私信息採集的問題。你可能不在意這點隱私,但卻有在意的人。
比如,2022 年初出現的一件小事:錢包支持Address Ownership Proof Protocol(AOPP) 協議。
當時我看了下AOPP 的協議設計,原來支持了AOPP 的錢包可能洩露用戶隱私:監管機構會有能力知道一個被監管的交易平台和一個不知道的外部錢包之間的關聯。參考:
https://gitlab.com/aopp/address-ownership-proof-protocol
怪不得許多隱私錢包重視這個反饋,紛紛刪除了這個協議的支持。話說回來:這個協議設計還真有意思。我注意到也有的錢包暫無計劃刪除對AOPP 的支持,比如EdgeWallet,他們的觀點認為AOPP 並沒暴露更多的用戶隱私,而且可以讓加密貨幣的流轉提供更大的幫助,因為,如果用戶無法證明一個外部錢包地址屬於自己,那麼一些被監管的交易平台是不允許用戶提幣到這個外部錢包地址的。
剛開始知名硬件錢包Trezor 也是不刪除AOPP 的支持,後來在Twitter 上迫於社區及用戶壓力做了刪除妥協了。
你看,就這麼小的一點,實際上對於有的人來說是隱私大事。這裡並不是說要對抗監管,不管合規安全。其實在我的觀點裡,適當的合規安全妥協是必要的。這個話題就不繼續展開說了,按你的舒服的方式去理解就行。
到這,DeFi 安全的主要部分的相關內容就介紹完了。
除了以上這些,還有未來的新增或更改而引入的安全問題,我們經常說「安全是動態的、不是靜態的」,指的就是這點。比如現在很多項目方都有安全審計及漂亮的安全審計報告,但如果認真閱讀質量不錯的報告就會發現,這些報告會說明清楚,什麼時間範圍安全審計了什麼內容,內容的唯一標記是什麼(比如鍊上開源驗證後的地址或GitHub 倉庫的commit 地址,再或者目標代碼文件的哈希值)。所以報告是靜態的,如果你發現目標項目有不符合報告裡的描述內容,就可以指出。
· NFT 安全
前面提的DeFi 安全幾乎內容都可以應用到NFT 安全上,但NFT 又有自己獨特的安全點,比如:
· Metadata 安全
· 簽名安全