買以太坊 買以太坊
Ctrl+D 買以太坊
ads

AIN:CertiK干貨分享 | 十大DeFi安全最佳實踐方式(上)_INT

Author:

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

本教程適用于所有希望向主網推出user-ready應用程序的人員

如果你想要將構建的DeFi協議或是其他智能合約應用發布到區塊鏈主網上,安全因素一定是你要首先去考慮的。

許多團隊在審查代碼時只關注Solidity方面的問題,但要確保一個DApp的安全性并使其適配主網,還有很多其他問題需要關注。

了解近期高發的DeFi安全威脅——比如價格預言機攻擊、暴力破解攻擊以及其他攻擊手段,將保護你以及你的用戶數十億美元的資產。

因此啟動項目前做好盡職調查必不可少。

本文由CertiK及Chainlink聯合出品,將為你分享DeFi安全的10個最佳實踐,這將有助于防止你的應用程序成為攻擊的受害者。

?超長干貨,建議先收藏再看哦!

1.意識到重入攻擊的危害

以智能合約為中介進行的攻擊并不總是來自于外部。

重入攻擊作為臭名昭著DAO攻擊的一種形式,是DeFi安全中常見的攻擊類型。

當合約調用另一個惡意合約的外部函數時,該惡意合約可以通過fallback(回調函數)進行重入攻擊回調到原合約。

這是DeFi安全攻擊的一種常見類型——惡意合約可以在第一個函數完成前回調到調用合約之中。

引用Solidity文檔中對于重入攻擊的描述:"一個合約與另一個合約的任何互動,以及任何以太幣的轉移都會將控制權交給該合約。這使得合約有可能在這個互動完成之前回調到合約"。

我們來看一個例子?

Let’slookatanexample:```solidity//SPDX-License-Identifier:GPL-3

functionwithdrawBalance()public{??uintamountToWithdraw=userBalances;??msg

```

在一個函數執行完成之前調用其他函數

對開發者而言這是一個明顯的提醒——在ETH轉賬之前一定要先更新內部狀態。

一些協議甚至在其函數上添加互斥鎖,這樣如果函數尚未返回,該函數就不能被再次調用。

除了常見的重入漏洞,還有一些重入攻擊可以由特定的EIP機制觸發,如ERC777。

ERC-777是建立在ERC-20之上的以太坊代幣標準。

它向后兼容ERC-20,并增加了一個功能,使"操作員"能夠代表代幣所有者發送代幣。

關鍵是,該協議還允許為代幣所有者添加"send/receivehooks",以便在發送或接收交易時自動采取進一步行動。從UniswapimBTC黑客事件中可以看出,該漏洞實際上是由Uniswap交易所在余額更改之前發送ETH造成的。

消息人士:美聯儲正在加強年度壓力測試的措施:金色財經報道,據消息人士透露,在硅谷銀行(SVB)事件發生后,美聯儲正在審議一系列更嚴格的資本和流動性要求,以及加強年度壓力測試的措施,這些規定可能重點針對資產規模在 1000 億至 2500 億美元之間的中型銀行,這些銀行目前逃避了一些最嚴格的要求。

預計在未來幾個月,美聯儲將提出一系列改革建議,內容可能要求更多銀行在其監管資本中顯示某些證券的未實現收益和損失,而此舉將影響銀行的監管資本充足率,這是衡量銀行實力的一個關鍵指標。美國監管機構還準備調整一項計劃的范圍,以增加地區銀行在危機時可能動用的金融緩沖。(《華爾街日報》)[2023/3/15 13:04:47]

在該攻擊中,Uniswap的功能設計沒有遵循已被廣泛采用的??"ChecksEffectInteractive"模式,該模式是為了保護智能合約免受重入攻擊而發明的,按照該模式,代幣轉移應該在任何價值轉移之前進行。

2.使用DEX或AMM中的代幣余額儲備作為代幣價格參考會產生漏洞

這既是用于攻擊協議的最常見方法之一,也是最容易防御的DeFi攻擊類型。

使用`getReserves()`來決定代幣價格是十分危險的。

