比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > ICP > Info

IOST公鏈P2P遠程拒絕服務漏洞_PEER

Author:

Time:1900/1/1 0:00:00

漏洞分析

IOST公鏈使用Go語言開發,Go語言的make函數如果參數控制不當容易產生拒絕服務漏洞。在IOST的公鏈代碼中搜索make,找到了一處貌似可以利用的地方。

func(sy*SyncImpl)getBlockHashes(startint64,endint64)*msgpb.BlockHashResponse{resp:=&msgpb.BlockHashResponse{BlockInfos:make(*msgpb.BlockInfo,0,end-start1),}node:=sy.blockCache.Head()ifnode!=nil&&end>node.Head.Number{end=node.Head.Number}省略...

Line3make的第3個參數為end-start1,end和start來自handleHashQuery

func(sy*SyncImpl)handleHashQuery(rh*msgpb.BlockHashQuery,peerIDp2p.PeerID){ifrh.End<rh.Start||rh.Start<0{return}varresp*msgpb.BlockHashResponseswitchrh.ReqType{casemsgpb.RequireType_GETBLOCKHASHES:resp=sy.getBlockHashes(rh.Start,rh.End)casemsgpb.RequireType_GETBLOCKHASHESBYNUMBER:resp=sy.getBlockHashesByNums(rh.Nums。省略...

可以看到并沒有限制end-start1的大小,只要end足夠大,start足夠小就可以導致拒絕服務。所以現在問題就只剩下如何觸發這個漏洞。

漏洞利用

IOST節點之間的P2P通信使用的是libp2p,libp2p是一個模塊化的網絡堆棧,匯集了各種傳輸和點對點協議,使開發人員可以輕松構建大型,強大的p2p網絡。

來看一看IOST節點的P2Pservice啟動流程。

首先創建一個NetService,代碼如下:

CertiK:蘋果iOS內核存在的兩個安全漏洞會對iOS設備造成影響:金色財經報道,根據蘋果公司最新操作系統更新的發布說明,區塊鏈安全機構CertiK因與蘋果iOS內核的兩個安全漏洞有關的安全貢獻獲蘋果官方認可。經證實,這些漏洞會對最新的iOS設備造成影響。

據蘋果公司官方安全更新頁面信息顯示,這些漏洞會允許“一個應用程序以內核權限執行任意代碼”。在最新發布的版本中,蘋果已通過改進內存處理來解決這些漏洞。[2023/8/9 16:15:59]

//NewNetServicereturnsaNetServiceinstancewiththeconfigargument.funcNewNetService(config*common.P2PConfig)(*NetService,error){ns:=&NetService{config:config,}iferr:=os.MkdirAll(config.DataPath,0755);config.DataPath!=""&&err!=nil{ilog.Errorf("failedtocreatep2pdatapath,err=%v,path=%v",err,config.DataPath)returnnil,err}privKey,err:=getOrCreateKey(filepath.Join(config.DataPath,privKeyFile))iferr!=nil{ilog.Errorf("failedtogetprivatekey.err=%v,path=%v",err,config.DataPath)returnnil,err}host,err:=ns.startHost(privKey,config.ListenAddr)iferr!=nil{ilog.Errorf("failedtostartahost.err=%v,listenAddr=%v",err,config.ListenAddr)returnnil,err}ns.host=hostns.PeerManager=NewPeerManager(host,config)ns.adminServer=newAdminServer(config.AdminPort,ns.PeerManager)returnns,nil}

Web3游戲創作者Pixelcraft Studios籌集3000萬美元代幣融資:金色財經報道,元宇宙游戲Aavegotchi創作者Pixelcraft Studios周一表示,他們在多年的代幣銷售中籌集了3000萬美元。據稱,該輪融資是今年迄今為止Web3游戲領域最大的一輪融資,沒有任何風險資本或投資者參與。Pixelcraft Studios表示,他們將獲得25%的資金,即750萬美元,而協議的去中心化自治組織資金將獲得剩余的2250萬美元。

Pixelcraft Studios于2020年9月開始銷售其原生Aavegotchi代幣GHST。使用以太坊創始人Vitalik Buterin創建的去中心化融資機制,用戶將穩定幣DAI存入智能合約,以便在代幣銷售結束前獲得GHST。[2023/3/21 13:15:51]

主要看Line18的startHost,該函數調用libp2p庫創建了一個host

//startHoststartsalibp2phost.func(ns*NetService)startHost(pkcrypto.PrivKey,listenAddrstring)(host.Host,error){tcpAddr,err:=net.ResolveTCPAddr("tcp",listenAddr)iferr!=nil{returnnil,err}if!isPortAvailable(tcpAddr.Port){returnnil,ErrPortUnavailable}opts:=libp2p.Option{libp2p.Identity(pk),libp2p.NATPortMap(),libp2p.ListenAddrStrings(fmt.Sprintf("/ip4/%s/tcp/%d",tcpAddr.IP,tcpAddr.Port)),libp2p.Muxer(protocolID,mplex.DefaultTransport),}h,err:=libp2p.New(context.Background(),opts...)iferr!=nil{returnnil,err}h.SetStreamHandler(protocolID,ns.streamHandler)returnh,nil}

該host的流處理邏輯在ns.streamHandler中

IOSCO發布路線圖,將專注于加密貨幣與DeFi工作:金色財經報道,根據各國證券監管機構交換證券市場信息的論壇(IOSCO)上個月發布的路線圖,該項目將有兩個工作流:一個通常專注于加密和數字資產,另一個專注于 DeFi。加密工作將由英國金融行為監管局領導,并將專注于“推動公平透明的市場和有序培訓”以及“解決市場適宜性和操縱問題”等。美國證券交易委員會將領導DeFi工作流,其重點是在 DeFi 的常見活動、產品和服務中應用 IOSCO 原則和標準以及突出 DeFi、穩定幣和加密資產交易之間的聯系。

IOSCO總秘書處的一位發言人表示 :我們認為現在是時候改變方法了,加密行業在產品結構和產品、該行業的投資者及其全球影響力方面取得了重大進展。[2022/9/4 13:07:33]

func(ns*NetService)streamHandler(slibnet.Stream){ns.PeerManager.HandleStream(s,inbound。

steamHandler又調用PeerManager的HandleStream函數

//HandleStreamhandlestheincomingstream.////Itcheckswhethertheremotepeeralreadyexists.//Ifthepeerisnewandtheneighborcountdoesn'treachthethreshold,itaddsthepeerintotheneighborlist.//Ifpeeralreadyexits,justaddthestreamtothepeer.//Inothercases,resetthestream.func(pm*PeerManager)HandleStream(slibnet.Stream,directionconnDirection){remotePID:=s.Conn().RemotePeer()pm.freshPeer(remotePID)ifpm.isStreamBlack(s){ilog.Infof("remotepeerisinblacklist.pid=%v,addr=%v",remotePID.Pretty(),s.Conn().RemoteMultiaddr())s.Conn().Close()return}ilog.Debugf("handlenewstream.pid=%s,addr=%v,direction=%v",remotePID.Pretty(),s.Conn().RemoteMultiaddr(),direction)peer:=pm.GetNeighbor(remotePID)ifpeer!=nil{s.Reset()return}ifpm.NeighborCount(direction)>=pm.neighborCap{if!pm.isBP(remotePID){ilog.Infof("neighborcountexceeds,closeconnection.remoteID=%v,addr=%v",remotePID.Pretty(),s.Conn().RemoteMultiaddr())ifdirection==inbound{bytes,_:=pm.getRoutingResponse(string{remotePID.Pretty(。)iflen(bytes)>0{msg:=newP2PMessage(pm.config.ChainID,RoutingTableResponse,pm.config.Version,defaultReservedFlag,bytes)s.Write(msg.content()。time.AfterFunc(time.Second,func(){s.Conn().Close(。。else{s.Conn().Close(。return}pm.kickNormalNeighbors(direction。pm.AddNeighbor(NewPeer(s,pm,direction))return}

行情 | IOST幣熱度排名第三:根據TokenClub數據顯示,BTC在幣熱度榜上排名第一,24小時內訪問量為82390,相比昨日訪問量上升16645;排名第二為ETH ,24小時內訪問量為54154,相比昨日訪問量上升14868;排名第三為IOST,24小時內訪問量為39048; EOS今日排名降為第四,24小時內訪問量為36759,相對昨日訪問量增長557。總體而言,熱度靠前幣種訪問量均有上升。[2018/7/26]

對于新建立連接的peer,IOST會啟動該peer并添加到neighborlist中

//AddNeighborstartsapeerandaddsittotheneighborlist.func(pm*PeerManager)AddNeighbor(p*Peer){pm.neighborMutex.Lock()deferpm.neighborMutex.Unlock()ifpm.neighbors==nil{p.Start()pm.storePeerInfo(p.id,multiaddr.Multiaddr{p.addr})pm.neighbors=ppm.neighborCount}}

peer啟動之后,IOST會調用peer的readLoop和writeLoop函數對該peer進行讀寫。

//Startstartspeer'sloop.func(p*Peer)Start(){ilog.Infof("peerisstarted.id=%s",p.ID())gop.readLoop()gop.writeLoop(。

我們主要看readLoop,看IOST對我們發送的數據如何處理。

func(p*Peer)readLoop(){header:=make(byte,dataBegin)for{_,err:=io.ReadFull(p.stream,header)iferr!=nil{ilog.Warnf("readheaderfailed.err=%v",err)break}chainID:=binary.BigEndian.Uint32(header)ifchainID!=p.peerManager.config.ChainID{ilog.Warnf("mismatchedchainID.chainID=%d",chainID)break}length:=binary.BigEndian.Uint32(header)iflength>maxDataLength{ilog.Warnf("datalengthtoolarge:%d",length)break}data:=make(byte,dataBeginlength)_,err=io.ReadFull(p.stream,data)iferr!=nil{ilog.Warnf("readmessagefailed.err=%v",err)break}copy(data,header)msg,err:=parseP2PMessage(data)iferr!=nil{ilog.Errorf("parsep2pmessagefailed.err=%v",err)break}tagkv:=mapstring{"mtype":msg.messageType().String(。byteInCounter.Add(float64(len(msg.content())),tagkv)packetInCounter.Add(1,tagkv)p.handleMessage(msg。p.peerManager.RemoveNeighbor(p.id。

動態 | IOST官方表示合作交易所均無“假充值”風險:近日,針對網上爆出的有交易所和錢包出現了以太坊代幣“假充值”問題,IOST官方表示,經團隊迅速調查后發現IOST合作的交易所均采取了安全的轉賬驗證,不存“假充值”風險。[2018/7/11]

主要是讀取一個固定長度的header,然后根據header中的length來讀取data,通過header和data創建一個P2PMessage,最后調用handleMessage來處理這個msg。節點發送的數據包結構如下:

/*P2PMessageprotocol:0123(bytes)01234567012345670123456701234567--------------------------------|ChainID|--------------------------------------------------------------|MessageType|Version|--------------------------------------------------------------|DataLength|---------------------------------------------------------------|DataChecksum|---------------------------------------------------------------|Reserved|---------------------------------------------------------------||.Data.||---------------------------------------------------------------*/

handleMessage會根據messageType對message進行處理

//HandleMessagehandlesmessagesaccordingtoitstype.func(pm*PeerManager)HandleMessage(msg*p2pMessage,peerIDpeer.ID){data,err:=msg.data()iferr!=nil{ilog.Errorf("getmessagedatafailed.err=%v",err)return}switchmsg.messageType(){caseRoutingTableQuery:gopm.handleRoutingTableQuery(msg,peerID)caseRoutingTableResponse:gopm.handleRoutingTableResponse(msg)default:inMsg:=NewIncomingMessage(peerID,data,msg.messageType())ifm,exist:=pm.subs.Load(msg.messageType());exist{m.(*sync.Map).Range(func(k,vinterface{})bool{select{casev.(chanIncomingMessage)<-*inMsg:default:ilog.Warnf("sendingincomingmessagefailed.type=%s",msg.messageType()。returntrue}。}

了解了IOST節點之間P2P通信的處理邏輯,再來看看如何觸發存在漏洞的handleHashQuery函數。messageLoop中調用了handlerHashQuery

func(sy*SyncImpl)messageLoop(){defersy.wg.Done()for{select{casereq:=<-sy.messageChan:switchreq.Type(){casep2p.SyncBlockHashRequest:varrhmsgpb.BlockHashQueryerr:=proto.Unmarshal(req.Data(),&rh)iferr!=nil{ilog.Errorf("UnmarshalBlockHashQueryfailed:%v",err)break}gosy.handleHashQuery(&rh,req.From())省略...

可以看到當messageType為p2p.SyncBlockHashRequest,Data為BlockHashQuery時,handlerHashQuery函數會被調用。BlockHashQuery的結構如下,End和Start的值可控。

typeBlockHashQuerystruct{ReqTypeRequireType`protobuf:"varint,1,opt,name=reqType,proto3,enum=msgpb.RequireType"json:"reqType,omitempty"`Startint64`protobuf:"varint,2,opt,name=start,proto3"json:"start,omitempty"`Endint64`protobuf:"varint,3,opt,name=end,proto3"json:"end,omitempty"`Numsint64`protobuf:"varint,4,rep,packed,name=nums,proto3"json:"nums,omitempty"`XXX_NoUnkeyedLiteralstruct{}`json:"-"`XXX_unrecognizedbyte`json:"-"`XXX_sizecacheint32`json:"-"`}

因此,我們可以構造一個Message,將Start的值設為0,End的值設為math.MaxInt64,將該Message發送給節點,就可以觸發make函數的capoutofrange,導致拒絕服務。

POC見https://github.com/fatal0/poc/blob/master/go-iost/p2p_dos.go

漏洞修復

官方的修復方式也很簡單,限制end-start1的大小。

https://github.com/iost-official/go-iost/commit/9824cfce3bb4b14f43b60f470cbba86e879dd32a#diff-4e27320b328b8f0d452f10e1ed383d73R330

Tags:PEEREERREAESSusepeerethereumSEERProtoReality GamesSEAMLESS

ICP
用一枚比特幣環游世界? 他是不是瘋了..._比特幣

2017年,我只是一個厭倦了朝九晚五工作的辦公室文員。那時我狂看Netflix,有一天,我花了4700美元買了一枚比特幣,開始了為期一年、走遍20個國家的奇妙旅行.

1900/1/1 0:00:00
K網國際站關于暫停SUT充幣的公告_SKIN

尊敬的用戶: 由于系統維護,K網國際站已暫停SUT充幣服務,恢復時間請關注官方公告,給您帶來不便,敬請諒解.

1900/1/1 0:00:00
JEX上線周EOS期權0506公告_USD

EOS看漲期權 代碼周EOS看漲0506期權標的EOS合約類型歐式看漲期權計價單位USDT最小價格單位0.0001USDT合約比例1:4.

1900/1/1 0:00:00
火幣全球站于4月23日03:30上線 Cosmos (ATOM)

尊敬的用戶: 火幣全球站定于新加坡時間4月23日03:30開放Cosmos(ATOM)充值業務。4月23日11:30開放ATOM/USDT,ATOM/BTC,ATOM/ETH交易.

1900/1/1 0:00:00
如果吸引開發者的方式不對 公鏈做再多市場活動都沒用_STA

Electriccapital近期發布的開發者報告中,基于13萬開發者的數據,從Github代碼活躍度、GithubFork、智能合約交互情況、其他指標幾個維度評估了3000個區塊鏈項目的開發者.

1900/1/1 0:00:00
關于 MIN 暫停充、提幣的公告_MAKE

親愛的Bit-Z用戶: 因MIN疑似有盜幣事件發生,Bit-Z已暫停其充、提幣服務,待調查清楚、問題解決后會盡快開放,請留意官方公告。由此給您帶來不便,敬請諒解.

1900/1/1 0:00:00
ads