Bybit冷錢包竊案
終於可以來寫加密貨幣交易所 Bybit 被偷走 15 億美金的案例啦!
事情發生在 2 月 22 號,Bybit 的冷錢包被駭客直接偷走大約 15 億美金,換算成台幣快 500 億了,是史上最大宗的加密貨幣竊案。
事件一出來的時候,我就認為這會是個歷史性的事件,因為:
- 損失 15 億美金,史上最嚴重
- 是冷錢包出事,不是熱錢包
- 已經有證據證明是北韓的駭客集團 Lazarus Group 幹的
在講犯罪手法之前,我們先來看一下 Bybit 的冷錢包平常是怎麼簽署交易的。
他們在 Ethereum 上的冷錢包走的是智慧合約多簽錢包,多簽的數量沒有查到細節,有查到 3/5 跟 3/6 兩種說法,但總之需要有 3 個人簽署才會生效。
而整個錢包系統用的是一個叫 Safe{Wallet} 的東西,提供了一個介面讓簽署者看交易內容,實際要簽署的時候,需要使用 Ledger 提供的冷錢包。
當三個人簽署這個交易後,交易就直接送去鏈上了。
而這次的攻擊其實與冷錢包本身無關,是 Safe{Wallet} 這段被駭了。駭客入侵了 Safe{Wallet} 的 S3 bucket,修改了前端的檔案,讓那些 signer 看到要簽署的交易內容是 A,結果真正簽的是 B。因此就簽署了錯誤的交易,就是這麼簡單。
這邊有個細節是,一般會想到的「竄改交易」是例如說我想轉 100 塊到熱錢包,此時竄改成轉 100 萬給駭客的地址,但是在這個案例中並不是這樣。實際上駭客簽署的內容是去執行智慧合約的某個方法,讓自己有權限,就可以繞過後續的簽名,直接把錢轉走。
那為什麼不直接篡改交易就好,要額外多一步呢?我猜有可能是因為 :
(1) 這個地址有多個幣種,竄改交易只能轉一個幣種
(2) 轉更大額有風控機制會擋下來
總而言之呢,看似是轉給熱錢包的交易,其實是「授權給駭客的智慧合約」,三個簽署者都簽完,交易上鏈之後,就直接 gg 了。
我上一份工作做的是冷錢包相關的風險評估,看過不少交易所的文件跟架構,稍微有些理解,看到這事件我就想說不合理啊,這個流程有問題啊。
第一個大問題是,為什麼冷錢包轉帳的地址沒有白名單?這算是滿基本的操作,因為是冷錢包,所以通常轉帳的地址就那幾個,所以會設定一個白名單,設定白名單要先簽過一次交易,之後才能轉到這個地址。我查了一下,好像 Safe{Wallet} 本身沒有這個功能 😂
第二個問題是,為什麼沒有人確認自己簽的交易跟看到的是不是一樣?
我去找了 Bybit CEO 親上火線解釋的片段,其實流程裡是有的,但沒人照做,以下是英文逐字稿原文以及中文翻譯:
I use a a ledger as a hardware device for the last signing part. so after I signed and also check the The Ledger screen one of the issues with, at least from my experience, with the ethereum related cold wallet transfer is that it doesn’t exactly shows the destination.
我使用 Ledger 作為硬體設備來進行最後的簽署步驟。所以我簽署時也檢查了 Ledger 的螢幕。不過根據我的經驗,與以太坊相關的冷錢包轉帳存在的一個問題是,它並不會準確地顯示目標地址。
it shows a lot of code so it is not so I checked the code but I didn’t check fully. normally also the address the destination address is not inside of that multi-sig signing, so I signed.
它顯示了大量的 code,因此並不那麼直觀。我檢查了 code,但沒有完全檢查。通常來說,目標地址並不會出現在多重簽名的簽署內容中,所以我還是簽署了交易。
簡單來講就是,因為看不懂所以就不檢查了,有看跟沒看一樣。三個人可能都看過,但是都沒看仔細,就當作例行流程直接簽了。就算內容看不懂,只要能檢查到 to 的位置,應該就能發現 to 是一個陌生的地址。說不定其實也是個 UI + UX 問題,因為 Ledger 每次顯示的內容都不重要,所以每次都被略過不看。
所以呢,雖然是因為 Safe{Wallet} 前端被駭所導致的事件,但我覺得 Bybit 也要負滿大的責任,畢竟前端被駭在 Web3 世界早就不是什麼新鮮事,這個風險是絕對可以預測到的,明明知道風險卻沒有做任何對策,或是做得不夠徹底。
我以前看過的冷錢包流程中,有那種很安全的是 100% 離線的,例如說拿來簽署的 UI 是放在自己內網,而且簽署完之後還沒完成,不會直接上鏈,而是把簽署好的交易複製到某個硬體裝置,接著把這個裝置 帶去一個完全隔離的房間,用那裡面的電腦搭配上最後一個 key 去簽署(到這一步多簽才完整),此時在 UI 上可以看到正確的交易內容,確保交易內容無誤。
簽完之後,一樣把簽好的東西放到硬體裝置中儲存,再帶到外面的電腦,接上公網,把交易上鏈。
由於最後一步的電腦在一個離線的環境中,因此 UI 很難被篡改(除非有內鬼,那是另外一回事),能很大程度保證看到的就是最後簽的。要攻破整個流程,需要的成本會多很多。
總之呢,整件事情差不多就是這樣,沒有強制的白名單、三個簽署者也都沒有檢查簽的內容,只要竄改 UI 就能騙過這些人,然後偷走了 15 億美金。看起來人果然是資安最脆弱的一環,明明知道要檢查,但因為看不懂 + 以前也都是這樣的,一個失誤就釀成大禍。
補充文章:
評論