PREMINT攻擊事件全解析

2022-07-18 12:32:40
收藏
此次攻擊對於開發者最大的啟示在於,web3.0世界既然無法脫離web2.0獨立存在,那就必然會承受和web2.0一樣的攻擊方式。

作者:Go+ Security

7月17日16:00(UTC+8), premint.xyz 遭遇黑客攻擊,部分用戶的NFT失竊。攻擊事件發生後,GoPlus安全分析師迅速對其進行了全面解析,並從普通投資者和開發者兩個角度給出了安全建議。

攻擊過程

  • 攻擊者通過在premint.xyz網站中通過植入惡意的JS腳本進行攻擊,當用戶進行常規操作時,執行惡意代碼,欺騙用戶對授權操作setApprovalForAll(address,bool)的交易進行簽名。騙取到授權後,盜取用戶的NFT等資產。

攻擊原理

image

  • 此文件被黑客注入了一個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個小時,很難判斷如果此時該腳本復活,會不會引發更大的損失。

    https://api2.mubu.com/v3/document_image/625cf51f-48e4-4ce1-a75c-2fec70925cdc-13536382.jpg

    https://api2.mubu.com/v3/document_image/625cf51f-48e4-4ce1-a75c-2fec70925cdc-13536382.jpg

啟示

啟示1:作為普通投資者我們該怎麼辦?如果官網都不可靠了,如何避免上當受騙?

  • 本次攻擊對於很多不了解技術的用戶來說,基本可以說是"初見殺",百分百中招,畢竟誰也不會無端懷疑官網有詐。但仔細想想,所有鏈上的交易都必須通過錢包的簽名,所以只要注意簽名內容還是可以識別出其中風險的。
  • 很多區塊鏈用戶都有個非常不好的習慣,只要操作進入到錢包中,除了調gas的過程,其他步驟都是下意識操作。實際上簽名前的確認信息包含著大量關鍵內容,GoPlus Security建議大家進行任何簽名操作前都必須仔細確認。
  • 以此次攻擊為例。當用戶對Premint進行簽名驗證時,由於只是進行信息驗證,沒有任何上鏈的必要,所以發起的Signature Request應只包含Origin信息(請求方),用戶的地址,Nounce信息,可能有一些附加返回信息。如下圖(由於https://www.premint.xyz/已經暫時offline,我們以Opensea為例):

https://api2.mubu.com/v3/document_image/93cdd40a-7733-4fc9-9c61-5beac6e8b84f-13536382.jpg

  • 但對於被注入攻擊後遭到篡改的交易簽名,由於須要將交易上鏈,交易將會以合約調用的形式呈現出更多的信息。例如在一個使用setApprovalForAll的NFT授權中,會顯示出這筆交易是在哪進行的(圖中為etherscan),調用了什麼方法(setApprovalForAll),授權對象是誰,消耗多少ETH。

    https://api2.mubu.com/v3/document_image/26a99589-6d89-49d8-8f89-c0c25cfd24ad-13536382.jpg

  • 回過頭來,我們根據網友貢獻的截圖可見,Permint被注入攻擊後,雖然操作提示的是驗證簽名,但是實際拉錢包簽名的交易完全是上鏈的setApprovalForAll,完全與上圖相符,稍加觀察就能知道此處是有問題的。

image

  • 實際上,合約各類調用、轉ETH(或其他原生幣)、轉Token等,在錢包中簽名信息都是不同的,所有投資者都應該了解其中的差異,以免遭到此類攻擊時產生損失。在此GoPlus Security非常建議大家再親自模擬一下操作過程,了解各種不同的簽名信息(只要交易不發出去就不會產生任何費用,沒有任務學費),一旦學會看簽名信息,你將基本上規避掉幾乎所有釣魚、注入、欺詐攻擊。
  • 不要懶惰,想要保證自己的安全,學習是唯一的途徑。

啟示2:作為開發者我們該怎麼辦?如何避免被注入攻擊?

  • 此次攻擊對於開發者最大的啟示在於,web3.0世界既然無法脫離web2.0獨立存在,那就必然會承受和web2.0一樣的攻擊方式。僅僅在合約層面保障自己的安全是不夠的,所有傳統的安全準備一樣都不能落下,任何一個小的疏忽都可能造成重大損失。
  • 另外,遇到此類問題後應馬上修復或者隔離,倘若存在僥倖心理,沒有第一時間處理風險源,被安全分析師扒皮嘲諷是小事;萬一攻擊手段還可用,損失可是會持續產生的,這可是大事。
鏈捕手ChainCatcher提醒,請廣大讀者理性看待區塊鏈,切實提高風險意識,警惕各類虛擬代幣發行與炒作,站內所有內容僅係市場信息或相關方觀點,不構成任何形式投資建議。如發現站內內容含敏感信息,可點擊“舉報”,我們會及時處理。
ChainCatcher 與創新者共建Web3世界