當用戶通過使用閃電貸攻擊基于訂單簿或自動做市商(AMM)的去中心化交易所(DEX)中的代幣價格,這種中心化的價格預言機就有可能會被攻擊。

在被閃電貸攻擊時,因為項目使用了DEX中的價格作為他們的價格預言機的數據,導致智能合約的執行出現異常,其形式包括觸發虛假清算、發放過大的貸款或觸發不公平交易。

由于這個漏洞,即使是市面上主流的DEX——例如Uniswap,?也不建議單獨使用代幣對(swappair)中兩種代幣的相對比率作為價格預言機的定價。

在基于DEX或AMM的價格預言機中,預言機的數據源是DEX上一次成功交易,代幣對調整之后的代幣余額,即代幣對中兩種代幣的相對比率。

該價格可能與代幣的實際市場價格不同步。

例如,如果進行了大額交易時代幣對中沒有足夠的流動性來支持,將會導致代幣價格與交易所的平均市場價格相比發生較大波動,當用戶大量買入時代幣價格會飆升,當大量賣出時代幣價格會狂跌。

閃電貸加劇了這一問題,因為它允許所有用戶在沒有任何抵押的情況下獲得大量臨時資金,以執行大額交易。用戶經常將問題歸咎于閃電貸,稱之為“閃電貸攻擊”。

然而,根本問題是——他們自己的DEX使用的是不安全的價格預言機,代幣價格很容易被操縱,導致依賴預言機的協議引用了不準確的價格。

這些攻擊應被更準確地描述為“預言機操縱攻擊”,這一攻擊形式在DeFi生態系統中造成了大量的攻擊事件。因此所有開發人員都應該在智能合約中刪除可能導致價格預言機被操縱的相關代碼。

Silvergate主要合作伙伴紛紛切斷與其業務往來:金色財經報道,加密貨幣交易銀行Silvergate在周三發布的一份報告中稱,虧損可能會使運營資金不足,其正在評估自身持續經營的能力。報告發布后,該公司的投資者和商業伙伴紛紛切斷與其業務往來,加密貨幣交易所Coinbase、加密貨幣銀行Galaxy Digital和加密公司Paxos決定停止接受或啟動通過Silvergate的支付。此外,加密貨幣交易平臺Crypto.com、Bitstamp以及加密貨幣公司Gemini隨后也宣布暫停使用Silvergate的存款或轉賬服務。Silvergate股價暴跌逾50%,創上市以來新低。[2023/3/3 12:39:54]

這里以最近一次攻擊的代碼舉例,此次攻擊造成了3000萬美元的損失,并使該協議的獎勵代幣的價格暴跌?。

```javascriptfunctionvalueOfAsset(addressasset,uintamount)publicviewoverridereturns(uintvalueInBNB,uintvalueInDAI){??if(keccak256(abi.encodePacked(IProtocolPair(asset).symbol()))==keccak256("Protocol-LP")){????(uintreserve0,uintreserve1,)=IPancakePair(asset).getReserves();??????valueInWETH=amount.mul(reserve0).mul(2).div(IProtocolPair(asset).totalSupply());??????valueInDAI=valueInWETH.mul(priceOfETH()).div(1e18);??}}```

該項目有一個預言機機制,可以從DEX中獲取代幣價格。

在DEX中,用戶可以將一對代幣存入流動性池合同,允許用戶根據匯率在這些代幣之間進行交換,匯率根據池中每一方的流動性數量計算。

現在有一個假設,如果一個項目大部分代碼是從熱門項目Uniswap中拷貝而來,我們可以認為這個項目是安全的。?

然而如果項目方在此基礎之上添加了一個獎勵代幣項目,當用戶向LP權益池中存儲流動性時,他們不僅可以獲得流動性代幣LPtoken,還可以獲取流動性挖礦的獎勵代幣。

這種情況下,黑客可以通過閃電貸將大量資金存入流動性池,從而操縱這個獎勵代幣的鑄造功能,這使得他們能夠以錯誤的比率兌換獎勵代幣。

在下方這個函數中,我們可以看到,攻擊者做的第一件事就是根據流動性池中兩種資產的儲備量,獲得流動性池中資產之間的匯率。

