区块链相关安全名词及常见攻击手法
錢包 Wallet
錢包(Wallet)是一個(gè)管理私鑰的工具,數(shù)字貨幣錢包形式多樣,但它通常包含一個(gè)軟件客戶端,允許使用者通過錢包檢查、存儲(chǔ)、交易其持有的數(shù)字貨幣。它是進(jìn)入?yún)^(qū)塊鏈?zhǔn)澜绲幕A(chǔ)設(shè)施和重要入口。
據(jù) SlowMist Hacked 統(tǒng)計(jì),僅 2018 年因“釣魚”、“第三方劫持”等原因所造成的錢包被黑損失總金額就達(dá) 69,160,985 美元,深究根本,除了部分錢包本身對(duì)攻擊防御的不全面之外,最主要的是錢包持有者們的安全防范意識(shí)不強(qiáng)。
冷錢包 Cold Wallet
冷錢包(Cold Wallet)是一種脫離網(wǎng)絡(luò)連接的離線錢包,將數(shù)字貨幣進(jìn)行離線儲(chǔ)存的錢包。使用者在一臺(tái)離線的錢包上面生成數(shù)字貨幣地址和私鑰,再將其保存起來。冷錢包是在不需要任何網(wǎng)絡(luò)的情況下進(jìn)行數(shù)字貨幣的儲(chǔ)存,因此黑客是很難進(jìn)入錢包獲得私鑰的,但它也不是絕對(duì)安全的,隨機(jī)數(shù)不安全也會(huì)導(dǎo)致這個(gè)冷錢包不安全,此外硬件損壞、丟失也有可能造成數(shù)字貨幣的損失,因此需要做好密鑰的備份。
熱錢包 Hot Wallet
熱錢包(Hot Wallet)是一種需要網(wǎng)絡(luò)連接的在線錢包,在使用上更加方便。但由于熱錢包一般需要在線使用,個(gè)人的電子設(shè)備有可能因誤點(diǎn)釣魚網(wǎng)站被黑客盜取錢包文件、捕獲錢包密碼或是破解加密私鑰,而部分中心化管理錢包也并非絕對(duì)安全。因此在使用中心化交易所或錢包時(shí),最好在不同平臺(tái)設(shè)置不同密碼,且開啟二次認(rèn)證,以確保自己的資產(chǎn)安全。
公鑰 Public Key
公鑰(Public Key)是和私鑰成對(duì)出現(xiàn)的,和私鑰一起組成一個(gè)密鑰對(duì),保存在錢包中。公鑰由私鑰生成,但是無法通過公鑰倒推得到私鑰。公鑰能夠通過一系列算法運(yùn)算得到錢包的地址,因此可以作為擁有這個(gè)錢包地址的憑證。
私鑰 Private Key
私鑰(Private Key)是一串由隨機(jī)算法生成的數(shù)據(jù),它可以通過非對(duì)稱加密算法算出公鑰,公鑰可以再算出幣的地址。私鑰是非常重要的,作為密碼,除了地址的所有者之外,都被隱藏。區(qū)塊鏈資產(chǎn)實(shí)際在區(qū)塊鏈上,所有者實(shí)際只擁有私鑰,并通過私鑰對(duì)區(qū)塊鏈的資產(chǎn)擁有絕對(duì)控制權(quán),因此,區(qū)塊鏈資產(chǎn)安全的核心問題在于私鑰的存儲(chǔ),擁有者需做好安全保管。
和傳統(tǒng)的用戶名、密碼形式相比,使用公鑰和私鑰交易最大的優(yōu)點(diǎn)在于提高了數(shù)據(jù)傳遞的安全性和完整性,因?yàn)閮烧摺獙?duì)應(yīng)的關(guān)系,用戶基本不用擔(dān)心數(shù)據(jù)在傳遞過程中被黑客中途截取或修改的可能性。同時(shí),也因?yàn)樗借€加密必須由它生成的公鑰解密,發(fā)送者也不用擔(dān)心數(shù)據(jù)被他人偽造。
助記詞 Mnemonic
由于私鑰是一長(zhǎng)串毫無意義的字符,比較難以記憶,因此出現(xiàn)了助記詞(Mnemonic)。助記詞是利用固定算法,將私鑰轉(zhuǎn)換成十多個(gè)常見的英文單詞。助記詞和私鑰是互通的,可以相互轉(zhuǎn)換,它只是作為區(qū)塊鏈數(shù)字錢包私鑰的友好格式。所以在此強(qiáng)調(diào):助記詞即私鑰!由于它的明文性,不建議它以電子方式保存,而是抄寫在物理介質(zhì)上保管好,它和 Keystore 作為雙重備份互為補(bǔ)充。
Keystore
Keystore 主要在以太坊錢包 App 中比較常見(比特幣類似以太坊 Keystore 機(jī)制的是:BIP38),是把私鑰通過錢包密碼再加密得來的,與助記詞不同,一般可保存為文本或 JSON 格式存儲(chǔ)。換句話說,Keystore 需要用錢包密碼解密后才等同于私鑰。因此,Keystore 需要配合錢包密碼來使用,才能導(dǎo)入錢包。當(dāng)黑客盜取 Keystore 后,在沒有密碼情況下, 有可能通過暴力破解 Keystore 密碼解開 Keystore,所以建議使用者在設(shè)置密碼時(shí)稍微復(fù)雜些,比如帶上特殊字符,至少 8 位以上,并安全存儲(chǔ)。
圖片來自 imToken Fans 活動(dòng)分享
由于區(qū)塊鏈技術(shù)的加持使得區(qū)塊鏈數(shù)字錢包安全系數(shù)高于其他的數(shù)字錢包,其中最為關(guān)鍵的就是兩點(diǎn):防盜和防丟。相比于盜幣事件原因的多樣化,造成丟幣事件發(fā)生的原因主要有五個(gè)類型:沒有備份、備份遺失、忘記密碼、備份錯(cuò)誤以及設(shè)備丟失或損壞。因此,我們?cè)趥浞菀粋€(gè)區(qū)塊鏈數(shù)字錢包的時(shí)候,對(duì)私鑰、助記詞、Keystore 一定要進(jìn)行多重、多次備份,把丟幣的風(fēng)險(xiǎn)扼殺在搖籃之中。最后為大家提供一份來自 imToken 總結(jié)的錢包安全“十不原則”:
- 不使用未備份的錢包
- 不使用郵件傳輸或存儲(chǔ)私鑰
- 不使用微信收藏或云備份存儲(chǔ)私鑰
- 不要截屏或拍照保存私鑰
- 不使用微信、QQ 傳輸私鑰
- 不要將私鑰告訴身邊的人
- 不要將私鑰發(fā)送到群里
- 不使用第三方提供的未知來源錢包應(yīng)用
- 不使用他人提供的 Apple ID
- 不要將私鑰導(dǎo)入未知的第三方網(wǎng)站
公鏈 Public Blockchain
公有鏈(Public Blockchain)簡(jiǎn)稱公鏈,是指全世界任何人都可隨時(shí)進(jìn)入讀取、任何人都能發(fā)送交易且能獲得有效確認(rèn)的共識(shí)區(qū)塊鏈。公鏈通常被認(rèn)為是完全去中心化的,鏈上數(shù)據(jù)都是公開透明的,不可更改,任何人都可以通過交易或挖礦讀取和寫入數(shù)據(jù)。一般會(huì)通過代幣機(jī)制(Token)來鼓勵(lì)參與者競(jìng)爭(zhēng)記賬,來確保數(shù)據(jù)的安全性。
由于要檢測(cè)所有的公鏈的工作量非常大,只靠一家公司不可能監(jiān)測(cè)整個(gè)區(qū)塊鏈生態(tài)安全問題,這就導(dǎo)致了黑客極有可能在眾多公鏈之中找尋到漏洞進(jìn)行攻擊。2017 年 4 月 1 日,Stellar 出現(xiàn)通脹漏洞,一名攻擊者利用此漏洞制造了 22.5 億的 Stellar 加密貨幣 XLM,當(dāng)時(shí)價(jià)值約 1000 萬美元。
交易所 Exchange
與買賣股票的證券交易所類似,區(qū)塊鏈交易所即數(shù)字貨幣買賣交易的平臺(tái)。數(shù)字貨幣交易所又分為中心化交易所和去中心化交易所。
**去中心化交易所:**交易行為直接發(fā)生在區(qū)塊鏈上,數(shù)字貨幣會(huì)直接發(fā)回使用者的錢包,或是保存在區(qū)塊鏈上的智能合約。這樣直接在鏈上交易的好處在于交易所不會(huì)持有用戶大量的數(shù)字貨幣,所有的數(shù)字貨幣會(huì)儲(chǔ)存在用戶的錢包或平臺(tái)的智能合約上。去中心化交易通過技術(shù)手段在信任層面去中心化,也可以說是無需信任,每筆交易都通過區(qū)塊鏈進(jìn)行公開透明,不負(fù)責(zé)保管用戶的資產(chǎn)和私鑰等信息,用戶資金的所有權(quán)完全在自己手上,具有非常好的個(gè)人數(shù)據(jù)安全和隱私性。目前市面上的去中心化交易所有 WhaleEx、Bancor、dYdX 等
**中心化交易所:**目前熱門的交易所大多都是采用中心化技術(shù)的交易所,使用者通常是到平臺(tái)上注冊(cè),并經(jīng)過一連串的身份認(rèn)證程序(KYC)后,就可以開始在上面交易數(shù)字貨幣。用戶在使用中心化交易所時(shí),其貨幣交換不見得會(huì)發(fā)生在區(qū)塊鏈上,取而代之的可能僅是修改交易所數(shù)據(jù)庫(kù)內(nèi)的資產(chǎn)數(shù)字,用戶看到的只是賬面上數(shù)字的變化,交易所只要在用戶提款時(shí)準(zhǔn)備充足的數(shù)字貨幣可供匯出即可。當(dāng)前的主流交易大部分是在中心化交易所內(nèi)完成的,目前市面上的中心化交易所有幣安,火幣,OKEx 等。
由于交易所作為連接區(qū)塊鏈?zhǔn)澜绾同F(xiàn)實(shí)世界的樞紐,儲(chǔ)存了大量數(shù)字貨幣,它非常容易成為黑客們覬覦的目標(biāo),截止目前全球數(shù)字貨幣交易所因安全問題而遭受損失金額已超過 29 億美元(數(shù)據(jù)來源 SlowMist Hacked)。
數(shù)字貨幣領(lǐng)域,攻擊者的屠戮步伐從未停止。激烈的攻防對(duì)抗之下,防守方處于絕對(duì)的弱勢(shì),其攻擊手法多種多樣,我們會(huì)在之后的文章中為大家進(jìn)行介紹。職業(yè)黑客往往會(huì)針對(duì)數(shù)字貨幣交易所開啟定向打擊,因此慢霧安全團(tuán)隊(duì)建議各方交易所加強(qiáng)安全建設(shè),做好風(fēng)控和內(nèi)控安全,做到:“早發(fā)現(xiàn),早預(yù)警,早止損。”
相關(guān)交易所防御建議可參考:
節(jié)點(diǎn) Node
在傳統(tǒng)互聯(lián)網(wǎng)領(lǐng)域,企業(yè)所有的數(shù)據(jù)運(yùn)行都集中在一個(gè)中心化的服務(wù)器中,那么這個(gè)服務(wù)器就是一個(gè)節(jié)點(diǎn)。由于區(qū)塊鏈?zhǔn)侨ブ行幕姆植际綌?shù)據(jù)庫(kù),是由千千萬萬個(gè)“小服務(wù)器”組成。區(qū)塊鏈網(wǎng)絡(luò)中的每一個(gè)節(jié)點(diǎn),就相當(dāng)于存儲(chǔ)所有區(qū)塊數(shù)據(jù)的每一臺(tái)電腦或者服務(wù)器。所有新區(qū)塊的生產(chǎn),以及交易的驗(yàn)證與記帳,并將其廣播給全網(wǎng)同步,都由節(jié)點(diǎn)來完成。節(jié)點(diǎn)分為“全節(jié)點(diǎn)”和“輕節(jié)點(diǎn)”,全節(jié)點(diǎn)就是擁有全網(wǎng)所有的交易數(shù)據(jù)的節(jié)點(diǎn),那么輕節(jié)點(diǎn)就是只擁有和自己相關(guān)的交易數(shù)據(jù)節(jié)點(diǎn)。由于每一個(gè)全節(jié)點(diǎn)都保留著全網(wǎng)數(shù)據(jù),這意味著,其中一個(gè)節(jié)點(diǎn)出現(xiàn)問題,整個(gè)區(qū)塊鏈網(wǎng)絡(luò)世界也依舊能夠安全運(yùn)行,這也是去中心化的魅力所在。
RPC
遠(yuǎn)程過程調(diào)用(Remote Procedure Call,縮寫為 RPC)是一個(gè)計(jì)算機(jī)通信協(xié)議。以太坊 RPC 接口是以太坊節(jié)點(diǎn)與其他系統(tǒng)交互的窗口,以太坊提供了各種 RPC 調(diào)用:HTTP、IPC、WebSocket 等等。在以太坊源碼中,server.go 是核心邏輯,負(fù)責(zé) API 服務(wù)的注入,以及請(qǐng)求處理、返回。http.go 實(shí)現(xiàn) HTTP 的調(diào)用,websocket.go 實(shí)現(xiàn) WebSocket 的調(diào)用,ipc.go 實(shí)現(xiàn) IPC 的調(diào)用。以太坊節(jié)點(diǎn)默認(rèn)在 8545 端口提供了 JSON RPC 接口,數(shù)據(jù)傳輸采用 JSON 格式,可以執(zhí)行 Web3 庫(kù)的各種命令,可以向前端(例如 imToken、Mist 等錢包客戶端)提供區(qū)塊鏈上的信息。
以太坊黑色情人節(jié)漏洞 ETH Black Valentine’s Day
2018 年 3 月 20 日,慢霧安全團(tuán)隊(duì)觀測(cè)到一起自動(dòng)化盜幣的攻擊行為,攻擊者利用以太坊節(jié)點(diǎn) Geth/Parity RPC API 鑒權(quán)缺陷,惡意調(diào)用 eth_sendTransaction 盜取代幣,持續(xù)時(shí)間長(zhǎng)達(dá)兩年,單被盜的且還未轉(zhuǎn)出的以太幣價(jià)值就高達(dá)現(xiàn)價(jià) 2 千萬美金(以當(dāng)時(shí) ETH 市值計(jì)算),還有代幣種類 164 種,總價(jià)值難以估計(jì)(很多代幣還未上交易所正式發(fā)行)。
通過慢霧安全團(tuán)隊(duì)獨(dú)有的墨子(MOOZ)系統(tǒng)對(duì)全球約 42 億 IPv4 空間進(jìn)行掃描探測(cè),發(fā)現(xiàn)暴露在公網(wǎng)且開啟 RPC API 的以太坊節(jié)點(diǎn)有 1 萬多個(gè)。這些節(jié)點(diǎn)都存在被直接盜幣攻擊的高風(fēng)險(xiǎn)。這起利用以太坊 RPC 鑒權(quán)缺陷實(shí)施的自動(dòng)化盜幣攻擊,已經(jīng)在全球范圍內(nèi)對(duì)使用者造成了非常嚴(yán)重的經(jīng)濟(jì)損失。
共識(shí) Consensus
共識(shí)算法主要是解決分布式系統(tǒng)中,多個(gè)節(jié)點(diǎn)之間對(duì)某個(gè)狀態(tài)達(dá)成一致性結(jié)果的問題。分布式系統(tǒng)由多個(gè)服務(wù)節(jié)點(diǎn)共同完成對(duì)事務(wù)的處理,分布式系統(tǒng)中多個(gè)副本對(duì)外呈現(xiàn)的數(shù)據(jù)狀態(tài)需要保持一致性。由于節(jié)點(diǎn)的不可靠性和節(jié)點(diǎn)間通訊的不穩(wěn)定性,甚至節(jié)點(diǎn)作惡,偽造信息,使得節(jié)點(diǎn)之間出現(xiàn)數(shù)據(jù)狀態(tài)不一致性的問題。通過共識(shí)算法,可以將多個(gè)不可靠的單獨(dú)節(jié)點(diǎn)組建成一個(gè)可靠的分布式系統(tǒng),實(shí)現(xiàn)數(shù)據(jù)狀態(tài)的一致性,提高系統(tǒng)的可靠性。
區(qū)塊鏈系統(tǒng)本身作為一個(gè)超大規(guī)模的分布式系統(tǒng),但又與傳統(tǒng)的分布式系統(tǒng)存在明顯區(qū)別。由于它不依賴于任何一個(gè)中央權(quán)威,系統(tǒng)建立在去中心化的點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)基礎(chǔ)之上,因此分散的節(jié)點(diǎn)需要就交易的有效與否達(dá)成一致,這就是共識(shí)算法發(fā)揮作用的地方,即確保所有節(jié)點(diǎn)都遵守協(xié)議規(guī)則并保證所有交易都以可靠的方式進(jìn)行。由共識(shí)算法實(shí)現(xiàn)在分散的節(jié)點(diǎn)間對(duì)交易的處理順序達(dá)成一致,這是共識(shí)算法在區(qū)塊鏈系統(tǒng)中起到的最主要作用。
區(qū)塊鏈系統(tǒng)中的共識(shí)算法還承擔(dān)著區(qū)塊鏈系統(tǒng)中激勵(lì)模型和治理模型中的部分功能,為了解決在對(duì)等網(wǎng)絡(luò)中(P2P),相互獨(dú)立的節(jié)點(diǎn)如何達(dá)成一項(xiàng)決議問題的過程。簡(jiǎn)而言之,共識(shí)算法是在解決分布式系統(tǒng)中如何保持一致性的問題。
工作量證明 PoW(Proof of Work)
PoW(Proof of Work)是歷史上第一個(gè)成功的去中心化區(qū)塊鏈共識(shí)算法。工作量證明是大多數(shù)人所熟悉的,被比特幣、以太坊,萊特幣等主流公鏈廣泛使用。
工作量證明要求節(jié)點(diǎn)參與者執(zhí)行計(jì)算密集型的任務(wù),但是對(duì)于其他網(wǎng)絡(luò)參與者來說易于驗(yàn)證。在比特幣的例子中,礦工競(jìng)相向由整個(gè)網(wǎng)絡(luò)維護(hù)的區(qū)塊鏈賬本中添加所收集到的交易,即區(qū)塊。為了做到這一點(diǎn),礦工必須第一個(gè)準(zhǔn)確計(jì)算出“nonce”,這是一個(gè)添加在字符串末尾的數(shù)字,用來創(chuàng)建一個(gè)滿足開頭特定個(gè)數(shù)為零的哈希值。不過存在采礦的大量電力消耗和低交易吞吐量等缺點(diǎn)。
權(quán)益證明 PoS(Proof of Stake)
PoS(Proof of Stake)——權(quán)益證明機(jī)制,一種主流的區(qū)塊鏈共識(shí)算法,目的是為了讓區(qū)塊鏈里的分布式節(jié)點(diǎn)達(dá)成共識(shí),它往往和工作量證明機(jī)制(Proof of Work)一起出現(xiàn),兩種都被認(rèn)為是區(qū)塊鏈共識(shí)算法里面的主流算法之一。作為一種算法,它通過持幣人的同意來達(dá)成共識(shí),目的是確定出新區(qū)塊,這過程相對(duì)于 PoW,不需要硬件和電力,且效率更高。
PoS 共識(shí)中引入了 Stake 的概念,持幣人將代幣進(jìn)行 Staking,要求所有的參與者抵押一部分他們所擁有的 Token 來驗(yàn)證交易,然后獲得出塊的機(jī)會(huì),PoS 共識(shí)中會(huì)通過選舉算法,按照持幣量比例以及 Token 抵押時(shí)長(zhǎng),或者是一些其他的方式,選出打包區(qū)塊的礦工。礦工在指定高度完成打包交易,生成新區(qū)塊,并廣播區(qū)塊,廣播的區(qū)塊經(jīng)過 PoS 共識(shí)中另外一道"門檻",驗(yàn)證人驗(yàn)證交易,通過驗(yàn)證后,區(qū)塊得到確認(rèn)。這樣一輪 PoS 的共識(shí)過程就進(jìn)行完成了。權(quán)益證明通過長(zhǎng)期綁定驗(yàn)證者的利益和整個(gè)網(wǎng)絡(luò)的利益來阻止不良行為。鎖定代幣后,如果驗(yàn)證者存在欺詐性交易,那么他們所抵押的 Token 也會(huì)被削減。
PoS 的研究腳步還在不斷前進(jìn),安全、性能和去中心化一直都是 PoS 所追求的方向,未來也將有更多 PoS 的項(xiàng)目落地。為了更好的觀測(cè)公鏈運(yùn)行狀態(tài),即時(shí)監(jiān)測(cè)安全異常,慢霧在 EOS、BOSCORE、FIBOS、YOYOW、IoTeX、COSMOS 上都部署了 Safe Staking,落地扎根安全領(lǐng)域,關(guān)注節(jié)點(diǎn)的穩(wěn)定與安全。
委托權(quán)益證明 DPoS(Delegate Proof of Stake)
委托權(quán)益證明,其雛形誕生在 2013 年 12 月 8 日,Daniel Larimer 在 bitsharetalk 首次談及用投票選擇出塊人的方式,代替 PoS 中可能出現(xiàn)的選舉隨機(jī)數(shù)被操縱的問題。在 DPoS 中,讓每一個(gè)持幣者都可以進(jìn)行投票,由此產(chǎn)生一定數(shù)量的代表 ,或者理解為一定數(shù)量的節(jié)點(diǎn)或礦池,他們彼此之間的權(quán)利是完全相等的。持幣者可以隨時(shí)通過投票更換這些代表,以維系鏈上系統(tǒng)的“長(zhǎng)久純潔性”。在某種程度上,這很像是國(guó)家治理里面的代議制,或者說是人大代表制度。這種制度最大的好處就是解決了驗(yàn)證人過多導(dǎo)致的效率低下問題,當(dāng)然,這種制度也有很明顯的缺點(diǎn),由于 “代表”制度,導(dǎo)致其一直飽受中心化詬病。
惡意挖礦攻擊 Cryptojacking Attack
惡意挖礦攻擊(Cryptojacking)是一種惡意行為,指未經(jīng)授權(quán)的情況下劫持用戶設(shè)備挖掘加密貨幣。通常,攻擊者會(huì)劫持受害者設(shè)備(個(gè)人 PC 或服務(wù)器)的處理能力和帶寬,由于加密貨幣挖掘需要大量算力,攻擊者會(huì)嘗試同時(shí)感染多個(gè)設(shè)備,這樣他們能夠收集到足夠的算力來執(zhí)行這種低風(fēng)險(xiǎn)和低成本的挖礦活動(dòng)。
一般惡意挖礦軟件會(huì)誘導(dǎo)用戶在計(jì)算機(jī)上加載挖礦代碼,或通過使用類似網(wǎng)絡(luò)釣魚的方法,如惡意鏈接、電子郵件或是在網(wǎng)站里植入挖礦腳本等方式,使系統(tǒng)無意中被隱藏的加密挖礦程序感染進(jìn)而完成攻擊行為。近年來,隨著加密貨幣價(jià)格的上漲,更加復(fù)雜的惡意軟件被開發(fā)出來,使惡意挖礦攻擊事件層出不窮。
在此我們?yōu)榇蠹姨峁讞l建議防范惡意挖礦攻擊:
- 注意設(shè)備性能和 CPU 利用率
- 在 Web 瀏覽器上安裝挖礦腳本隔離插件,例如 MinerBlock,NoCoin 和 Adblocker
- 小心電子郵件附件和鏈接
- 安裝一個(gè)值得信賴的殺毒軟件,讓軟件應(yīng)用程序和操作系統(tǒng)保持最新狀態(tài)
無利益攻擊 Nothing at Stake Attack
無利益攻擊(Nothing at Stake Attack),是在 PoS 共識(shí)機(jī)制下一個(gè)有待解決的問題,其問題的本質(zhì)可以簡(jiǎn)單概括為“作惡無成本,好處無限多”。
當(dāng) PoS 共識(shí)系統(tǒng)出現(xiàn)分叉(Fork)時(shí),出塊節(jié)點(diǎn)可以在“不受任何損失”的前提下,同時(shí)在兩個(gè)分叉上出塊;無論哪一個(gè)分叉后面被公認(rèn)為主鏈,該節(jié)點(diǎn)都可以獲得“所有收益”且不會(huì)有任何成本損失。這就很容易給某些節(jié)點(diǎn)一種動(dòng)力去產(chǎn)生新的分叉,支持或發(fā)起不合法交易,其他逐利的出塊節(jié)點(diǎn)會(huì)同時(shí)在多條鏈(窗口)上排隊(duì)出塊支持新的分叉。隨著時(shí)間的推移,分叉越來越多,非法交易,作惡猖狂。區(qū)塊鏈將不再是唯一鏈,所有出塊節(jié)點(diǎn)沒有辦法達(dá)成共識(shí)。
為了預(yù)防這樣的情況發(fā)生,許多類 PoS 共識(shí)機(jī)制對(duì)此的解決方法是引入懲罰機(jī)制,對(duì)作惡的節(jié)點(diǎn)進(jìn)行經(jīng)濟(jì)懲罰(Slashing),以建立更加穩(wěn)定的網(wǎng)絡(luò)。DPoS 實(shí)際上也是無利益攻擊的解決方案之一,由上文我們可知 DPoS 這個(gè)機(jī)制由持幣人選出出塊節(jié)點(diǎn)來運(yùn)營(yíng)網(wǎng)絡(luò),出塊節(jié)點(diǎn)會(huì)將一部分獎(jiǎng)勵(lì)分給投票者。
多簽 Multi-sig
多簽(Multi-sig)指的是需要多個(gè)簽名才能執(zhí)行的操作(這些簽名是不同私鑰生成的)。這可用于提供更高的安全性,即使丟失單個(gè)私鑰的話也不會(huì)讓攻擊者取得帳戶的權(quán)限,多個(gè)值得信賴的各方必須同時(shí)批準(zhǔn)更新,否則無效。
我們都知道,一般來說一個(gè)比特幣地址對(duì)應(yīng)一個(gè)私鑰,動(dòng)用這個(gè)地址中的資金需要私鑰的持有者發(fā)起簽名才行。而多重簽名技術(shù),簡(jiǎn)單來說,就是動(dòng)用一筆資金時(shí)需要多個(gè)私鑰簽名才有效。多簽的一個(gè)優(yōu)勢(shì)就是可以多方對(duì)一筆付款一起達(dá)成共識(shí),才能支付成功。
雙花攻擊 Double Spend Attack
雙花攻擊(Double Spend Attack)即一筆錢花了兩次,雙重支付,利用貨幣的數(shù)字特性兩次或多次使用“同一筆錢”完成支付。雙花不會(huì)產(chǎn)生新的 Token,但能把自己花出去的錢重新拿回來。簡(jiǎn)單說就是,攻擊者將一筆 Token 轉(zhuǎn)到另外一個(gè)地址,通常是轉(zhuǎn)到交易所進(jìn)行套現(xiàn),然后再利用一些攻擊手法對(duì)轉(zhuǎn)賬交易進(jìn)行回滾。目前有常見的幾種手法能夠引發(fā)雙花攻擊:
1. Race Attack
這種攻擊主要通過控制礦工費(fèi)來實(shí)現(xiàn)雙花。攻擊者同時(shí)向網(wǎng)絡(luò)中發(fā)送兩筆交易,一筆交易發(fā)給自己(為了提高攻擊成功的概率,他給這筆交易增加了足夠的礦工費(fèi)),一筆交易發(fā)給商家。由于發(fā)送給自己的交易中含有較高的手續(xù)費(fèi),會(huì)被礦工優(yōu)先打包進(jìn)區(qū)塊的概率比較高。這時(shí)候這筆交易就會(huì)先于發(fā)給商家的那筆交易,那么發(fā)給商家的交易就會(huì)被回滾。對(duì)于攻擊者來說,通過控制礦工費(fèi),就實(shí)現(xiàn)了同一筆 Token 的“雙花”。
2. Finney Attack
攻擊者主要通過控制區(qū)塊的廣播時(shí)間來實(shí)現(xiàn)雙花,攻擊對(duì)象針對(duì)的是接受 0 確認(rèn)的商家。假設(shè)攻擊者挖到區(qū)塊,該區(qū)塊中包含著一個(gè)交易,即 A 向 B 轉(zhuǎn)了一定數(shù)量的 Token,其中 A 和 B 都是攻擊者的地址。但是攻擊者并不廣播這個(gè)區(qū)塊,而是立即找到一個(gè)愿意接受 0 確認(rèn)交易的商家向他購(gòu)買一個(gè)物品,向商家發(fā)一筆交易,用 A 向商家的地址 C 支付,發(fā)給商家的交易廣播出去后,攻擊者再把自己之前挖到的區(qū)塊廣播出去,由于發(fā)給自己的交易先于發(fā)給商家的交易,對(duì)于攻擊者來說,通過控制區(qū)塊的廣播時(shí)間,就實(shí)現(xiàn)了同一筆 Token 的“雙花”。
3. Vector76 attack
Vector76 Attack 又稱“一次確認(rèn)攻擊”,也就是交易確認(rèn)一次后仍然可以回滾,是 Finney Attack 和 Race Attack 的組合。
攻擊者創(chuàng)建兩個(gè)節(jié)點(diǎn),節(jié)點(diǎn) A 連接到商家節(jié)點(diǎn),節(jié)點(diǎn) B 連接到區(qū)塊鏈網(wǎng)絡(luò)中的其他節(jié)點(diǎn)。接著,攻擊者用同一筆 Token 發(fā)起兩筆交易,一筆交易發(fā)送給商家地址,我們稱為交易 1;一筆交易發(fā)送給自己的錢包地址,我們稱為交易 2。與上面說的 Race Attack 一樣,攻擊者對(duì)交易 2 添加了較高的礦工費(fèi)從而提高了礦工的打包概率,此時(shí),攻擊者并沒有把這兩筆交易廣播到網(wǎng)絡(luò)中去。
接著,攻擊者開始在交易 1 所在的分支上進(jìn)行挖礦,這條分支我們命名為分支 1。攻擊者挖到區(qū)塊后,并沒有廣播出去,而是同時(shí)做了兩件事:在節(jié)點(diǎn) A 上發(fā)送交易 1,在節(jié)點(diǎn) B 上發(fā)送交易 2。
由于節(jié)點(diǎn) A 只連接了商家節(jié)點(diǎn),所以當(dāng)商家節(jié)點(diǎn)想把交易 1 傳給其它對(duì)等節(jié)點(diǎn)時(shí),連接了更多節(jié)點(diǎn)的節(jié)點(diǎn) B,已經(jīng)把交易 2 廣播給了網(wǎng)絡(luò)中的大部分節(jié)點(diǎn)。于是,從概率上來講,交易 2 就更有可能被網(wǎng)絡(luò)認(rèn)定為是有效的,交易 1 被認(rèn)定為無效。
交易 2 被認(rèn)為有效后,攻擊者立即把自己之前在分支 1 上挖到的區(qū)塊,廣播到網(wǎng)絡(luò)中。這時(shí)候,這個(gè)接受一次確認(rèn)就支付的商家,會(huì)確認(rèn)交易成功,然后攻擊者就可以立即變現(xiàn)并轉(zhuǎn)移資產(chǎn)。
同時(shí),由于分支 2 連接的更多節(jié)點(diǎn),所以礦工在這個(gè)分支上挖出了另一個(gè)區(qū)塊,也就是分支 2 的鏈長(zhǎng)大于分支 1 的鏈長(zhǎng)。于是,分支 1 上的交易就會(huì)回滾,商家之前支付給攻擊者的交易信息就會(huì)被清除,但是攻擊者早已經(jīng)取款,實(shí)現(xiàn)了雙花。
4. 51% attack
攻擊者占有超過全網(wǎng) 50% 的算力,在攻擊者控制算力的這段時(shí)間,他可以創(chuàng)造一條高度大于原來鏈的新鏈。那么舊鏈中的交易會(huì)被回滾,攻擊者可以使用同一筆 Token 發(fā)送一筆新的交易到新鏈上。
目前已知公鏈安全事件的攻擊手法多為 51% 攻擊,截止發(fā)稿日由于攻擊者掌握大量算力發(fā)起 51% 攻擊所造成的損失共 19,820,000 美金。2019 年 1 月 6 日,慢霧區(qū)預(yù)警了 ETC 網(wǎng)絡(luò)的 51% 算力攻擊的可能性,據(jù) Coinbase 博客報(bào)道該攻擊者總共發(fā)起了 15 次攻擊,其中 12 次包含雙花,共計(jì)被盜 219,500 ETC(按當(dāng)時(shí)市價(jià)約為 110 萬美元),攻擊者經(jīng)過精心準(zhǔn)備,通過租借大量算力向 ETC 發(fā)動(dòng)了 51% 攻擊,累計(jì)收益超 10 倍,Gate.io、Yobit、Bitrue 等交易所均受到影響。所幸在整個(gè) ETC 生態(tài)社區(qū)的努力下,一周后攻擊者歸還了攻擊所得收益,幸而沒有造成進(jìn)一步的損失。
軟分叉 Soft-fork
軟分叉(Soft-fork)更多情況下是一種協(xié)議升級(jí),當(dāng)新共識(shí)規(guī)則發(fā)布后,沒有升級(jí)的舊節(jié)點(diǎn)并不會(huì)意識(shí)到代碼已經(jīng)發(fā)生改變,而繼續(xù)生產(chǎn)不合法的區(qū)塊,就會(huì)產(chǎn)生臨時(shí)性分叉,但新節(jié)點(diǎn)可以兼容舊節(jié)點(diǎn),即新舊節(jié)點(diǎn)始終在同一條鏈上工作。
硬分叉 Hard-fork
硬分叉(Hard-fork)是區(qū)塊鏈發(fā)生永久性分歧,在新共識(shí)規(guī)則發(fā)布后,已經(jīng)升級(jí)的節(jié)點(diǎn)無法驗(yàn)證未升級(jí)節(jié)點(diǎn)產(chǎn)生的區(qū)塊,未升級(jí)節(jié)點(diǎn)也無法驗(yàn)證已經(jīng)升級(jí)的節(jié)點(diǎn)產(chǎn)生的區(qū)塊,即新舊節(jié)點(diǎn)互不兼容,通常硬分叉就會(huì)發(fā)生,原有正常的一條鏈被分成了兩條鏈(已升級(jí)的一條鏈和未升級(jí)的一條鏈,且這兩條鏈互不兼容)。
歷史上比較著名的硬分叉事件是 The DAO 事件,作為以太坊上的一個(gè)著名項(xiàng)目,由于智能合約的漏洞造成資金被黑客轉(zhuǎn)移,黑客盜取了當(dāng)時(shí)價(jià)值約 6000 萬美元的 ETH,讓這個(gè)項(xiàng)目蒙受了巨大的損失。為了彌補(bǔ)這個(gè)損失,2016 年 7 月,以太坊團(tuán)隊(duì)修改了以太坊合約代碼實(shí)行硬分叉,在第 1920000 個(gè)區(qū)塊強(qiáng)行把 The DAO 及其子 DAO 的所有資金全部轉(zhuǎn)到一個(gè)特定的退款合約地址,進(jìn)而“奪回”了黑客所控制 DAO 合約上的幣。但這個(gè)修改被一部分礦工所拒絕,因而形成了兩條鏈,一條為原鏈(以太坊經(jīng)典,ETC),一條為新的分叉鏈(ETH),他們各自代表了不同社區(qū)的共識(shí)和價(jià)值觀。
異形攻擊 Alien Attack
異形攻擊(Alien Attack)實(shí)際上是一個(gè)所有公鏈都可能面臨的問題,又稱地址池污染,是指誘使同類鏈的節(jié)點(diǎn)互相侵入和污染的一種攻擊手法,漏洞的主要原因是同類鏈系統(tǒng)在通信協(xié)議上沒有對(duì)不同鏈的節(jié)點(diǎn)做識(shí)別。
這種攻擊在一些參考以太坊通信協(xié)議實(shí)現(xiàn)的公鏈上得到了復(fù)現(xiàn):以太坊同類鏈,由于使用了兼容的握手協(xié)議,無法區(qū)分節(jié)點(diǎn)是否屬于同個(gè)鏈,利用這一點(diǎn),攻擊者先對(duì)以太坊節(jié)點(diǎn)地址進(jìn)行收集并進(jìn)行惡意握手操作,通過跟節(jié)點(diǎn)握手達(dá)成污染地址池的目的,使得不同鏈的節(jié)點(diǎn)互相握手并把各自地址池里已知的節(jié)點(diǎn)推送給了對(duì)方,導(dǎo)致更多的節(jié)點(diǎn)互相污染,最終擴(kuò)散致整個(gè)網(wǎng)絡(luò)。遭受異形攻擊的節(jié)點(diǎn)通常會(huì)通信性能下降,最終造成節(jié)點(diǎn)阻塞、主網(wǎng)異常等現(xiàn)象。相關(guān)公鏈需要注意持續(xù)保持主網(wǎng)健康狀態(tài)監(jiān)測(cè),以免出現(xiàn)影響主網(wǎng)穩(wěn)定的攻擊事件出現(xiàn)。
釣魚攻擊 Phishing
所謂“釣魚攻擊(Phishing)”,指的是攻擊者偽裝成可以信任的人或機(jī)構(gòu),通過電子郵件、通訊軟件、社交媒體等方式,以獲取收件人的用戶名、密碼、私鑰等私密信息。隨著技術(shù)的發(fā)展,網(wǎng)絡(luò)釣魚攻擊不僅可以托管各種惡意軟件和勒索軟件攻擊,而且更糟糕的是這些攻擊正在呈現(xiàn)不斷上升的趨勢(shì)。
2018 年 2 月 19 日,烏克蘭的一個(gè)黑客組織,通過購(gòu)買谷歌搜索引擎中與加密貨幣相關(guān)的關(guān)鍵詞廣告,偽裝成合法網(wǎng)站的惡意網(wǎng)站鏈接,從知名加密貨幣錢包 Blockchain.info 中竊取了價(jià)值超過 5000 萬美元的數(shù)字加密貨幣。而除了上述這種域名釣魚攻擊(即使用與官網(wǎng)相似的網(wǎng)址)外,其他類型的釣魚攻擊包括郵件釣魚攻擊、Twitter 1 for 10(支付 0.5-10ETH 返利 5-100ETH)、假 App 和假工作人員等。2019 年 6 月份,就有攻擊者向多家交易所發(fā)送敲詐勒索信息,通過郵件釣魚攻擊獲取了超 40 萬美元的收益。
慢霧安全團(tuán)隊(duì)建議用戶保持警惕,通過即時(shí)通訊 App、短信或電子郵件獲取到的每條信息都需要謹(jǐn)慎對(duì)待,不要在通過點(diǎn)擊鏈接到達(dá)的網(wǎng)站上輸入憑據(jù)或私鑰,在交易時(shí)盡可能的使用硬件錢包和雙因素認(rèn)證(2FA),生態(tài)中的項(xiàng)目方在攻擊者沒有確切告知漏洞細(xì)節(jié)之前,不要給攻擊者轉(zhuǎn)賬,若項(xiàng)目方無法準(zhǔn)確判斷和獨(dú)自處理,可以聯(lián)系安全公司協(xié)助處理。
木馬攻擊 Trojan Horse Attack
木馬攻擊(Trojan Horse Attack)是指攻擊者通過隱藏在正常程序中的一段具有特殊功能的惡意代碼,如具備破壞和刪除文件、發(fā)送密碼、記錄鍵盤和 DDoS 攻擊等特殊功能的后門程序,將控制程序寄生于被控制的計(jì)算機(jī)系統(tǒng)中,里應(yīng)外合,對(duì)被感染木馬病毒的計(jì)算機(jī)實(shí)施操作。可用來竊取用戶個(gè)人信息,甚至是遠(yuǎn)程控制對(duì)方的計(jì)算機(jī)而加殼制作,然后通過各種手段傳播或者騙取目標(biāo)用戶執(zhí)行該程序,以達(dá)到盜取密碼等各種數(shù)據(jù)資料等目的。
在區(qū)塊鏈領(lǐng)域,諸如勒索木馬、惡意挖礦木馬一直是行業(yè)內(nèi)令人頭疼的安全頑疾,據(jù)幣世界報(bào)道,隨著比特幣的飆升,推動(dòng)整個(gè)數(shù)字加密貨幣價(jià)格回升,與幣市密切相關(guān)的挖礦木馬開始新一輪活躍,僅 2019 年上半年挖礦木馬日均新增 6 萬個(gè)樣本,通過分析發(fā)現(xiàn)某些新的挖礦木馬家族出現(xiàn)了快速、持續(xù)更新版本的現(xiàn)象,其功能設(shè)計(jì)越來越復(fù)雜,在隱藏手法、攻擊手法方面不斷創(chuàng)新,與殺軟廠商的技術(shù)對(duì)抗正在不斷增強(qiáng)。
供應(yīng)鏈攻擊 Supply Chain Attack
供應(yīng)鏈攻擊(Supply Chain Attack)是一種非常可怕的攻擊方式,防御上很難做到完美規(guī)避,由于現(xiàn)在的軟件工程,各種包/模塊的依賴十分頻繁、常見,而開發(fā)者們很難做到一一檢查,默認(rèn)都過于信任市面上流通的包管理器,這就導(dǎo)致了供應(yīng)鏈攻擊幾乎已經(jīng)成為必選攻擊之一。把這種攻擊稱成為供應(yīng)鏈攻擊,是為了形象說明這種攻擊是一種依賴關(guān)系,一個(gè)鏈條,任意環(huán)節(jié)被感染都會(huì)導(dǎo)致鏈條之后的所有環(huán)節(jié)出問題。
供應(yīng)鏈攻擊形式多樣,它可能出現(xiàn)在任何環(huán)節(jié)。2018 年 11 月,Bitpay 旗下 Copay 遭遇供應(yīng)鏈攻擊事件,攻擊者的攻擊行為隱匿了兩個(gè)月之久。攻擊者通過污染 EvenStream(NPM 包)并在后門中留下針對(duì) Copay 的相關(guān)變量數(shù)值,對(duì) Copay 發(fā)起定向攻擊從而竊取用戶的私鑰信息。而就在2019 年 6 月 4 日,NPM Inc 安全團(tuán)隊(duì)剛與 Komodo 聯(lián)手成功挫敗了一起典型的供應(yīng)鏈攻擊,保護(hù)了超過 1300 萬美元的數(shù)字加密貨幣資產(chǎn),攻擊者將惡意程序包放入 Agama 的構(gòu)建鏈中,通過這種手段來竊取錢包應(yīng)用程序中使用的錢包私鑰和其他登錄密碼。
智能合約 Smart Contract
智能合約(Smart Contract)并不是一個(gè)新的概念,早在 1995 年就由跨領(lǐng)域法律學(xué)者 Nick Szabo 提出:智能合約是一套以數(shù)字形式定義的承諾(Promises),包括合約參與方可以在上面執(zhí)行這些承諾的協(xié)議。在區(qū)塊鏈領(lǐng)域中,智能合約本質(zhì)可以說是一段運(yùn)行在區(qū)塊鏈網(wǎng)絡(luò)中的代碼,它以計(jì)算機(jī)指令的方式實(shí)現(xiàn)了傳統(tǒng)合約的自動(dòng)化處理,完成用戶所賦予的業(yè)務(wù)邏輯。
隨著區(qū)塊鏈智能合約數(shù)量的與日俱增,隨之暴露出來的安全問題也越來越多,攻擊者常能利用漏洞入侵系統(tǒng)對(duì)智能合約用戶造成巨大損失,據(jù) SlowMist Hacked 統(tǒng)計(jì),截止目前僅 ETH、EOS、TRON 三條鏈上因智能合約被攻擊而導(dǎo)致的損失就高達(dá) $126,883,725.92,具有相同攻擊特征的手法更是呈現(xiàn)出多次得手且跨公鏈的趨勢(shì),接下來我們將為大家介紹近年來一些常見的智能合約攻擊手法。
交易回滾攻擊 Roll Back Attack
交易回滾攻擊(Roll Back Attack),故名思義,指的是能對(duì)交易的狀態(tài)進(jìn)行回滾。回滾具體是什么意思呢?回滾具體指的是將已經(jīng)發(fā)生的狀態(tài)恢復(fù)成它未發(fā)生時(shí)候的樣子。那么,交易回滾的意思就是將已經(jīng)發(fā)生的交易變成未發(fā)生的狀態(tài)。即攻擊者本來已經(jīng)發(fā)生了支付動(dòng)作,但是通過某些手段,讓轉(zhuǎn)賬流程發(fā)生錯(cuò)誤,從而回滾整個(gè)交易流程,達(dá)到交易回滾的目的,這種攻擊手法多發(fā)于區(qū)塊鏈上的的智能合約游戲當(dāng)中,當(dāng)用戶的下注動(dòng)作和合約的開獎(jiǎng)動(dòng)作在一個(gè)交易內(nèi)的時(shí)候,即內(nèi)聯(lián)交易。攻擊者就可以通過交易發(fā)生時(shí)檢測(cè)智能合約的某些狀態(tài),獲知開獎(jiǎng)信息,根據(jù)開獎(jiǎng)信息選擇是否對(duì)下注交易進(jìn)行回滾。
該攻擊手法早期常用于 EOS DApp 上,后逐步向波場(chǎng)等其他公鏈蔓延,截止目前,已有 12 個(gè) DApp 遭遇攻擊,慢霧安全團(tuán)隊(duì)建議開發(fā)者們不要將用戶的下注與開獎(jiǎng)放在同一個(gè)交易內(nèi),防止攻擊者通過檢測(cè)智能合約中的開獎(jiǎng)狀態(tài)實(shí)現(xiàn)交易回滾攻擊。
交易排擠攻擊 Transaction Congestion Attack
交易排擠攻擊(Transaction Congestion Attack)是針對(duì) EOS 上的使用 defer 進(jìn)行開獎(jiǎng)的游戲合約的一種攻擊手法,攻擊者可以通過某些手段,在游戲合約的 defer 開獎(jiǎng)交易前發(fā)送大量的 defer 交易,惡意侵占區(qū)塊內(nèi)的 CPU 資源,使得智能合約內(nèi)本應(yīng)在指定區(qū)塊內(nèi)執(zhí)行的 defer 開獎(jiǎng)交易因資源不足無法執(zhí)行,只能去到下一個(gè)區(qū)塊才執(zhí)行。由于很多 EOS 上的游戲智能合約使用區(qū)塊信息作為智能合約本身的隨機(jī)數(shù),同一個(gè) defer 開獎(jiǎng)交易在不同區(qū)塊內(nèi)的執(zhí)行結(jié)果是不一樣的。通過這樣的方式,攻擊者在獲知無法中獎(jiǎng)的時(shí)候,就通過發(fā)送大量的 defer 交易,強(qiáng)行讓智能合約重新開獎(jiǎng),從而達(dá)到攻擊目的。
該攻擊手法最早在黑客 loveforlover 向 EOS.WIN 發(fā)起攻擊時(shí)被發(fā)現(xiàn),隨后相同的攻擊手法多次得手,據(jù) SlowMist Hacked 統(tǒng)計(jì)僅 2019 年就有 22 個(gè)競(jìng)猜類 DApp 因此損失了大量資金,慢霧安全團(tuán)隊(duì)建議智能合約開發(fā)者對(duì)在不同區(qū)塊內(nèi)執(zhí)行結(jié)果不同的關(guān)鍵的操作不要采用 defer 交易的方式,降低合約被攻擊的風(fēng)險(xiǎn)。
隨機(jī)數(shù)攻擊 Random Number Attack
隨機(jī)數(shù)攻擊(Random Number Attack),就是針對(duì)智能合約的隨機(jī)數(shù)生成算法進(jìn)行攻擊,預(yù)測(cè)智能合約的隨機(jī)數(shù)。目前區(qū)塊鏈上很多游戲都是采用的鏈上信息(如區(qū)塊時(shí)間,未來區(qū)塊哈希等)作為游戲合約的隨機(jī)數(shù)源,也稱隨機(jī)數(shù)種子。使用這種隨機(jī)數(shù)種子生成的隨機(jī)數(shù)被稱為偽隨機(jī)數(shù)。偽隨機(jī)數(shù)不是真的隨機(jī)數(shù),存在被預(yù)測(cè)的可能。當(dāng)使用可被預(yù)測(cè)的隨機(jī)數(shù)種子生成隨機(jī)數(shù)的時(shí)候,一旦隨機(jī)數(shù)生成的算法被攻擊者猜測(cè)到或通過逆向等其他方式拿到,攻擊者就可以根據(jù)隨機(jī)數(shù)的生成算法預(yù)測(cè)游戲即將出現(xiàn)的隨機(jī)數(shù),實(shí)現(xiàn)隨機(jī)數(shù)預(yù)測(cè),達(dá)到攻擊目的。2018 年 11 月 11 日,攻擊者向 EOS.WIN 發(fā)起連續(xù)隨機(jī)數(shù)攻擊,共獲利 20,000 枚 EOS,在此慢霧安全團(tuán)隊(duì)建議智能合約開發(fā)者使用安全隨機(jī)數(shù)源,如鏈下的隨機(jī)數(shù)種子方案,降低合約被攻擊的風(fēng)險(xiǎn)。
Hard_fail 狀態(tài)攻擊 hard_fail Attack
hard_fail 是什么呢?簡(jiǎn)單來說就是出現(xiàn)錯(cuò)誤但是沒有使用錯(cuò)誤處理器(error handler)處理錯(cuò)誤,比方說使用 onerror 捕獲處理,如果說沒有 onerror 捕獲,就會(huì) hard_fail。EOS 上的交易狀態(tài)記錄分為 executed, soft_fail, hard_fail, delayed 和 expired 這 5 種狀態(tài),通常在鏈上大部分人觀察到的交易,都是 executed 的,或者 delayed 的,而沒有失敗的交易,這就導(dǎo)致大部分開發(fā)者誤以為 EOS 鏈上沒有失敗的交易記錄,從而忽略了對(duì)交易狀態(tài)的檢查。攻擊者利用這個(gè)細(xì)節(jié),針對(duì)鏈上游戲或交易所進(jìn)行攻擊,構(gòu)造執(zhí)行狀態(tài)為 hard_fail 的交易,欺騙鏈上游戲或交易所進(jìn)行假充值攻擊,從而獲利。
該攻擊手法最早由慢霧安全團(tuán)隊(duì)于 2019 年 3 月 10 日一款 EOS DApp 上捕獲,帳號(hào)名為 fortherest12 的攻擊者通過 hard_fail 狀態(tài)攻擊手法攻擊了 EOS 游戲 Vegas town。隨后,相同攻擊手法頻頻發(fā)生,慢霧安全團(tuán)隊(duì)在此提醒交易所和 EOS DApp 游戲開發(fā)者在處理轉(zhuǎn)賬交易的時(shí)候需要嚴(yán)格校驗(yàn)交易狀態(tài),確保交易執(zhí)行狀態(tài)為 executed。
重放攻擊 Replay Attack
重放攻擊(Replay Attack),是針對(duì)區(qū)塊鏈上的交易信息進(jìn)行重放,一般來說,區(qū)塊鏈為了保證不可篡改和防止雙花攻擊的發(fā)生,會(huì)對(duì)交易進(jìn)行各種驗(yàn)證,包括交易的時(shí)間戳,nonce,交易 id 等,但是隨著各種去中心化交易所的興起,在智能合約中驗(yàn)證用戶交易的場(chǎng)景越來越多。這種場(chǎng)景一般是需要用戶對(duì)某一條消息進(jìn)行簽名后上傳給智能合約,然后在合約內(nèi)部進(jìn)行驗(yàn)簽。但由于用戶的簽名信息是會(huì)上鏈的,也就是說每個(gè)人都能拿到用戶的簽名信息,當(dāng)在合約中校驗(yàn)用戶簽名的時(shí)候,如果被簽名的消息不存在隨著交易次數(shù)變化的變量,如時(shí)間戳,nonce 等,攻擊者就可以拿著用戶的簽名,偽造用戶發(fā)起交易,從而獲利。
這是一種最早出現(xiàn)于 DApp 生態(tài)初期的攻擊形態(tài),由于開發(fā)者設(shè)計(jì)的開獎(jiǎng)隨機(jī)算法存在嚴(yán)重缺陷,使得攻擊者可利用合約漏洞重復(fù)開獎(jiǎng),屬于開發(fā)者較為容易忽略的錯(cuò)誤。因此,開發(fā)者們?cè)阪溕线M(jìn)行驗(yàn)簽操作的時(shí)候,需要對(duì)被簽名消息加上各種可變因子,防止攻擊者對(duì)鏈上簽名進(jìn)行重放,造成資產(chǎn)損失。
重入攻擊 Reentrancy Attack
重入攻擊(Reentrancy Attack)首次出現(xiàn)于以太坊,對(duì)應(yīng)的真實(shí)攻擊為 The DAO 攻擊,此次攻擊還導(dǎo)致了原來的以太坊分叉成以太經(jīng)典(ETC)和現(xiàn)在的以太坊(ETH)。由于項(xiàng)目方采用的轉(zhuǎn)賬模型為先給用戶發(fā)送轉(zhuǎn)賬然后才對(duì)用戶的余額狀態(tài)進(jìn)行修改,導(dǎo)致惡意用戶可以構(gòu)造惡意合約,在接受轉(zhuǎn)賬的同時(shí)再次調(diào)用項(xiàng)目方的轉(zhuǎn)賬函數(shù)。利用這樣的方法,導(dǎo)致用戶的余額狀態(tài)一直沒有被改變,卻能一直提取項(xiàng)目方資金,最終導(dǎo)致項(xiàng)目方資金被耗光。
慢霧安全團(tuán)隊(duì)在此提醒智能合約開發(fā)者在進(jìn)行智能合約開發(fā)時(shí),在處理轉(zhuǎn)賬等關(guān)鍵操作的時(shí)候,如果智能合約中存儲(chǔ)了用戶的資金狀態(tài),要先對(duì)資金狀態(tài)進(jìn)行修改,然后再進(jìn)行實(shí)際的資金轉(zhuǎn)賬,避免重入攻擊。
假充值攻擊 False Top-up
假充值攻擊(False Top-up),分為針對(duì)智能合約的假充值攻擊和對(duì)交易所的假充值攻擊。在假充值攻擊中,無論是智能合約還是交易所本身,都沒有收到真實(shí)的 Token,但是用戶又確實(shí)得到了真實(shí)的充值記錄,在這種情況下,用戶就可以在沒有真正充值的情況下從智能合約或交易所中用假資產(chǎn)或不存在的資產(chǎn)竊取真實(shí)資產(chǎn)。
1.
智能合約假充值攻擊
針對(duì)智能合約的假充值主要是假幣的假充值,這種攻擊手法多發(fā)于 EOS 和波場(chǎng)上,由于 EOS 上代幣都是采用合約的方式進(jìn)行發(fā)行的,EOS 鏈的系統(tǒng)代幣同樣也是使用這種方式發(fā)行,同時(shí),任何人也可以發(fā)行名為 EOS 的代幣。只是發(fā)行的合約帳號(hào)不一樣,系統(tǒng)代幣的發(fā)行合約為 “eosio.token”,而其他人發(fā)行的代幣來源于其他合約帳號(hào)。當(dāng)合約內(nèi)沒有校驗(yàn) EOS 代幣的來源合約的時(shí)候,攻擊者就能通過充值攻擊者自己發(fā)布的 EOS 代幣,對(duì)合約進(jìn)行假充值攻擊。而波場(chǎng)上的假充值攻擊主要是 TRC10 代幣的假充值攻擊,由于每一個(gè) TRC10 都有一個(gè)特定的 tokenid 進(jìn)行識(shí)別,當(dāng)合約內(nèi)沒有對(duì) tokenid 進(jìn)行校驗(yàn)的時(shí)候,任何人都可以以 1024 個(gè) TRX 發(fā)行一個(gè) TRC10 代幣對(duì)合約進(jìn)行假充值。
2. 交易所假充值攻擊
針對(duì)交易所的假充值攻擊分為假幣攻擊和交易狀態(tài)失敗的假充值攻擊。以 EOS 和以太坊為例。針對(duì) EOS 可以使用名為 EOS 的假幣的方式對(duì)交易所進(jìn)行假充值攻擊,如果交易所沒有嚴(yán)格校驗(yàn) EOS 的來源合約為 “eosio.token”,攻擊就會(huì)發(fā)生。同時(shí),區(qū)別于 EOS,由于以太坊上會(huì)保留交易失敗的記錄,針對(duì) ERC20 Token,如果交易所沒有校驗(yàn)交易的狀態(tài),就能通過失敗的交易對(duì)交易所進(jìn)行 ERC20 假充值。除此之外,hard_fail 狀態(tài)攻擊也是屬于假充值攻擊的一種。
慢霧安全團(tuán)隊(duì)在此建議交易所和智能合約開發(fā)者在處理轉(zhuǎn)賬的時(shí)候要充分校驗(yàn)交易的狀態(tài),如果是 EOS 或波場(chǎng)上的交易,在處理充值時(shí)還要同時(shí)校驗(yàn)來源合約是否是 “eosio.token” 或 tokenid 是否為指定的 tokenid。
短地址攻擊 Short Address Attack
短地址攻擊(Short Address Attack)是針對(duì)以太坊上 ERC20 智能合約的一種攻擊形式,利用的是 EVM 中的對(duì)于輸入字節(jié)碼的自動(dòng)補(bǔ)全機(jī)制進(jìn)行攻擊。
一般而言,針對(duì) ERC20 合約中的 transfer 函數(shù)的調(diào)用,輸入的字節(jié)碼位數(shù)都是 136 字節(jié)的。當(dāng)調(diào)用 ERC20 中的 transfer 函數(shù)進(jìn)行 ERC20 Token 轉(zhuǎn)賬時(shí),如果攻擊者提供的地址后有一個(gè)或多個(gè) 0,那么攻擊者就可以把地址后的零省去,提供一個(gè)缺位的地址。當(dāng)對(duì)這個(gè)地址轉(zhuǎn)賬的時(shí)候,比方說轉(zhuǎn)賬 100 的 A Token,然后輸入的地址是攻擊者提供的缺位地址,這時(shí)候,經(jīng)過編碼輸入的數(shù)據(jù)是 134 字節(jié),比正常的數(shù)據(jù)少了 2 字節(jié),在這種情況下,EVM 就會(huì)對(duì)缺失的字節(jié)位在編碼數(shù)據(jù)的末尾進(jìn)行補(bǔ) 0 湊成 136 字節(jié),這樣本來地址段缺失的 0 被數(shù)據(jù)段的 0 補(bǔ)齊了,而由于給地址段補(bǔ) 0,數(shù)據(jù)段會(huì)少 0,而數(shù)據(jù)段缺失的 0 由 EVM 自動(dòng)補(bǔ)齊,這就像數(shù)據(jù)段向地址段移動(dòng)補(bǔ)齊地址段缺失字節(jié)位,然后數(shù)據(jù)段缺失的字節(jié)位由 EVM 用 0 補(bǔ)齊。這種情況下,轉(zhuǎn)賬金額就會(huì)由 100 變成 100 * 16 的 n 次方,n 是地址缺失的 0 的個(gè)數(shù)。通過這種方式,攻擊者就能對(duì)交易所或錢包進(jìn)行攻擊,盜竊交易所和錢包的資產(chǎn)。
慢霧安全團(tuán)隊(duì)建議交易所和錢包在處理轉(zhuǎn)賬的時(shí)候,要對(duì)轉(zhuǎn)賬地址進(jìn)行嚴(yán)格的校驗(yàn),防止短地址攻擊的發(fā)生。詳情可參考:遺忘的亞特蘭蒂斯:以太坊短地址攻擊詳解
假幣攻擊 Fake Token Attack
假幣攻擊(Fake Token Attack),是針對(duì)那些在創(chuàng)建官方 Token 時(shí)采用通用創(chuàng)建模版創(chuàng)建出來的代幣,每個(gè) Token 的識(shí)別僅根據(jù)特定的標(biāo)記進(jìn)行識(shí)別,如 EOS 官方 Token 的識(shí)別標(biāo)記是 “eosio.token”合約,波場(chǎng)的 TRC10 的識(shí)別標(biāo)記是 tokenid,以太坊的 ERC20 是用合約地址作為識(shí)別標(biāo)記。那么這樣就會(huì)出現(xiàn)一個(gè)問題,如果收款方在對(duì)這些 Token 進(jìn)行收款的時(shí)候沒有嚴(yán)格校驗(yàn)這些 Token 特有的標(biāo)記,攻擊就會(huì)發(fā)生,以 EOS 為例子,由于 EOS 官方 Token 采用的是合約來發(fā)行一個(gè)名為 EOS 的 Token,標(biāo)記 EOS 本身的標(biāo)識(shí)是 “eosio.token” 這個(gè)發(fā)行帳號(hào),如果在接受轉(zhuǎn)賬的時(shí)候沒有校驗(yàn)這個(gè)標(biāo)識(shí),攻擊者就能用其他的帳號(hào)同樣發(fā)行一個(gè)名為 EOS 的 Token,對(duì)交易所或錢包進(jìn)行假幣充值,換取真的代幣。
2019 年 4 月 11 日,波場(chǎng) Dapp TronBank 1 小時(shí)內(nèi)被盜走約 1.7 億枚 BTT(價(jià)值約 85 萬元)。監(jiān)測(cè)顯示,黑客創(chuàng)建了名為 BTTx 的假幣向合約發(fā)起“ invest ”函數(shù),而合約并沒有判定發(fā)送者的代幣 id 是否與 BTT 真幣的 id 1002000 一致。因此黑客拿到真幣 BTT 的投資回報(bào)和推薦獎(jiǎng)勵(lì),以此方式迅速掏空資金池。對(duì)此,交易所和錢包在處理轉(zhuǎn)賬的時(shí)候,切記要嚴(yán)格檢驗(yàn)各種代幣各種標(biāo)識(shí),防止假幣攻擊。
整型溢出攻擊 Integer Overflow Attack
數(shù)據(jù)的存儲(chǔ)是區(qū)塊鏈上重要的一環(huán)。但是每個(gè)數(shù)據(jù)類型本身是存在邊界的,例如以太坊中 uint8 類型的變量就只能存儲(chǔ) 0~255 大小的數(shù)據(jù),超過了就存不下了。那么如果要放一個(gè)超過數(shù)據(jù)類型大小的數(shù)字會(huì)怎樣呢?例如把 256 存進(jìn) uint8 的數(shù)據(jù)類型中,數(shù)據(jù)顯示出來會(huì)變成 1,而不是其他數(shù)值,也不會(huì)報(bào)錯(cuò),因?yàn)?uint8 本身能存一個(gè) 8 位二進(jìn)制數(shù)字,最大值為 11111111,如果這個(gè)時(shí)候加 1,這個(gè)二進(jìn)制數(shù)就變成了 100000001,而因?yàn)閿?shù)據(jù)邊界的關(guān)系,只能拿到后 8 位,也就是 00000001,那么數(shù)字的大小就變成 1 了,這種情況我們稱為上溢。有上就有下,下溢的意思就是一個(gè)值為 0 的 uint8 數(shù)據(jù),如果這個(gè)時(shí)候?qū)λM(jìn)行減 1 操作,結(jié)果會(huì)變成該數(shù)據(jù)類型所能存儲(chǔ)的最大值加 1 減去被減數(shù),在這個(gè)例子中是 255,也就是該數(shù)據(jù)類型所能存儲(chǔ)的最大值。那么如果上述兩種情況發(fā)生在智能合約當(dāng)中的話,惡意用戶通過下溢的操作,操縱自己的帳號(hào)向其他帳號(hào)發(fā)送超過自己余額數(shù)量的代幣,如果合約內(nèi)沒有對(duì)余額進(jìn)行檢查,惡意用戶的余額就會(huì)下溢出變成一個(gè)超大的值,這個(gè)時(shí)候攻擊者如果大量拋售這些代幣,就能瞬間破壞整個(gè)代幣的價(jià)值系統(tǒng)。
慢霧安全團(tuán)隊(duì)建議所有的智能合約開發(fā)者在智能合約中對(duì)數(shù)據(jù)進(jìn)行操作的時(shí)候,要嚴(yán)格校驗(yàn)數(shù)據(jù)邊界,防止整形溢出攻擊的發(fā)生。詳情可參考:BEC 智能合約無限轉(zhuǎn)幣漏洞分析及預(yù)警。
條件競(jìng)爭(zhēng)攻擊 Race Condition
條件競(jìng)爭(zhēng)(Race Condition)攻擊的方式很多樣,但是核心的本質(zhì)無非是對(duì)某個(gè)條件的狀態(tài)修改的競(jìng)爭(zhēng),如上期介紹的重入漏洞,也是條件競(jìng)爭(zhēng)的一種,針對(duì)的是用戶余額這個(gè)條件進(jìn)行競(jìng)爭(zhēng),只要用戶的余額沒有歸零,用戶就能一直提走智能合約的錢。這次介紹的條件競(jìng)爭(zhēng)的例子是最近發(fā)生的著名的 Edgeware 鎖倉(cāng)合約的拒絕服務(wù)漏洞,詳情可參考:關(guān)于 Edgeware 鎖倉(cāng)合約的拒絕服務(wù)漏洞。這個(gè)漏洞問題的本質(zhì)在于對(duì)新建的鎖倉(cāng)合約的余額的這個(gè)條件進(jìn)行競(jìng)爭(zhēng)。攻擊者可以監(jiān)控所有鏈上的鎖倉(cāng)請(qǐng)求,提前計(jì)算出鎖倉(cāng)合約的地址,然后向合約地址轉(zhuǎn)賬,造成鎖倉(cāng)失敗。在官方?jīng)]有修復(fù)之前,要防止這種攻擊,只能使用比攻擊者更高的手續(xù)費(fèi)讓自己的鎖倉(cāng)交易先行打包,從而與攻擊者形成競(jìng)爭(zhēng)避免攻擊。最后,官方修復(fù)方案為不對(duì)鎖倉(cāng)合約的余額進(jìn)行強(qiáng)制性的相等檢查,而是采用大于等于的形式,避免了攻擊的發(fā)生。
慢霧安全團(tuán)隊(duì)建議智能合約的開發(fā)者在智能合約中對(duì)某些狀態(tài)進(jìn)行修改的時(shí)候,要根據(jù)實(shí)際情況充分考慮條件競(jìng)爭(zhēng)的風(fēng)險(xiǎn),防止遭受條件競(jìng)爭(zhēng)攻擊。
越權(quán)訪問攻擊 Exceed Authority Access Attack
和傳統(tǒng)安全的定義一樣,越權(quán)指的是訪問或執(zhí)行超出當(dāng)前賬戶權(quán)限的操作,如本來有些操作只能是合約管理員執(zhí)行的,但是由于限制做得不嚴(yán)謹(jǐn),導(dǎo)致關(guān)鍵操作也能被合約管理員以外的人執(zhí)行,導(dǎo)致不可預(yù)測(cè)的風(fēng)險(xiǎn),這種攻擊在以太坊和 EOS 上都曾出現(xiàn)過多次。
以 EOS 上著名的 BetDice 游戲?yàn)槔?#xff0c;由于在游戲合約內(nèi)的路由(EOS 內(nèi)可自定義的事件轉(zhuǎn)發(fā)器)中沒有對(duì)來源賬號(hào)進(jìn)行嚴(yán)格的校驗(yàn),導(dǎo)致普通用戶能通過 push action 的方式訪問到合約中的關(guān)鍵操作 transfer 函數(shù),直接繞過轉(zhuǎn)賬流程進(jìn)行下注,從而發(fā)生了越權(quán)攻擊,事后雖然 BetDice 官方緊急修復(fù)了代碼,并嚴(yán)格限制了來源賬號(hào),但這個(gè)漏洞已經(jīng)讓攻擊者幾乎無成本薅走 BetDice 獎(jiǎng)池內(nèi)將近 5 萬 EOS。又如在以太坊使用 solidity 版本為 0.4.x 進(jìn)行合約開發(fā)的時(shí)候,很多合約開發(fā)者在對(duì)關(guān)鍵函數(shù)編寫的時(shí)候不僅沒有加上權(quán)限校驗(yàn),也沒有指定函數(shù)可見性,在這種情況下,函數(shù)的默認(rèn)可見性為 public,惡意用戶可以通過這些沒有進(jìn)行限制的關(guān)鍵函數(shù)對(duì)合約進(jìn)行攻擊。
慢霧安全團(tuán)隊(duì)建議智能合約開發(fā)者們?cè)谶M(jìn)行合約開發(fā)的時(shí)候要注意對(duì)關(guān)鍵函數(shù)進(jìn)行權(quán)限校驗(yàn),防止關(guān)鍵函數(shù)被非法調(diào)用造成合約被攻擊。
交易順序依賴攻擊 Transaction-Ordering Attack
在區(qū)塊鏈的世界當(dāng)中,一筆交易內(nèi)可能含有多個(gè)不同的交易,而這些交易執(zhí)行的順序會(huì)影響最終的交易的執(zhí)行結(jié)果,由于在挖礦機(jī)制的區(qū)塊鏈中,交易未被打包前都處于一種待打包的 pending 狀態(tài),如果能事先知道交易里面執(zhí)行了哪些其他交易,惡意用戶就能通過增加礦工費(fèi)的形式,發(fā)起一筆交易,讓交易中的其中一筆交易先行打包,擾亂交易順序,造成非預(yù)期內(nèi)的執(zhí)行結(jié)果,達(dá)成攻擊。以以太坊為例,假如存在一個(gè) Token 交易平臺(tái),這個(gè)平臺(tái)上的手續(xù)費(fèi)是通過調(diào)控合約中的參數(shù)實(shí)現(xiàn)的,假如某天平臺(tái)項(xiàng)目方通過一筆交易請(qǐng)求調(diào)高交易手續(xù)費(fèi)用,這筆交易被打包后的所有買賣 Token 的交易手續(xù)費(fèi)都要提升,正確的邏輯應(yīng)該是從這筆交易開始往后所有的 Token 買賣交易的手續(xù)費(fèi)都要提升,但是由于交易從發(fā)出到被打包存在一定的延時(shí),請(qǐng)求修改交易手續(xù)費(fèi)的交易不是立即生效的,那么這時(shí)惡意用戶就可以以更高的手續(xù)費(fèi)讓自己的交易先行打包,避免支付更高的手續(xù)費(fèi)。
慢霧安全團(tuán)隊(duì)建議智能合約開發(fā)者在進(jìn)行合約開發(fā)的時(shí)候要注意交易順序?qū)灰捉Y(jié)果產(chǎn)生的影響,避免合約因交易順序的不同遭受攻擊。
女巫攻擊 Sybil Attack
傳聞中女巫是一個(gè)會(huì)魔法的人,一個(gè)人可以幻化出多個(gè)自己,令受害人以為有多人,但其實(shí)只有一個(gè)人。在區(qū)塊鏈?zhǔn)澜缰?#xff0c;女巫攻擊(Sybil Attack)是針對(duì)服務(wù)器節(jié)點(diǎn)的攻擊。攻擊發(fā)生時(shí)候,通過某種方式,某個(gè)惡意節(jié)點(diǎn)可以偽裝成多個(gè)節(jié)點(diǎn),對(duì)被攻擊節(jié)點(diǎn)發(fā)出鏈接請(qǐng)求,達(dá)到節(jié)點(diǎn)的最大鏈接請(qǐng)求,導(dǎo)致節(jié)點(diǎn)沒辦法接受其他節(jié)點(diǎn)的請(qǐng)求,造成節(jié)點(diǎn)拒絕服務(wù)攻擊。以 EOS 為例,慢霧安全團(tuán)隊(duì)曾披露過的 EOS P2P 節(jié)點(diǎn)拒絕服務(wù)攻擊實(shí)際上就是女巫攻擊的一種,攻擊者可以非常小的攻擊成本來達(dá)到癱瘓主節(jié)點(diǎn)的目的。詳情可參考:
https://github.com/slowmist/papers/blob/master/EOSIO-P2P-Sybil-Attack/zh.md
慢霧安全團(tuán)隊(duì)建議在搭建全節(jié)點(diǎn)的情況下,服務(wù)器需要在系統(tǒng)層面上對(duì)網(wǎng)絡(luò)連接情況進(jìn)行監(jiān)控,一旦發(fā)現(xiàn)某個(gè)IP連接異常就調(diào)用腳本配置 iptables 規(guī)則屏蔽異常的 IP,同時(shí)鏈開發(fā)者在進(jìn)行公鏈開發(fā)時(shí)應(yīng)該在 P2P 模塊中對(duì)單 IP 節(jié)點(diǎn)連接數(shù)量添加控制。
假錯(cuò)誤通知攻擊 Fake Onerror Notification Attack
EOS 上存在各種各樣的通知,只要在 action 中添加 require_recipient 命令,就能對(duì)指定的帳號(hào)通知該 action,在 EOS 上某些智能合約中,為了用戶體驗(yàn)或其他原因,一般會(huì)對(duì) onerror 通知進(jìn)行某些處理。如果這個(gè)時(shí)候沒有對(duì) onerror 通知的來源合約是否是 eosio 進(jìn)行檢驗(yàn)的話,就能使用和假轉(zhuǎn)賬通知同樣的手法對(duì)合約進(jìn)行攻擊,觸發(fā)合約中對(duì) onerror 的處理,從而導(dǎo)致被攻擊合約資產(chǎn)遭受損失。
慢霧安全團(tuán)隊(duì)建議智能合約開發(fā)者在進(jìn)行智能合約開發(fā)的時(shí)候需要對(duì) onerror 的來源合約進(jìn)行校驗(yàn),確保合約帳號(hào)為 eosio 帳號(hào),防止假錯(cuò)誤通知攻擊。
總結(jié)
以上是生活随笔為你收集整理的区块链相关安全名词及常见攻击手法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq2014 怎么将群 外人(电脑版qq
- 下一篇: Cooperative Percepti