前言
通信技術(shù)讓世界具備了更多的連接,我們每個(gè)人都在這樣的連接中被影響和受益著。同時(shí)這種連接也產(chǎn)生了更多對(duì)于監(jiān)視需求的便利。許多人的隱私或自由可能會(huì)在不經(jīng)意間受到影響,而這也催生了對(duì)于隱私保護(hù)的需求。通常,由于中心化服務(wù)器的存在,我們很難實(shí)現(xiàn)完整的隱私保護(hù),而分布式的存儲(chǔ)等技術(shù),則讓其成為了可能。
無(wú)數(shù)的開(kāi)發(fā)者加入了 Web3 的開(kāi)發(fā)實(shí)現(xiàn)中,陸續(xù)構(gòu)建一個(gè)又一個(gè)偉大的 Dapp,他們?cè)谄胀ㄓ脩?hù)與區(qū)塊鏈底層技術(shù)中扮演著重要的中間人角色。與此同時(shí),對(duì)于普通人接觸的最多的 web-ui 與 IPFS, 它們之間的安全也值得被探索。
知道創(chuàng)宇區(qū)塊鏈安全實(shí)驗(yàn)室 將對(duì)此進(jìn)行詳細(xì)解讀。
Web-interface 與 IPFS
1. Web-interface 是什么
在 Web3.0 中,分布式的公鏈技術(shù)設(shè)施提供了各種接口供給使用者調(diào)用,但這些接口無(wú)法直接被普通用戶(hù)直接去使用。對(duì)用戶(hù)來(lái)說(shuō),Web-interface 是用戶(hù)和運(yùn)行在 Web 服務(wù)器上的軟件之間的橋梁。用戶(hù)使用瀏覽器連接 Web-interfacce 后進(jìn)行展示與交互,同時(shí)通過(guò)錢(qián)包進(jìn)行身份識(shí)別。對(duì)底層區(qū)塊鏈基礎(chǔ)設(shè)施來(lái)說(shuō),Web-interface 是公鏈/智能合約的一層封裝,將其包裝成為友好的頁(yè)面可直接可用的功能展示給用戶(hù)。其結(jié)構(gòu)功能類(lèi)似如下的圖片:
2. IPFS 是什么
星際文件系統(tǒng)(IPFS)是分布式存儲(chǔ)和共享文件的網(wǎng)絡(luò)傳輸協(xié)議,它將現(xiàn)有的成功系統(tǒng)分布式哈希表、版本控制系統(tǒng) Git、BitTorrent、自認(rèn)證文件系統(tǒng)與區(qū)塊鏈相結(jié)合。正是這些系統(tǒng)的綜合優(yōu)勢(shì),給 IPFS 帶來(lái)了以下顯著特性:
1.永久的、去中心化保存和共享文件
2.點(diǎn)對(duì)點(diǎn)超媒體:P2P 保存各種各樣類(lèi)型的數(shù)據(jù)
3.版本化:可追溯文件修改歷史
4.內(nèi)容可尋址:通過(guò)文件內(nèi)容生成獨(dú)立哈希值來(lái)標(biāo)識(shí)文件,而不是通過(guò)文件保存位置來(lái)標(biāo)識(shí)
當(dāng)用戶(hù)將文件添加到 IPFS 時(shí),該文件會(huì)被拆分為更小的塊,經(jīng)過(guò)加密哈希處理并賦予內(nèi)容標(biāo)識(shí)符 CID 作為唯一指紋;當(dāng)其他節(jié)點(diǎn)查找該文件時(shí),節(jié)點(diǎn)會(huì)詢(xún)問(wèn)對(duì)等節(jié)點(diǎn)誰(shuí)存儲(chǔ)了該文件 CID 引用的內(nèi)容,當(dāng)查看、下載這份文件時(shí),他們將緩存一份副本——同時(shí)成為該內(nèi)容的另一個(gè)提供者,直到他們的緩存被清除。
IPFS使用實(shí)例
網(wǎng)站 https://ipfs.io提供一個(gè)帶 UI 界面的客戶(hù)端,安裝運(yùn)行后會(huì)啟動(dòng) IPFS 的服務(wù),顯示當(dāng)前的節(jié)點(diǎn) ID、網(wǎng)關(guān)和 API 地址:
我們導(dǎo)入想上傳的文件,上傳文件成功后會(huì)生成該文件的 CID 信息,通過(guò)QmHash(CID)我們也能查找到指定的文件:
由于 IPFS 是分布式存儲(chǔ)和共享文件的網(wǎng)絡(luò)傳輸協(xié)議,因此上傳成功的文件被拷貝到其他節(jié)點(diǎn)上后,即使我們本地節(jié)點(diǎn)主動(dòng)刪除,依然可以在 IPFS 網(wǎng)絡(luò)查詢(xún)到該文件:
IPFS中的傳統(tǒng)安全問(wèn)題
根據(jù)使用實(shí)例,我們知道 IPFS 允許上傳任意類(lèi)型的文件,由于允許 Web 訪問(wèn)下載文件的特性,導(dǎo)致攻擊者可以像傳統(tǒng)安全一樣使用 HTML 或 SVG 文件實(shí)現(xiàn)釣魚(yú):
以 https://IPFS.io網(wǎng)關(guān)為例,上傳一個(gè) Metamask 釣魚(yú)網(wǎng)站,由于存儲(chǔ)在受信域名里,受害者訪問(wèn)該文件很可能攻擊成功:
但由于 IPFS 只能通過(guò) CID 查詢(xún)文件,使得釣魚(yú)攻擊的利用面很窄,沒(méi)辦法定向的實(shí)施攻擊。既然 CID 是發(fā)起定向攻擊的關(guān)鍵,那我們回頭研究下 CID。
IPLD 是構(gòu)建 IPFS 的數(shù)據(jù)層,它定義了默克爾鏈接(Merkle-Links)、默克爾有向無(wú)環(huán)圖(Merkle-DAG) 和默克爾路徑(Merkle-Paths)三種數(shù)據(jù)類(lèi)型,通過(guò) IPLD 發(fā)送到 IPFS 的數(shù)據(jù)保存在鏈上,使用者會(huì)收到一個(gè) CID 來(lái)訪問(wèn)該數(shù)據(jù)。
CID 是一個(gè)由 Version、Codec和Multihash 三部分組成的字符串,目前分成 V0和V1兩個(gè)版本。V0 版采用 Base58 編碼生成 CID,V1 版包含表明內(nèi)容的編號(hào)種類(lèi) Codec、哈希算法 MhType 和哈希長(zhǎng)度 MhLength 共同構(gòu)成:
`CID::=`
我們以 go-cid 生成一組 CID 測(cè)試:
可以看到在生成 CID 的過(guò)程中,無(wú)法實(shí)現(xiàn)結(jié)果的預(yù)測(cè)和更換,我們?cè)偻戏治錾蟼魑募牟糠帧⑽募蟼鞯絀PFS,通過(guò)塊的方式保存到本地 blockstore 的過(guò)程位于/go-ipfs-master/core/commands/add.go:
把上傳文件信息保存到 AddEvent 對(duì)象中,再通過(guò) /go-ipfs-master/core/coreunix/add.go 里的 addALLAndPin 和 fileAdder.AddFile 方法遍歷文件路徑,讀取文件內(nèi)容,將數(shù)據(jù)送入塊中:
最后再利用 addFile 函數(shù)完成文件的上傳:
分析代碼發(fā)現(xiàn),IPFS 在打包文件上傳返回 CID 的整個(gè)過(guò)程,都沒(méi)實(shí)現(xiàn)劫持的可能,而成功上傳的文件無(wú)法實(shí)現(xiàn)修改其內(nèi)容,同樣無(wú)法實(shí)現(xiàn)篡改:
后記
Web3 建立在區(qū)塊鏈技術(shù)之上,無(wú)需中央機(jī)構(gòu)即可維護(hù)。其允許用戶(hù)在互聯(lián)網(wǎng)上保護(hù)他們的數(shù)據(jù),并允許網(wǎng)絡(luò)平臺(tái)的去中心化。而 IPFS 技術(shù)對(duì)他來(lái)說(shuō)就如同一臺(tái)電腦的硬盤(pán),web-ui 就如同主機(jī)的顯示器一樣不可或缺,其間亦存在著復(fù)雜而多樣的安全風(fēng)險(xiǎn)可能給予不法分子可乘之機(jī),理解其風(fēng)險(xiǎn)并避免發(fā)生問(wèn)題是每一位 Web3 從業(yè)人員的責(zé)任與義務(wù)。
風(fēng)險(xiǎn)提示:本站所提供的資訊不代表任何投資暗示。投資有風(fēng)險(xiǎn),入市須謹(jǐn)慎。