比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads
首頁 > DOT > Info

RES:科普 | 深入理解「拒絕服務」漏洞

Author:

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

1.前言

拒絕服務(DoS):DoS是DenialofService的簡稱,即拒絕服務,任何對服務的干涉,使得其可用性降低或者失去可用性均稱為拒絕服務。簡單的理解就是,用戶所需要的正常服務請求無法被系統處理。例如一個計算機系統崩潰或其帶寬耗盡或其硬盤被填滿,導致其不能提供正常的服務,就構成拒絕服務。

拒絕服務攻擊:造成DoS的攻擊行為被稱為DoS攻擊,其目的是使計算機或網絡無法提供正常的服務。

在互聯網中,拒絕服務攻擊大致可以分為三類:利用軟件實現上的缺陷;利用協議上的漏洞;利用資源壓制。而在區塊鏈中,拒絕服務攻擊擾亂、中止、凍結正常合約的執行,甚至合約本身的邏輯無法正常運行。

2.漏洞概述

在Solidity里,拒絕服務漏洞可以簡單的理解為「不可恢復的惡意操作或者可控制的無限資源消耗」,也就是對以太坊合約進行DoS攻擊,這就可能導致Ether和Gas的大量消耗,更嚴重的是讓原本的合約代碼邏輯無法正常運行。

舉個例子,超市有三個收銀點,正常來說人們排隊在收銀點進行掃碼支付,但是有一天網絡出現了問題,所有收銀點的顧客掃碼支付都失敗了,而后面的人也不能進行支付買單,就導致了收銀點的堵塞,超市不能正常運營。又或者,在支付時有顧客故意鬧事,使得后面的顧客也不能去支付,這同樣也會導致超市不能運營。我們可以看到有來自內部的,還有來自外部的,都是可能會造成拒絕服務攻擊。

在智能合約中也是一樣的,攻擊者通過消耗合約的資源,讓用戶短暫地退出不可以操作的合約,嚴重時甚至能永久地退出,從而把以太幣鎖在被攻擊的合約中。

3.漏洞分析

智能合約中的拒絕服務攻擊一般有三種:

在外部操縱映射或數組循環。所有者操作。基于外部調用的進展狀態。3

穩定幣crvUSD科普創新清算機制LLAMMA,可在抵押品價格下跌時逐步替換為穩定幣:1月17日消息,Curve官方科普其穩定幣crvUSD創新的清算機制LLAMMA,解釋了LLAMMA通過AMM的特性進行針對債務人更友善的清算方式,讓抵押品在價格下跌時逐漸轉移成穩定幣,讓原本要清償的債務有一定程度的穩定幣可以償還,同時在價格回穩時再逐漸把穩定幣換回抵押品,而不是直接的觸發清算導致債務人的虧損。

此前報道,2022年11月23日,去中心化交易平臺CurveFinance開發者發布Curve即將推出的去中心化Stablecoin“crvUSD”的官方代碼和白皮書。[2023/1/17 11:17:13]

}

在上面的代碼片段中我們可以看到,distribute()函數中會去遍歷投資者數組,但是合約的循環遍歷數組是可以被外部的人進行人為擴充,如果有攻擊者要攻擊這個合約,那么他可以創建多個賬戶加入投資者的數組,讓investors的數據變得很大,大到讓循環遍歷數組所需的gas數量超過區塊gas數量的上限,此時distribute()函數將無法正常操作,這樣就會造成該合約的拒絕服務攻擊。

針對以上情況,合約不應該對可以被外部用戶人為操縱的映射或循環數組進行批量操作,這里更建議使用取回模式而不是發送模式,即每個投資者可以通過使用withdrawFunds()取回自己應得的代幣。如果合約必須需要通過遍歷一個變長數組來進行轉賬,那么最好是估計完成它們大概需要多少個區塊以及多少筆交易,從而限制數組長度,此外還必須能夠追蹤得到當前進行到哪以便當操作失敗時從那里開始進行恢復。如下面的代碼所示,必須確保在下一次執行payOut()之前另一些正在執行的交易不會發生任何錯誤。

