PREMINT攻擊事件全解析
作者:Go+ Security
7月17日16:00(UTC+8), premint.xyz 遭遇黑客攻擊,部分用戶的NFT失竊。攻擊事件發生後,GoPlus安全分析師迅速對其進行了全面解析,並從普通投資者和開發者兩個角度給出了安全建議。
攻擊過程
- 攻擊者通過在premint.xyz網站中通過植入惡意的JS腳本進行攻擊,當用戶進行常規操作時,執行惡意代碼,欺騙用戶對授權操作setApprovalForAll(address,bool)的交易進行簽名。騙取到授權後,盜取用戶的NFT等資產。
攻擊原理
- 當用戶訪問https://www.premint.xyz/時,網站將加載如下js資源文件https://s3-redwood-labs.premint.xyz/theme/js/boomerang.min.js。
- 此文件被黑客注入了一個script腳本,該腳本加載了另一個托管在屬於黑客的假域名(s3-redwood-labs-premint-xyz.com )中的攻擊腳本文件https://s3-redwood-labs-premint-xyz.com/cdn.min.js?v=1658050292559。此腳本含有騙取用戶授權的交互(目前已無法訪問了)。
- 當用戶進行常規的Verifying your wallet onwership簽名(也就是簽名登錄)操作時,此腳本將被觸發,將原有的驗證簽名代替為一筆授權攻擊者可轉移用戶高價值NFT的交易。一旦此交易被簽,資產將會失竊。(注:攻擊腳本也可能會視情況騙取用戶的ERC20token授權,由於腳本已無法訪問我們當前無從得知。)
防不勝防
- 本次攻擊對於普通用戶來說,可能是最不好對付、最容易中招的。
- 攻擊的全部C端交互都在Premint的官方網站中,首先就很容易讓大家放鬆警惕,因為大家總是默認官方網站是沒有任何問題的。
- 騙取交易簽名的過程發生在正常操作的簽名驗證過程中,由於多數用戶不會去看錢包的簽名詳情(大部分用戶不了解如何判斷簽名是否安全,同時出於對官方的信任而極為容易忽略這一步可能存在的風險),所以攻擊過程極為隱蔽。
漏洞在哪裡
大家可能會奇怪,為什麼Premint的官方網站還會出現攻擊代碼,這是因為托管的S3(AWS的對象存儲服務)上的js資源文件被黑客侵入遭到篡改。
至於為什麼會被入侵,根據現有的資料,我們懷疑是S3配置出現錯誤,導致了Bucket未授權訪問,使得攻擊者可以隨意列出、讀取或者寫入S3 bucket,從而對js資源文件進行篡改。
整個過程中最為令人不解的是,黑客的攻擊行為在17日16:00(UTC+8)就被發現,但直到17日22:00(UTC+8)之前,Premint官方依然沒有對被攻擊的js文件進行歸正,boomerang.min.js 文件中仍然包含被黑客注入的惡意script,頁面載入時仍然會去加載黑客的攻擊腳本文件,只是這段惡意script本身已經無法訪問了(攻擊域名 s3-redwood-labs-premint-xyz.com 已無法訪問)。這種狀態維持了6個小時,很難判斷如果此時該腳本復活,會不會引發更大的損失。
啟示
啟示1:作為普通投資者我們該怎麼辦?如果官網都不可靠了,如何避免上當受騙?
- 本次攻擊對於很多不了解技術的用戶來說,基本可以說是"初見殺",百分百中招,畢竟誰也不會無端懷疑官網有詐。但仔細想想,所有鏈上的交易都必須通過錢包的簽名,所以只要注意簽名內容還是可以識別出其中風險的。
- 很多區塊鏈用戶都有個非常不好的習慣,只要操作進入到錢包中,除了調gas的過程,其他步驟都是下意識操作。實際上簽名前的確認信息包含著大量關鍵內容,GoPlus Security建議大家進行任何簽名操作前都必須仔細確認。
- 以此次攻擊為例。當用戶對Premint進行簽名驗證時,由於只是進行信息驗證,沒有任何上鏈的必要,所以發起的Signature Request應只包含Origin信息(請求方),用戶的地址,Nounce信息,可能有一些附加返回信息。如下圖(由於https://www.premint.xyz/已經暫時offline,我們以Opensea為例):
但對於被注入攻擊後遭到篡改的交易簽名,由於須要將交易上鏈,交易將會以合約調用的形式呈現出更多的信息。例如在一個使用setApprovalForAll的NFT授權中,會顯示出這筆交易是在哪進行的(圖中為etherscan),調用了什麼方法(setApprovalForAll),授權對象是誰,消耗多少ETH。
回過頭來,我們根據網友貢獻的截圖可見,Permint被注入攻擊後,雖然操作提示的是驗證簽名,但是實際拉錢包簽名的交易完全是上鏈的setApprovalForAll,完全與上圖相符,稍加觀察就能知道此處是有問題的。
- 實際上,合約各類調用、轉ETH(或其他原生幣)、轉Token等,在錢包中簽名信息都是不同的,所有投資者都應該了解其中的差異,以免遭到此類攻擊時產生損失。在此GoPlus Security非常建議大家再親自模擬一下操作過程,了解各種不同的簽名信息(只要交易不發出去就不會產生任何費用,沒有任務學費),一旦學會看簽名信息,你將基本上規避掉幾乎所有釣魚、注入、欺詐攻擊。
- 不要懶惰,想要保證自己的安全,學習是唯一的途徑。
啟示2:作為開發者我們該怎麼辦?如何避免被注入攻擊?
- 此次攻擊對於開發者最大的啟示在於,web3.0世界既然無法脫離web2.0獨立存在,那就必然會承受和web2.0一樣的攻擊方式。僅僅在合約層面保障自己的安全是不夠的,所有傳統的安全準備一樣都不能落下,任何一個小的疏忽都可能造成重大損失。
- 另外,遇到此類問題後應馬上修復或者隔離,倘若存在僥倖心理,沒有第一時間處理風險源,被安全分析師扒皮嘲諷是小事;萬一攻擊手段還可用,損失可是會持續產生的,這可是大事。