買比特幣 買比特幣
Ctrl+D 買比特幣
ads
首頁 > FTT > Info

DEFI:以Kadena智能合約為例,簡析如何規避重入攻擊和跨函數攻擊_IC DeFi

Author:

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

在這篇文章中,我們將簡要地解釋重入和跨函數重入之間的區別,以及圖靈不完備性如何能夠防止一些這樣的攻擊。

其中我們將提供一個跨函數重入利用的案例,該案例中Kadena區塊鏈使用的是編程語言Pact,但圖靈不完備性并未防止該惡意利用的發生。

事件簡介

Kadena區塊鏈旨在實現比其他L1鏈更高的可擴展性、安全性和可用性。其開發了一種新的語言用以編寫智能合約:Pact。

這種語言是人類可讀的,且易于形式化驗證,并具備可提高安全性的圖靈不完備性。

這里提到的圖靈不完備性意味著Pact無法做到圖靈完備編程語言所能做到的那些事——看起來好像是個劣勢,但其實智能合約編程,哪怕是最復雜的DeFi協議也很少會需要用到圖靈完備性。

Optimism Bedrock升級已啟動:6月7日消息,Optimism宣布已開始啟動主網Bedrock升級,Optimism Bedrock會在降低交易費用、縮短系統延遲、提高節點性能等方面進行升級。

此前報道,Optimism表示,升級將需要主網停機2 - 4小時,停機期間將無法進行交易、充值和提款。[2023/6/7 21:20:31]

圖靈不完備性最重要的一點是沒有無界遞歸。雖然這確實大大減少了攻擊面,但一些「經典」攻擊是無法被100%避免的,接下來我們就會講述跨函數重入的問題。

經典重入攻擊

重入攻擊是非常常見的安全問題。這個問題不僅很難被開發者發現,也很難被審計師審查出其會導致的所有潛在后果。

FIFA+ NFT市場上線:9月23日消息,由國際足聯推出的NFT市場FIFA+現已上線。該平臺基于Algorand鏈開發,平臺上的第一個NFT系列是“ FIFA+ Genesis Drop”,以NFT的形式發布了足球史上100個最偉大的時刻。官方消息稱,二級市場將在不久后推出。[2022/9/23 7:17:12]

重入攻擊取決于函數在進行外部調用之前和之后執行的特定任務的順序。

如果一個合約調用了一個不受信任的外部合約,攻擊者可以讓它一次又一次地重復這個函數調用,形成一個遞歸調用。而如果重新輸入的函數執行重要的任務,那這可能就會導致災難性的后果。

下方是一個簡化的例子。

我們把易受攻擊的合約稱為unsafe合約,把惡意的合約稱為Attack合約。

DeFi平臺Oasis禁止受制裁的地址訪問其App:8月12日消息,DeFi平臺Oasis表示,受制裁的地址將無法再訪問該應用程序。由于服務條款的更改,被標記為高風險的錢包被禁止使用Oasis.app管理頭寸或提取資金。相反,此類用戶必須直接與存儲資金的相關底層協議進行交互,或者找到其他服務。

Oasis app團隊成員Gabriel解釋稱:“我們最近需要更新Oasis App前端的服務條款,以符合相關法律和法規的規定。根據最新法規,Oasis App有一個更新的服務條款。任何受制裁的地址將不再能夠訪問Oasis app功能。”(Cointelegraph)[2022/8/12 12:20:18]

1.攻擊者調用unsafe合約,以將資金轉移到Attack合約中。

報告:DeFi市值在第二季度下跌但用戶活動卻表現更好:金色財經消息,CoinGecko最近發布了其2022年第二季度加密貨幣報告,二季度DeFi市值下跌75%,但該報告承認該行業保留了大部分用戶。在某些情況下,DeFi活動出現了大幅飆升。CoinGecko確定了其中兩個原因。

第一次是在5月初,在Terra崩塌期間。數以千計的DeFi用戶涌向Curve和Uniswap等去中心化(DEX)交易所出售其持有的LUNA和UST,因為一些中心化交易所(CEX)偶爾停止了這些資產的交易。結果,這些DEX的交易量猛增。

第二次是在6月,當時加密借貸平臺Celsius對其用戶實施了提款限制。交易者前往DeFi協議享受無許可交易,導致DeFi協議的日活躍用戶激增24%。(cryptopotato)[2022/7/17 2:18:13]

2.收到調用之后,unsafe合約首先檢查攻擊者是否有資金,然后將資金轉移到Attack合約。

3.收到資金后,Attack合約執行回退函數,在它能夠更新余額之前回調到不安全的合約,從而重新啟動該過程。

因為這種攻擊是通過無界遞歸調用進行的,所以如果語言不是圖靈完備的,攻擊就不可能進行。

跨函數重入

跨函數重入類似于經典的重入攻擊,除了重入的函數與進行外部調用的函數功能不同。這種重入攻擊通常更難被發現——因為在復雜的協議中,組合的可能性太多,無法手動測試每個可能的結果。

