錢包是區塊鏈愛好者與投資者最重要的數字資產儲存工具,而管理錢包的私鑰(Private Key)則是所有數字資產、身份的最後一道防線,近期北科大教授寶博士因為實驗意外,親身經歷了以太坊數字資產以太幣(ETH)以及ERC-721標準代幣遭到駭客攻擊,而在即時處理後,救回大部分資產的驚險經歷。
(本文轉自 北科大互動系助理教授 葛如鈞(寶博士)Medium - 以太貓搶救大作戰 — 北科大教授暗夜暴氣深入區塊鏈救出受駭小貓實錄(真實故事-最新版))
楔子 — 深夜的熱錢包通知
事情是這樣開始的 — 2018 年 12 月 15 日晚上 10 點 49 分,正在電腦前工作的我,收到一則手機通知,內容顯示有大約 0.096 ETH(大約美金 8.44 元的以太幣)從尾號 99a80 的以太幣錢包被轉出。
想想不對,這錢包帳號看來是明明是太太的(同步匯入到我的手機錢包App 幫老婆代管)但我什麼都沒做,怎會無端有錢轉出?啊!突然想起週末前拜託學生將某個 Unity VR 挖礦遊戲程式碼(內有錢包私鑰!)上傳到實驗室 GitHub 帳號,方便後續管理更新 … 再一想,實驗室 GitHub 帳號才剛創好還沒付費,學生上傳程式碼,肯定只能上傳成 Public Repo(公開專案)…印象中區塊鏈高手 — 圖靈鍊公司創辦人 Jeff Hu & 李婷婷 Lee Ting Ting 上回才跟說,有駭客專門寫程式掃描 GitHub 公開專案裡的錢包私鑰,一旦掃到,就會瞬間把錢提走。看來,事有蹊蹺!不妙!
私鑰洩漏,錢被偷了!
馬上私訊學生「你是不是在上傳 Unity VR 挖礦專案到 GitHub? 」學生回說對,正在整理… 我突然想起,學生只是拿我的程式碼回去整理,我並未告訴他程式碼裡有私鑰(為了控制智能合約運作)…
「私鑰被偷了!快停止作業!XD」
檢查一下錢包記錄,裡頭的錢確實在內含私鑰字串的程式碼上傳到 GitHub 平台的公開專案後,被瞬間領走!戶頭裡只剩下小小乾乾的 0.001 ETH 左右 — 一共 0.0968 顆以太幣(折合台幣約 250 元)被偷;這不打緊,要緊的是,這是太太的錢包,裡頭不只有錢,還有兩隻超級珍貴的以太加密貓!一隻是 Tabby 一隻是 DocPurr,都屬於限量的「奇異貓咪系列」當中最稀有的,各僅限量 250 隻!外加另外三隻普通貓,一共五隻,竟然就這樣通通落難到了駭客的手中!
兩隻比較貴的限量奇異貓都個別取過名字,一隻叫做「Dora Meow(朵拉喵)」(寶夫人名叫 Dora / 朵拉),另一隻長得像酷愛做研究的怪博士,因此就隨著筆者外號寶博士,名為「寶博士喵」。兩隻一起可以說完全是天造地設不可竄改般的永恆存在;前者在 250 隻限量 Tabby 貓當中編號第 186 號,後者在 DocPurr 貓 250 隻裡頭,編號第 150 號;總之,都相當罕見!要能同時擁有,恐怕天下沒有幾人(至少自以為)。
名貓有主,卻身陷囹圄
就當時狀況看來,駭客已經透過網路爬蟲取得了太太錢包的私鑰,可說是擁有了完全控制權,隨時可能把太太錢包裡頭所有的貓都偷走!
註:以太貓是一種非同質貨幣( ERC721),每一顆都有獨一無二的編號及不可取代性,只要購買後,就可以存在錢包裡「真正地擁有它」,但只要付手續費,也可以隨時把它轉送給他人。
目前被駭錢包內的 Dora Meow 所屬的 Tabby 奇異貓目前市價不低,最便宜的一隻認養費要 0.75 ETH(以太幣),高出駭客所得 — 0.0968 ETH近 10 倍;而寶博士喵所屬的 DocPurr 奇異貓 現今更是要價不斐,最低認養費就要 1.87 ETH!就算是今天(2018/12/16)熊市當前,折合新台幣依舊要超過 5,000 元!
太太的禮物
談錢傷感情,先不講這兩隻貓一隻在今年 3 月入手時花費 0.28 ETH,以當時 一枚以太幣是 $864 美金,那隻貓的認養價格折合台幣就要大約 7,000 元;另一隻今年 8 月時花費 0.4 ETH 認養 以當時 1 ETH 是 USD$321 來說,認養費要近新台幣 3,800 元!最最重要的是,這兩隻貓都是送太太的禮物!而且送出去後,每每想要回來放入自己的私人貓藍拿來炫耀、晒貓,都被太太嚴詞拒絕(笑),沒想到現在竟然雙雙落入駭客手中,隨時有可能被搶走、變賣!這怎麼可以!?一定要救回來!一喵都不能少???!
救貓行動開始!
一開始我很天真,想說私鑰被盜,等於我跟駭客兩人都可以控制這個錢包(和裡面的貓),所以理論上只要我能比駭客早用這個錢包登入以太貓官網:CryptoKitties.co 謎戀貓,利用平台內建的「贈送」功能,迅雷不及掩耳地趕緊把貓轉移到安全的錢包裡就沒事了,沒想到…
ALERT! Insufficient Fund! (資金不足)!
沒錯!妳應該也想到了,以太坊區塊鏈上的每筆操作,包括以太貓平台上的認養貓、出售貓、生小貓等等,都需要所謂的「燃料費(Gas Fee)」,也就是需將以太坊區塊鏈網路運算/執行合約所必要的「算力費用」支付給礦工,所以如果錢包裡沒有錢(以太幣),就勢必無法做任何操作!且是連送出交易的機會都沒有 — 轉移貓咪需要的交易確認按鈕「CONFIRM」,根本按不下去!
救貓行動 Part 2!
好,這時我開始進行第二步計畫:試著用另外一個錢包,轉一點錢(以太幣)進這個被駭錢包,然後用最快的速度登入這個被駭錢包所屬的以太貓帳號,點選「贈貓」按鈕,把貓迅速送出去。
果不其然,這個計策還是失敗了!每一次轉進被駭錢包的以太幣,都以迅雷不及掩耳的速度被轉出,轉到駭客的錢包裡(目前駭客所得超過 12 個以太幣)。從下圖可以看到從最下方的「OUT (被盜/轉出)0.0968 ETH 」事件發生後,我就多次試著轉帳 0.02, 0.01, 0.01, 0.01 其中光 0.01 ETH 我就轉了三次,每次都是想要比速度,希望能搶在駭客程式作動前,用手速把貓轉出。但是都輸了… 而且那些錢又通通再被駭客的吸金大法給吸走!(跪)
我開始感到萬念俱恢
看來駭客應該是取得私鑰以後,便透過電腦程式不斷自動偵測該錢包餘額及動作,只要有新的錢進到錢包,立刻就會啟動吸金轉移大法,把錢吸走。
怎麼辦呢?
只好向最近區塊鏈圈傳說中的最神祕的組織,如同光明會、共濟會一般的存在 — 0x1 學院(0x1 Academy)成員求救。
進入 0x1 組織的核心群組
為了向 0x1 區塊鏈高手求援,我進入了 0x1 組織的核心群組「0x1 Core」,在那裡,我對群組說道:
發生了慘劇,我想要救貓。 — 寶博士
其中最強的某兩個成員(他們經常被認為是同一人),在瞭解情況後,回覆說「我們試試看」然後就消失了。
幾分鐘過去,J 回覆了。
“打0.000333進去” — J說
我原先還有點懷疑,但想說既然 J 說得肯定,我也沒有不去試試的道理。
成功了!!竟然沒有被轉走!
神祕的 0.000333 ETH 就這樣巧巧地作為先遣部隊,深入了敵營,進入了被駭的錢包而沒有被駭客發現。
錢包裡多了錢,燃料費應該就足夠了,便趕緊去轉貓!轉幾隻呢?先轉一隻,而且得先轉一隻最貴的!
第二個神祕數字出現了:
“永遠不要打超過0.00168” — J說
如同神諭一般,不知為何,J 就是知道能夠怎樣避開敵方駭客的火線… 其實有原因,但總之那時先無法理解思考這麼多啦,最最要緊的,是要救貓!搶回寶李一家的重大資產,而且要救就要先救最貴的 — 寶博喵!
緊張時刻
要知道,現下我們所有動作都在駭客的眼皮底下,不只在區塊鏈上可以查看我們的所有交易記錄(包括剛剛摸進去的 0.000333 ETH)駭客更可以隨時把我們所有錢跟貓瞬間領光轉走,甚至透過智能合約封鎖外部的所有行動!
第一隻貓救援成功!博士貓順利出脫!
我們順利的在駭客眼皮底下救走一隻價值台幣 7,000 元的以太貓!!
時間就是金錢,接下來的動作要快,下一隻要救的貓也是不便宜。駭客非常可能針對駭入的錢包隨時有在進行「異常行為偵測」,並在發現受害者的行動後,做出防護或反擊。雖然我在聊天室裡和 J 的對談口氣依舊輕鬆,但按下另外一筆 0.000333 ETH 轉出按鈕時,手指卻是顫抖的。
成功了!第二批援救部隊又進去了!
從上圖的區塊鏈記錄來看(依據時間由下至上),可以很清楚的看到,「0.000333 ETH」救援部隊一共進去了三次,第一次帶回了寶博喵,第二次帶回了朵拉喵以及另外一隻貓,第三次則帶回了第四隻普通喵。
自此,寶博士喵和朵拉喵都被營救回了寶博士名為「D Furball」的貓藍;看起來都鬆了一口氣呢(咦 XD),開心地和其他的奇異貓咪們簇擁在一起~
總之就這樣,從 2018/12/15 晚間 11:47 至 2018/12/16 凌晨 0:18 一共將耗費近半小時的時間,轉了三筆營救用的以太幣,一共 0.000999 ETH,把四隻貓給順利救了回來!
最後兩隻被救回的貓,看起來果然還是有點驚魂未定。?
ONE MORE THING…
故事還沒結束(!)
我原先刻意留下了最後一隻貓在受駭錢包裡(如下圖 — 是在 TFF 台北金融發展基金會 帶 FinTech eMBA 區塊課時所生),想說也許 J 會想玩玩別種營救方法;如果 J 他們沒動作,也許之後自己也來創些新的營救方法把它救出,就姑且讓牠留在被駭錢包裡一段時間好了… 結果…
就這樣,一念之間
一隻貓的命運就此改變!
2018/12/16 凌晨 0 點 58 分,原先沉靜的錢包突然動了起來!
我因為還在研究駭客的收款錢包,想要試著找出駭客的來源線索,另外也還沉浸在救貓成功的喜悅裡,所以還沒睡,突然看到手機又 叮.叮.叮 的連續跳出好幾則通知,顯示有幾筆款項轉進了受駭錢包,接著幾則交易被接連產生;我心生好奇但不疑有它,想說被駭錢包裡面也幾乎沒錢了,貓也算是都救走了,猜測大概是 J 他們可能在玩些什麼把戲,我也就沒注意。
沒想到,過了一小時, J 說他的營救記錄寫好在 Medium 上了,要我過去看看,一看發現,竟然不是 J!
J 並沒有在營救完成後去動那個錢包,而是駭客動了!
駭客暴怒??偷走了最後一隻貓?!
根據記錄,被駭錢包在我們營救完四隻貓的半個小時後,這不知名駭客作了一連串任誰都難以想像到的事 — 他連續轉入了兩筆 0.003 ETH 以及 0.002 ETH 一共 0.005 以太幣,然後把最後一隻貓,加上剩餘在錢包裡的最後一點錢,全部捲走了!
最後的這幾筆操作記錄已原原本本、永永遠遠的紀錄在以太坊區塊鏈上頭,永遠不會消失。上圖中的最下方一筆,就是 2018/12/16 凌晨 0 點 58 分 13 秒 錢包突然動起來的第一筆。駭客原先只是發現「錢包裡怎麼還有錢?」後,轉了一小筆手續費(0.003 ETH)進來,把最後一滴以太幣榨乾…
接著,駭客顯然發現了我們前面的幾筆轉帳記錄,發現了神妙無比的救貓大作戰,他心想我們可能是難得一見的(以太)貓藏家,還見我們花費如此神力(神祕的 0.000333 部隊)把貓救走,除了懷疑貓可能很有價值外,也可能很氣的一查發現,我們轉走的每一隻貓的市場價格都是他偷走的以太幣數量(0.0968 ETH)的數十倍 XDD!駭客在暴怒之餘,也許心想最後一隻貓就算沒有價值賣不出去,也要把貓給搶走洩憤!
駭客畫像
以下整理上述一連串的動作以及時間距離,並試圖描繪駭客的行為樣貌:
- 2018/12/15 深夜 10 點 49 分,駭客吸了寶夫人的錢包共 0.0968 ETH,轉移至偷盜物資集中錢包
- 2018/12/15 深夜 11 點 47 分 43 秒,小貓拯救行動開始,第一批 0.000333 ETH 抵達被駭錢包!
- 2018/12/16 凌晨 0 點 18 分 57 秒,小貓營救行動結束,第四隻小貓離開被駭錢包!轉移至寶博士安全錢包 — D Furball 貓藍。
- 在大約這段時間,駭客發現被駭錢包裡還有零錢(估計是有寫一個重新掃描程式,會回傳還有錢但吸金大法沒有吸走的帳號是哪些)以及一隻貓!
- 2018/12/16 凌晨 0 點 33 分,駭客疑似嘗試轉移第五隻(最後一隻即將被盜小貓),但最後因不明原因放棄
- 2018/12/16 凌晨 0 點 58 分 駭客轉進了 0.003 ETH
- 56 秒後,錢包裡最後剩餘的錢被榨乾 轉出— 駭客的吸金程式控制被駭錢包當下轉走了僅存的 0.00153736726 ETH(大約新台幣 3.9 元)
- 過了 4 分鐘 28 秒,估計此時駭客似乎發現了我們此前的拯救行動,他怒而轉進了 0.002 ETH(大約新台幣 5 元 — 竟然比他前次榨乾轉走的錢要多!)要進行最後的邪惡舉動!
- 2 分鐘 17 秒後,估計駭客利用這段時間以被駭錢包登入 CryptoKitties 網站 ,手動操作以太貓的轉移功能,把貓偷走了! (*請先記住這裡有個疑點「為何上一筆 0.002 ETH 過了 2 分 17 秒卻沒有被吸金程式轉走?」)
- 2018/12/16 凌晨 1 點 17 分整(距離駭客的上一個行動足足又過了 8 分鐘又 46 秒)被駭錢包裡的最後一個動作出現了:0.00098 ETH(相當於新台幣 2.7 元)被轉移至駭客集資錢包,整個攻擊偷盜行動正式結束。
駭客手動登入的證據:
如果是用呼叫合約的方式轉移貓咪,在以太貓的介面上就不會留下歷史紀錄,而謎戀貓網站上,若用被駭錢包登入確實可以看到最後兩筆資料(轉移被盜小貓)均有留下記錄,那麼就駭客就一定是手動轉移而非使用智能合約程式盜走小貓;幾乎可以百分之百確定 — 駭客確實曾經手動登入謎戀貓網站。
*請注意上圖倒數第二個 00:33 分的轉移記錄,這筆記錄至今是個謎,估計是駭客可能更早的時間(凌晨 0 點 33 分 — 這筆沒有顯示在被駭錢包記錄上)就曾試圖偷走貓,但發現錢包裡的錢不夠,得手動停掉吸金程式碼,因而放棄轉移,並且有了 凌晨 0 點 58 分 後續一連串的動作。
好!在進入結語之前,先讓我們替這隻傳奇被盜小貓默哀兩行。
結語
好!總結這次精采萬分(其實是狠蝦想哭)的事件,我們學到了:
- 千萬不要在公開的網路平台上露出錢包私鑰 — 就算需要帳號密碼登入的也一樣!許多平台只要單一組帳號密碼登入,就能看到許多公開文件,諸如 Pastebin, Gist, 或這次的 GitHub
- 平時多燒香,多認識朋友,這次靠 0x1 Friend 總算在夠短的時間之內把貓轉走,雖然犧牲了最後一隻貓(我的錯 QQ)但至少總損失控制在 0.1 以太幣(現價約新台幣 250 元)以內,不致於讓整個週末毀於一旦。
- 大家都知道私鑰被盜會損失錢財,但這次經驗告訴我們,整個「被盜」是有過程而且有一定機率和駭客搶物資、搶錢財的!主要原因就出在以太坊的操作、轉帳、轉貓需要手續費的特性,使得被盜錢包的所有權雖然被盜走了,但裡頭的幣和物資將不會「立刻」被轉走!雖就此次案例而言,尚未知是程式造成還是人為因素,但總之會有一定的時間差!這就是黃金搶救時間!
補充:後續觀察發現,在 11 月中該名駭客便曾利用類似手法慘絕人寰的劫走了尾號「Cb4B1」的帳號至少 1,200 枚 TrueUSD 穩定幣(價值至少台幣 3 萬 6 千元)。該被盜錢包擁有者似乎進行了類似本文一開始進行的拯救行動,轉了兩次 0.01 ETH 試圖把 TUSD 轉出,但均告失敗,最後落入被駭客手動榨乾的悲慘結局。
此外,由於以太貓咪的特性是,無論歷史如何演變,貓咪如何移轉;單隻貓咪的移轉歷史紀錄永遠獨立於其他貓咪(這點和一般區塊鏈代幣資產不同);因此,雖然我們失去了這隻小貓,但我們原則上可以永永遠遠的追查牠去了何方,究竟轉移給了誰,認養費被掛了多少,通通可以在區塊鏈上看得到 ,直到千秋萬世 — 以太坊區塊鏈崩毀的那一天!
被盜小貓目前為止的身世
可以看到,被盜小貓在 232 天前誕生之後,一共經歷了四次轉移,第三次來到了朵拉貓的家,第四次就是駭客偷盜的紀錄了。
讓我們再次緬懷牠
雖說小貓是被盜走了,但其實駭客也相應地付出了0.000815 ETH 的轉移手續費,總計轉入了 0.03+0.02 一共 0.05 ETH 的總成本;所以也不算是被免錢認養啦(笑)!而且,我們將永遠能透過檢查鏈上交易記錄,知道這隻被盜小貓到底最後流落何方。
而在戰火之下被救走的小貓們呢?
早就被寶教授暴氣派遣網路部隊營救受駭迷戀貓後,勒令乖乖繼續寫論文啦!
如果你想追蹤從此在區塊鏈上留名的「被盜小貓」,可以關注牠的交易記錄:
如果你想了解此次的駭客攻擊與拯救小貓完整記錄,歡迎查看寶夫人的錢包:
如果想閱讀事件的英文版記錄,歡迎閱讀 J 的 Medium 文章:
以及這次未參戰但提供了很多後續建議的 吳冠融 Roger Wu 的:
?相關報導?
資安威脅升溫,從「極光行動」到比特幣勒索病毒「WannaCry」:PolySwarm群體智能是否能解?
【Zaif 交易所遭駭|事件追蹤】日本資安專家:兇手已曝光
《BlockTempo動區動趨》LINE官方號開通囉~立即加入獲得第一手區塊鏈、加密貨幣新聞報導!