下面這行代碼的目的是獲得流動性池中的代幣儲備?

Axie Infinity推出時尚配件更新:金色財經報道,Axie Infinity宣布推出時尚配件更新,玩家可以使用新功能為他們的axies添加個性,同時促進游戲內經濟。從本月開始,玩家還可以在App.axie市場上交易他們的配件。這些物品實際上是ERC-721代幣,在市場上顯示為Charms或Runes。請注意,通過App.axie清單上的“裝備”功能,一次只有一個axie可以佩戴某個配件。

Axie Infinity團隊表示,配飾是加強你和你的 axies 之間情感聯系的重要一步。[2023/1/6 10:24:46]

```javascript(uintreserve0,uintreserve1,)=IProtocolPair(asset).getReserves();```

如果一個流動性池中有5個WETH和10個DAI,那么它的reserve0為5,reserve1為10。

當你獲得了流動性池中每種代幣的儲備量之后,將兩個儲備量相除,得到的匯率就可以定義代幣對中任意一種資產的價格。

根據上面的例子,如果流動性池中有5個WETH和10個DAI,那么兌換率是1個WETH兌換2個DAI——用10除以5。

雖然使用去中心化交易所可以很好地交換具有即時流動性的資產,但這并不能保證DEX提供的價格比率是正確的,因為DEX中的價格很容易被閃電貸操縱,并且單個DEX中的交易數據往往只代表資產的總交易量的一小部分。

所以當其被用于計算獎勵代幣數量時,智能合約的執行很容易變得不準確。

以下面的代碼為例?

Slightlymodifiedforcomprehension```javascript//ProtocolMinterV2.sol0x819eea71d3f93bb604816f1797d4828c90219b5dfunctionmintReward(addressasset/*LPtoken*/,uint_withdrawalFee/*0*/,uint_performanceFee/*0.00015...*/,addressto/*attacker*/,uint)externalpayableoverrideonlyMinter{??uintfeeSum=_performanceFee.add(_withdrawalFee);??_transferAsset(asset,feeSum);//transfersLPtokensfromVaultFlipToFliptothis??uintprotocolETHAmount=_zapAssetsToProtoclETH(asset,feeSum,true);??if(protocolETHAmount==0)return;??IEIP20(PROTOCOL_ETH).safeTransfer(PROTOCOL_POOL,protocolETHAmount);??IStakingRewards(PROTOCOL_POOL).notifyRewardAmount(protocolETHAmount);??(uintvalueInETH,)=priceCalculator.valueOfAsset(PROTOCOL_ETH,protocolETHAmount);//returnsinflatedvalue??uintcontribution=valueInETH.mul(_performanceFee).div(feeSum);??uintmintReward=amountRewardToMint(contribution);??_mint(mintReward,to);//mintstherewardtotheliquidityprovidersandattacks}```

報告:年輕人在其投資組合中持有加密貨幣的可能性是43歲及以上投資者的7.5倍:金色財經報道,美國銀行本周發布了 2022 年美國富豪私人銀行研究報告。報告顯示,美國銀行發現,年輕富有的美國人在其投資組合中持有加密貨幣的可能性是43歲及以上的投資者的 7.5 倍。此外,傳統的投資建議表明,年輕投資者比年長投資者持有更多而不是更少的股票。然而,21 至 42 歲年齡段的人僅持有四分之一的股票投資組合,而 43 歲及以上的投資者中這一比例為 55%,雖然 29% 的年輕人表示加密是創造財富的主要機會,但只有 7% 的老年人同意,年輕群體通常對私募股權或債務,以及與可持續或環境、社會和治理 (ESG) 相關的投資更感興趣。[2022/10/17 17:28:34]

在這個例子中,向用戶進行獎勵代幣發放的主要函數是_mint(mintReward,to);。

我們可以看到,該函數根據用戶在流動性池上鎖定的資產價值來鑄造獎勵代幣。

因此,如果一個用戶突然在流動性池中擁有大量的資產,那么該用戶可以輕易地為自己鑄造大量獎勵代幣,這部分代幣是從其他用戶的獎勵中竊取的。

然而,目前的利潤水平依舊沒有達到攻擊者的期望。