這就引出了我們的概念證明:使用Pact語言進行簡單的跨函數重入攻擊。

Pact模塊中的簡單跨函數重入

正如我們在下方代碼片段中看到的,合約中的函數對另一個實現特定接口的合約進行外部調用。這允許重入一個設計好的攻擊合約。Pact中的功能是內置函數,可授予用戶權限來執行敏感任務。以下代碼僅供說明之用,并非取自真實案例合約。

我們將使用的代碼例子包含三個部分:

1.合約接口

被攻擊的模擬示例合約

首先,數據庫被定義為一個表,其中字符串存儲在具有關聯十進制數的行中。

然后定義了一個能力:CREDIT。這個條件將是credit函數所需要的,但只被with_capability語句中的bad_function內部授予。這意味著直接調用credit會失敗。

現在,函數credit被定義如下:它增加了作為輸入的字符串的余額。如果該地址不在表中,它還會創建該條目。

最后,函數bad_function增加了legit_address的余額,但也執行了對符合之前定義的接口的合約的調用,該合約可以作為一個輸入參數提供。

函數get-balance允許我們讀取該表格。

3.用于觸發重入的模塊:

之后,返回10,返回100。

重入成功。

現在,如果我們不重入調用credit,而是嘗試重入再次調用bad_function,會發生什么?即使第一次調用credit成功,由于重入是在bad_function中,這將是一個遞歸調用且執行將會失敗。

現在,如果我們嘗試直接調用external_function,這將不起作用,因為所需的功能CREDIT沒有被授予。

寫在最后

通過移除無界遞歸,圖靈不完備性可以防止一些重入攻擊的載體。

然而,由于跨函數重入可以在沒有遞歸調用的情況下進行,圖靈不完備性并不能阻止所有此類攻擊載體,因此用戶在與這種語言交互時不應該假設重入不會造成惡劣影響。

重入和跨函數重入是非常常見的安全問題,Web3.0領域也因此發生了一系列規模巨大的攻擊事件。

Pact作為一種智能合約編程語言,極具潛力。

它采取的方法與其他語言如Solidity或Haskell有些不同。Pact并不完全依靠圖靈不完備性來提高安全性;該語言被設計地更容易閱讀、理解和正式驗證。

然而,沒有哪種編程語言能對所有的攻擊載體免疫。因此開發者必須了解他們所使用的語言的獨特功能,并且在部署前對所有項目進行徹底審計。

目前,CertiK的審計及端到端解決方案已覆蓋目前市面上大部分生態系統,并支持幾乎所有主流編程語言,就區塊鏈平臺、數字資產交易平臺、智能合約的安全性等領域為各個生態鏈提供安全技術支持。

Tags:DEFIDEFEFISISIC DeFiDEFY幣DeFinityIntegral Resistance

FTT
VITA:VitaDAO完成410萬美元融資,輝瑞風投部門Pfizer Ventures等參投_VITO

1月30日消息,去中心化自治組織VitaDAO完成410萬美元融資,輝瑞的風投部門PfizerVentures、ShineCapital、L1Digital、BalajiSrinivasan等參.

1900/1/1 0:00:00
VIP:VIP專享:定投購買BNB享零手續費!_CBTC

這是一般性公告,此處提及的產品和服務可能不適用於您所在的地區。活動時間:2023年02月01日17:00至2023年03月01日07:59活動:定投購買BNB享零手續費!幣安將為所有VIP1-9.

1900/1/1 0:00:00
UNI:Uniswap跨鏈擴張背后的 VC 戰爭_YFUNI Finance

在1月27日至1月31日間的社區治理投票中,Wormhole贏得投票,成為Uniswap和BNBChain間的跨鏈橋。期間共有8000個地址參與投票,涉及治理通證UNI4500萬枚.

1900/1/1 0:00:00
TPS:XT.COM關於隱藏並關閉BITCONEY定期理財活動的公告_INCOME幣

尊敬的XT.COM用戶:BITCONEY與XT.COM因更換新的合約地址未達成一致,項目方決定下架BITCONEY.

1900/1/1 0:00:00
NFT:Coinbase NFT:暫停“creator Drops”,不會關閉NFT市場_NFT2$幣

金色財經報道,加密貨幣交易所Coinbase的NFT平臺CoinbaseNFT周三表示,它正在暫停“creatorDrops”,以將其精力集中在其市場的其他方面.

1900/1/1 0:00:00
USDC:幣安流動性挖礦為BNB/BTC和BNB/ETH幣對池推出專屬BTC和ETH組合獎勵活動_BNB

這是一般性公告,此處提及的產品和服務可能不適用於您所在的地區。活動期間:即日至2023年02月27日21:00幣安流動性挖礦很高興地宣布,活動期間,用戶在BNB/BTC和BNB/ETH幣對池增加.

1900/1/1 0:00:00
ads