structPayee?{addressaddr;uint256value;}Payeepayees;uint256nextPayeeIndex;functionpayOut(){uint256i=nextPayeeIndex;while?(i<payees

動態 | 新浪財經:官媒針對區塊鏈的報道從科普宣傳轉向打假監管:據新浪財經今日消息,“1025新政”滿月,一個月間,官媒對區塊鏈的態度風向已轉。據11月初的一項統計,七家黨媒在新政一周內發布了65篇直接相關報道,當時文章中的關鍵詞是數據、產業、安全、創新等,大量文章偏向于科普區塊鏈的概念以及應用介紹,提醒警惕虛擬貨幣炒作的僅有3篇。近期,官媒的批評焦點則紛紛指向借區塊鏈之名進行的虛擬貨幣發行和炒作行為。據統計,新華網、人民網收錄轉載的,以打擊虛擬貨幣或揭露假借區塊鏈行騙為主題的文章,自10月25日到11月25日午間,共28篇;其中,11月19日至11月25日的一周內就高達15篇。這些文章主要圍繞三個觀點展開:厘清區塊鏈和虛擬貨幣的關系,說明二者概念不等;打擊偽“區塊鏈”騙局,或是虛擬貨幣騙局揭露;提醒民眾,區塊鏈不能成為炒作的噱頭,更不是行騙的招牌,需警惕此類活動,理性投資。[2019/11/26]

3

//...額外的一些ICO功能//重寫transfer函數,先檢查isFinalizedfunctiontransfer(address_to,uint_value)returns(bool){?require(isFinalized);?super

contractPOC?{addressowner;AuctionauInstance;constructor()?public?{owner=msg.sender;?}modifieronlyOwner(){require(owner==msg.sender);_;?}functionsetInstance(addressaddr)?publiconlyOwner?{?//指向原合約地址auInstance=Auction(addr);?}functionattack()?publiconlyOwner?{auInstance.bid.value(msg.value)();?}??function()?externalpayable{revert();?}}

聲音 | 上海股交所總經理:區塊鏈想要大規模發展要做好社會科普工作:金色財經報道,上海股交所總經理張云峰表示,區塊鏈當前還處于一個“概念”的階段,距離成熟應用,影響到百姓的日常生活還有很長的路要走。對于“區塊鏈”和其會帶來的社會和經濟效果,沈陽應當持審慎的態度。區塊鏈想要大規模發展,一方面要做好這項復雜技術的社會科普工作,加快社會大眾對區塊鏈的了解。另一方面,要充分發揮市場的作用,讓企業用實實在在的技術創新,賦能實體經濟的發展。[2019/11/17]

攻擊者先通過攻擊合約調用bid()函數向競拍合約轉賬成為新的競拍者currentLeader,然后新的bid()函數被執行進行競標的時候,當執行到require(currentLeader.send(highestBid))退還以太幣操作時,會因為攻擊合約的fallback()回退函數執行revert()而無法接收以太幣,導致一直為false,其他競拍者競拍都會失敗,最后攻擊合約以較低的以太幣贏得競拍。

針對以上情況,如果需要對外部函數調用的結果進行處理后才能進入新的狀態,那么一定要考慮外部調用可能一直失敗的情況,也可以添加基于時間的操作,防止外部函數調用一直失敗無法滿足require判斷。

4.相關案例

4.1演示案例

接下來會對拒絕服務攻擊做出詳細的演示講解,以及會附上一個實例進行說明。

下面的合約代碼是根據漏洞分析中第三點基于外部調用的進展狀態講的合約改的,正常的操作邏輯是任何出價高于當前合約price的都能成為新的president,合約中存款也會通過transfer()函數轉賬以太幣退還給上一個president,這么看的話是沒有任何問題的,但是以太坊是有兩種賬戶類型,外部賬戶和合約賬戶,如果發起becomePresident()調用的是外部賬戶那就是正常的操作,但如果發起becomePresident()調用的是合約賬戶,并且在合約賬戶的fallback()函數中惡意的使用revert()等報錯的函數,那么其他用戶在發起becomePresident()時退還以太幣給合約賬戶時會觸發fallback()函數而導致報錯,無法再正常進行becomePresident()中的邏輯成為新的president了。

聲音 | ETC Labs主管:科普教育是未來幾年公鏈面臨的巨大挑戰:ETCLabs主管Darin Kotalik認為,科普教育是未來幾年公鏈面臨的巨大挑戰,人們必須要對區塊鏈有基本的認識,分清楚公鏈和私鏈的區別。[2019/8/25]

那么我們先來看下存在問題的合約代碼,這里我們將合約代碼設置為PresidentOfCountry.sol:

pragmasolidity^0.4.19;contractPresidentOfCountry?{addresspublicpresident;?//總統地址uint256price;?//出價functionPresidentOfCountry(uint256_price){?//構造函數,設置初始的價格require(_price>0);price=_price;?//設置初始的價格?}functionbecomePresident()?payable?{?//競爭總統require(msg.value>price);?//支付的以太幣必須大于當前總統的競爭費president.transfer(price);??//退還以太幣給上一任總統president=msg.sender;???//設置新的總統為競爭成功用戶price=price;??????//設置最新的競爭價格?}}

在編寫攻擊合約之前,我們先來介紹下智能合約的兩種賬戶類型以及fallback函數。

以太坊中有兩種賬戶類型:

外部賬戶,也就是用戶賬戶,由私鑰控制。合約賬戶,可執行代碼和私有狀態,由合約代碼控制。回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:

function()publicpayable{...}

金色財經獨家分析 監管機構、媒體、業界提示詐騙風險 區塊鏈科普道阻且長:新華社今日發文表示,近來“區塊鏈”類詐騙案件頻發,不法分子以“投資虛擬貨幣周期短、收益高、風險低”為借口,騙取用戶信任并誘使其轉賬進行投資。無獨有偶,同日消息,騰訊手機管家安全專家也提醒此類風險,并從技術上提出防騙建議。在美國,監管機構警示加密貨幣欺詐現象普遍承諾高收益而不披露潛在風險。金色財經獨家分析,不法分子假借新技術之名進行詐騙,一方面是抓住民眾趨利的心理,一方面反映出區塊鏈科普的欠缺。區塊鏈是新興科技和底層技術并有改變社會生產關系的潛力,應該進行系統性的科普教育,當前,部分大學已經開始設置了區塊鏈課程,但對于普通民眾仍然有科普的需求,人們應該了解到系統和正確的知識,不僅要了解區塊鏈的好,也要明確局限和弊端,以在高收益的誘惑下,保持清醒客觀。[2018/4/11]

回退函數在以下幾種情況中被執行:

調用合約時沒有匹配到任何一個函數;沒有傳數據;智能合約收到以太幣。下面就來編寫攻擊合約,主要有兩個重點,一個是外部調用becomePresident,二個就是在回退函數中使用revert。

pragmasolidity^0.4.19;import"./PresidentOfCountry.sol";contractAttack?{functionAttack(address_target)?payable?{?//構造函數,設置目標合約地址,用call進行外部調用becomePresident_target.call.value(msg.value)(bytes4(keccak256("becomePresident()")));?}function?()?payable?{?//回退函數,使用revert報錯revert();?}}

在Remix中進行調試查看結果,首先使用賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)設置初始競爭價格并部署漏洞合約代碼PresidentOfCountry.sol。

部署好后合約的地址為0xd9145CCE52D386f254917e481eB44e9943F39138,后面在部署攻擊合約時需要用到。

點擊president可以查看當前競爭者的地址。

使用賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)調用becomePresident并攜帶1eth,執行成功后再點擊president查看,發現新的總統地址已經變成了0X5B的賬戶。

此時有一個攻擊者(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)編寫了一個攻擊者合約Attack.sol,攜帶2eth并設置_target為PresidentOfCountry合約地址(0xd9145CCE52D386f254917e481eB44e9943F39138)進行部署。

部署好后的攻擊合約地址為0xa131AD247055FD2e2aA8b156A11bdEc81b9eAD95,此時再點擊president進行查看新總統的地址,發現已經是攻擊合約的地址了。

之后如果還有其他用戶想來競爭總統位置,就需要大于2eth的價格去調用becomePresident函數,這里有個用戶(0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c)想去競爭總統,攜帶3eth去調用becomePresident,結果發現報錯并回退,點擊president發現總統地址還是攻擊合約沒,此時不管是誰使用多少的以太幣去調用becomePresident,結果都是失敗,該合約已經不能進行正常的操作,這就說明合約受到了拒絕服務攻擊。

4.2真實案例

下列代碼是實際合約中存在拒絕服務攻擊的案例,只寫了關鍵的代碼并做了相關的改動。

可以看到合約的關鍵代碼是用作提款操作,但是在提款中有一個判斷要提款的金額和用戶在該合約中存款的數量是否相等,而并不是大于等于,那么就有可能發生當用戶要提出amount數量的代幣時,由于各種原因導致balances變動,甚至是用戶不想全部提款,從而使得判斷條件require(balances==amount);不成立,這時就會造成短暫的拒絕服務攻擊。

...functionwithdraw(uint256amount)public{//提款amount數量require(balances==amount);//檢查要提款的金額是否等于該用戶在合約中的存款?balances-=amount;//修改合約中存款的狀態變量?msg.sender.transfer(amount);//轉賬到用戶賬戶}

而修改的辦法就是將判斷條件require(balances==amount);修改為require(balances>=amount);就可以了。

4.3歷史案例

在歷史上,2016年2月6日至8日,在游戲KotET(KingogtheEtherThrone)的「TurbulentAge」期間,就遭受到了拒絕服務攻擊,導致部分角色的補償和未接收款項無法退回玩家的錢包中。

同年6月,GovernMental合約也遭受到了拒絕服務攻擊,當時1100個以太幣通過使用250萬個gas交易而獲得,這筆交易超出了合約能負荷的gas上限,從而導致交易暫停。

相關的還有Fomo3D等的拒絕服務攻擊。

5.解決辦法

通過上面的講解,我們可以發現拒絕服務攻擊在智能合約中的影響也是非常嚴重的,所以針對拒絕服務攻擊,合約開發者應該針對上面漏洞分析時講到的三種情況進行相應的代碼修改。

比如對于外部操作的映射或者數組循環,需要對長度進行限制等;而對于所有者操作需要考慮合約的非唯一性,不要使得合約因為某個權限賬戶而導致整個業務癱瘓;基于外部調用的進展狀態需要對函數的調用進行異常處理,一般來說內部函數的調用不會造成危害。

如果調用失敗也只是會進行回退,而外部調用具有不確定性,我們不知道外部調用者想干什么,如果被攻擊者攻擊,就可能會造成嚴重的后果,具體表現為惡意返回執行錯誤,造成正常代碼無法執行,從而造成拒絕服務攻擊,那么針對這種開發者就應該加入函數執行異常的處理機制。

總的來說,合約開發者需要考慮合約代碼的代碼邏輯全面性和縝密性等,這樣才能更好的杜絕拒絕服務攻擊。

6.參考文獻

拒絕服務攻擊_百度百科(baidu.com)以太坊智能合約安全入門了解一下(rickgray.me)《智能合約安全分析和審計指南》

Tags:RESENTDENTESIRESQ ChainblockidentitytokenIdentityOdesis

DOT
區塊鏈:產業區塊鏈月報| 9月共發布40條區塊鏈相關政策,落地應用新增26個

為更好地了解全球產業區塊鏈2021年9月份的發展狀況,前序觀察聯合可均集團、騰訊科技,從全球要聞、最新政策、國內產業動態、國際產業動態及產業應用落地等維度,“解密”區塊鏈產業的發展趨勢.

1900/1/1 0:00:00
ING:數據:Cosmos生態項目Terra市值是Cosmos的近3倍

巴比特訊,9月11日,據coingecko數據顯示,Terra流通市值165億美元,排名Crypto市值TOP11。Cosmos流通市值是81億美元,排名Crypto市值TOP24.

1900/1/1 0:00:00
FACE:知情人士:Facebook高管與美國政府高官會面,尋求批準其全球支付系統Diem

據華盛頓郵報消息,知情人士透露,最近幾周,Facebook高管一直在與拜登政府高級官員會面,試圖緩解監管對其支付項目Diem的擔憂.

1900/1/1 0:00:00
比特幣:推特宣布上線打賞功能 支持比特幣交易引發關注

來源:財聯社 作者:史正丞 當地時間周四,推特發布官方公告稱,即日起在iOS客戶端上線已經測試數月的打賞功能,除了常規支付工具外,這項功能也支持通過比特幣支付.

1900/1/1 0:00:00
AMA:分析丨Kusama及Kusama上的生態項目有怎樣的價值

背景 隨著最后一聲鐘聲響起,Kusama的第9個插槽拍賣已經結束,在經歷了起伏的一周后,Centrifuge的先行網Altair贏得了本輪倒數第二個插槽位置.

1900/1/1 0:00:00
加密貨幣:標準普爾:美國各州和各城市正積極研究加密貨幣

據彭博社消息,9月15日,標準普爾全球評級公司發布報告表示,美國各州和地方政府正積極研究加密貨幣,并越來越有興趣通過養老基金投資加密貨幣,以及接受數字貨幣作為稅收和服務的支付手段.

1900/1/1 0:00:00
ads