因此,操縱DEX中代幣的價格可以大大提升他們竊取的代幣價值。

在這個例子中,合約認為他們給用戶發放了價值5美元的獎勵代幣,但實際上發放了5000美元。

通過這種設置,惡意用戶可以很容易地進行閃電貸攻擊,將獲取的臨時資金存入流動性池,鑄造大量的獎勵,然后償還閃電貸款,獲得的利潤由其他流動性提供者承擔,從中獲利。

為了防止基于閃電貸攻擊的價格操縱問題,通常的解決方案是采取DEX市場的時間加權平均價格。

雖然這可以防止閃電貸歪曲預言機價格,因為閃電貸只存在于一個交易或區塊中,而TWAP是多個區塊的平均值,但這并不是一個完整的解決方案,因為TWAP有其自身的妥協。

在價格劇烈波動時期,TWAP預言會變得不準確,這可能會導致下游事件——如無法在期限內清償抵押不足的貸款。

此外,TWAP預言沒有提供足夠的市場覆蓋率,因為它只追蹤一個DEX中的數據,使其它容易受到不同交易所的流動性或交易量變化的影響,從而影響TWAP預言給出的價格。

解決方案:使用去中心化的預言機網絡

與其使用中心化預言機來確定匯率,保證DeFi安全的最佳做法是使用去中心化的多個預言機組成的網絡來確定代幣的實際市場價格。

一個DEX作為一個交易所是去中心化的,但把它作為定價信息參考時它是中心化的。

正確的做法是:你需要收集所有流動性中心化和去中心化交易所的價格,按交易量加權,并去除偏差值/清洗交易,以獲得相關資產全球匯率的去中心化準確視圖,確保能反映市場的實際價格。

區塊鏈數據分析公司Flipside Crypto推出基于NFT的SDK“ShroomDK”:6月29日消息,區塊鏈數據分析公司Flipside Crypto今天宣布推出ShroomDK,這是一個基于NFT的SDK,可編程查詢訪問全面的區塊鏈數據。

具體而言,ShroomDK NFT允許開發人員以編程方式查詢數十個區塊鏈的數據,包括以太坊、Arbitrum、Optimism等Layer2網絡、Avalanche、BNB Chain,以及對Flipside L1合作伙伴包括Solana、NEAR、FLOW、Thorchain和Algorand的多鏈訪問。

此前4月消息,Flipside Crypto宣布完成5000萬美元融資,Republic Capital領投,True Ventures、Galaxy Digital、Terra、Dapper Labs、M13、Blockchain Coinvestors、Collab Currency、Hashkey、Avon Ventures(隸屬于Fidelity Investments的風險投資基金)、Lightshed、Resolute、Boston Seed、Converge、Hutt Capital、Gaingels、Commerce Ventures、Quiet、Tribe Capital等參投。(PR Newswire)[2022/6/29 1:39:39]

如果你能獲取基于所有交易環境的成交量加權的全球平均值的資產價格,那么閃電貸在單一交易所中操縱資產價格就不是問題。

此外,由于閃電貸款只存在于單個交易中,它們對去中心化的價格源并沒有影響,這些價格源在單獨的交易中產生具有能代表全球市場的實際價格更新。

Chainlink預言機網絡的去中心化結構及其實現的廣泛市場覆蓋,保護了DeFi協議免受閃電貸攻擊導致的價格操縱,這就是為什么越來越多的DeFi項目正在集成Chainlink價格反饋機制,以防止價格預言機被攻擊,并確保在突發的交易量變化中準確定價。

你不需要再使用`getReserves`來計算價格,而是從Chainlink數據源中獲得代幣交換比率,Chainlink數據源是去中心化的預言機節點網絡,在鏈上提供能反映所有相關CEX和DEX的資產加權平均價格。

```soliditypragmasolidity^0.6.7;import"??/**??*Returnsthelatestprice??*/??functiongetThePrice()publicviewreturns(int){????(??????uint80roundID,??????intprice,??????uintstartedAt,??????uinttimeStamp,??????uint80answeredInRound????)=priceFeed.latestRoundData();????returnprice;??}}```

上面的代碼是實現Chainlink價格預言機的全部內容,你可以通過閱讀文檔嘗試在應用程序中進行實現。

如果你剛開始接觸智能合約或預言機,我們有一個初學者教程,幫助你入門,并保護你的協議及用戶免受閃電貸和預言機操縱攻擊。

如果你想了解更多詳情,可以試試查看OpenZeppelin的DEX??Ethernaut,它顯示了操縱DEX的代幣價格有多么容易。

3.不要使用Keccak256或Blockhash生成隨機數

使用?"block.difficulty"、"block.timestamp"、"blockhash"或任何與區塊相關的參數來生成隨機數,都會使你的代碼被惡意攻擊。

智能合約中的隨機性在許多用例中都很有用,例如無偏見地確定獎品的獲得者,或者公平地將稀有NFT分配給用戶。

然而,區塊鏈是確定的系統,不提供隨機數的防篡改來源,所以在不查看區塊鏈外部的情況下獲取隨機數是具備一定風險的,并有可能導致被惡意攻擊。

隨機數生成漏洞并不像預言機操縱攻擊或重入攻擊那樣普遍,但它們在Solidity教育材料中可是“常客”。

許多教育內容誤導區塊鏈開發人員使用如下代碼獲取隨機數:

```javascriptuintrandomNumber=uint(keccak256(abi.encodePacked(nonce,msg.sender,block.difficulty,block.timestamp)))%totalSize;```

這里的想法是使用nonce、塊難度和時間戳的某種組合來創建一個"隨機"數字。

然而,這有幾個明顯的缺點——你可以很輕易的用取消交易的方式重復生成多次,直到得到一個你想要的隨機數。

1.使用像block.difficity這樣的哈希對象作為源來生產隨機數時,礦工有能力改變這個源。與"重滾"策略類似,如果結果對他們不利,礦工可以利用他們訂購交易的能力,將某些交易排除在區塊之外。

如果該交易是用于鏈上生成隨機數的源,礦工也可以選擇扣留對他們不利的哈希值所在的區塊。

2.使用block.timestamp無法提供任何隨機性,因為時間戳是任何人都可以預測的。以這種方式使用鏈上隨機數生成器,會讓用戶以及礦工對"隨機"數字產生影響和控制。

如果你希望實現一個公平系統,以這種方式生成隨機性將非常有利于攻擊者,并且這個問題只會隨著隨機函數所保護的價值量的增加而變得更糟,因為攻擊它的動機也增加了。

解決方案:使用ChainlinkVRF作為可驗證的隨機數生成器

為了防止被惡意攻擊,開發者需要一種方法來生成可驗證的隨機數,并防止其被礦工和用戶篡改。

實現這一目標需要來自于預言機的鏈下隨機數源。

然而,許多提供隨機性來源的預言機沒有辦法真正證明他們提供的數字確實是隨機產生的。

因此開發者需要能夠從鏈外獲取隨機性,同時也需要一種密碼學算法來證明隨機性沒有被操縱過。

Chainlink的可驗證隨機函數正好實現了這一點。它使用預言機節點在鏈外生成一個隨機數,并對該數字的完整性進行加密證明。然后由VRF協調器在鏈上檢查加密證明,以驗證VRF的確定性和防篡改性。

它的工作原理是這樣的:

1.一個用戶從Chainlink上節點請求一個隨機數,并提供一個種子值,隨后Chainlink將會發出一個鏈上事件日志。

2.鏈外的Chainlink預言機讀取該日志,并使用可驗證的隨機函數基于節點的密鑰哈希、用戶給定的種子和發送請求時未知的塊數據創建一個隨機數和加密證明。然后,它在第二筆交易中把隨機數返回鏈上,這時在鏈上通過VRF協調器合約使用加密證明進行驗證。

ChainlinkVRF是如何解決上述問題的?

1.無法進行回滾攻擊

由于這個過程需要兩筆交易,第二筆交易是創建隨機數的地方,所以你無法看到隨機數或取消你的交易。

2.礦工無法改變這個值

由于ChainlinkVRF不使用礦工可以控制的參數,比如block.difficulty或block.timestamp等可預測的值,所以他們無法控制隨機數。

用戶、預言機節點或DApp開發者無法操縱ChainlinkVRF提供的隨機性數據,這使得它成為智能合約應用所使用的鏈上隨機性來源的安全得到了保證。

大家可以按照文檔的要求試試在代碼中實施ChainlinkVRF,或者根據我們的初學者指南來使用ChainlinkVRF。

在本系列接下來的內容中,將會為大家逐一講解剩余的7大DeFi安全最佳實踐方式,歡迎持續關注!

關注CertiK官方公眾號,底部對話框發送消息“圖譜”,可獲取《區塊鏈知識圖譜》高清大圖哦!

參考鏈接:

1.?https://www.researchgate.net/publication/235301171_The_Adoption_of_Electronic_Banking_Technologies_by_US_Consumers

2.https://www.gemini.com/cryptopedia/the-dao-hack-makerdao

3.https://docs.soliditylang.org/en/v0.8.9/contracts.html?highlight=receive#special-functions

4.?https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/

5.?https://eips.ethereum.org/EIPS/eip-1884#motivation

6.?https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol

7.?https://fravoll.github.io/solidity-patterns/checks_effects_interactions.html

8、https://blog.chain.link/flash-loans-and-the-importance-of-tamper-proof-oracles/

9.https://www.coindesk.com/flash-loans-centralized-price-oracles

10.https://github.com/Uniswap/uniswap-v2-core/tree/4dd59067c76dea4a0e8e4bfdda41877a6b16dedc

11.https://chain.link/data-feeds

12.https://docs.chain.link/docs/using-chainlink-reference-contracts/

13.https://docs.chain.link/docs/get-the-latest-price/

14.https://docs.chain.link/docs/beginners-tutorial/

15.https://ethernaut.openzeppelin.com/level/0x0b0276F85EF92432fBd6529E169D9dE4aD337b1F

16.https://docs.chain.link/docs/get-a-random-number/

17.https://docs.chain.link/docs/get-a-random-number/

18.https://docs.chain.link/docs/intermediates-tutorial/

來源:金色財經

Tags:INTCHAAINChainAlgoPainterChain Wars Essenceiotchainisechain

萊特幣最新價格
GAME:OceanMollu丨GameFi鏈游大爆發BSC受益最多 但P2E可持續嗎?_GAM

近期游戲類融資十分火爆,從FootprintAnalytics的數據看到在2020年還處于末位,在2021年游戲類已經排名首位,占據了所有投資筆數中近13%的份額.

1900/1/1 0:00:00
EFI:OceanMollu丨GameFi元年游戲與游戲平臺兩個方向蓄力_NightVerse Game

NFT為加密行業帶來了無盡的想象力,也實實在在促進了行業發展,從卡牌游戲、數字藝術、頭像藝術、生成藝術、社區NFT到近期大熱的GameFi,再到加密世界的終極形態元宇宙.

1900/1/1 0:00:00
FIL:“All in Crypto”:紅杉資本投資了哪些項目?_NAN

吳說作者?|?ColinWu紅杉資本的推特似乎換了運營者,一會發行NFT,一會把簡介中的公司換成“DAO”,讓外界摸不著頭腦.

1900/1/1 0:00:00
ALM:微軟領投對初創公司Palm NFT Studio的2700萬美元B輪融資_Palmes

加密貨幣初創公司PalmNFTStudio周四宣布完成2700萬美元B輪融資,由微軟的風險基金M12領投.

1900/1/1 0:00:00
元宇宙:數字經濟賦能 點燃高質量發展新引擎_BAYC價格

數字經濟作為新一輪產業革命的起點,是中國經濟高質量增長的突破口。數字技術的應用改變了傳統的商業邏輯,為企業與產業的發展注入了新的活力.

1900/1/1 0:00:00
元宇宙:全球知名元宇宙建筑及商業服務商MetaEstate正式啟用中文名稱"元筑科技"_uniswap幣賣出沒反應

即日起,總部設立在新加坡的全球知名元宇宙建筑及商業服務商MetaEstate宣布正式啟用中文名稱“元筑科技”.

1900/1/1 0:00:00
ads