安⽐實驗室發布「YFII流動性挖礦合約安全性研究」,所涉四項合約未包含致命安全漏洞
yfiifinance
2020-08-04 07:16
本文约3420字,阅读全文需要约14分钟
目前,YFII 合約代碼均直接Fork 自Yearn Finance,做了較小的改動以支持YFII Token 的定期減半分發。

YFII 是一個新型去中心化DeFi 礦池,應社區小伙伴邀請,安比實驗室於2020 年7 月27 日至8 月2 日對YFII 智能合約進行了安全性研究。

二級標題

  • YFII Pool 1: 0xb81D3cB2708530ea990a287142b82D058725C092

  • YFII Pool 2: 0xAFfcD3D45cEF58B1DfA773463824c6F6bB0Dc13a

  • YFII Token: 0xa1d0E215a23d7030842FC67cE582a6aFa3CCaB83

  • BPT Token: 0x16cAC1403377978644e78769Daa49d8f6B6CF565

二級標題

目前,YFII 合約代碼均直接Fork 自Yearn Finance,做了較小的改動以支持YFII Token 的定期減半分發。

二級標題

目前,YFII 合約代碼均直接Fork 自Yearn Finance,做了較小的改動以支持YFII Token 的定期減半分發。

目前,YFII 合約代碼均直接Fork 自Yearn Finance,做了較小的改動以支持YFII Token 的定期減半分發。

下表為YFII 涉及的合約與YFI 合約對應關係及地址。

YFI/YFII Token 為項目治理Token 合約,二者實現一致,具體為一個帶mint 和簡單governance 功能的標準ERC-20 Token。

BPT Token 為Balancer Pool Token 合約,是做市商的流動性證明Token,實際由自動做市協議Balancer 的BFactory入口合約創建,因此二者實現完全一致。該合約代碼此前由Trail of Bits 和Consensys Diligence進行過審計

二級標題

二級標題

YFII & YFI 核心合約簡析

審計Unipool審計審計

基於YearnRewards 的流動性挖礦整個流程可以分為以下幾步:

  • 具有RewardDistribution 權限的地址,預先通過調用YearnRewards 合約的notifyRewardAmount() 函數,設置獎勵數額,而對應金額的YFI Token 應由YFI minter 轉入YearnRewards 合約中。

  • 礦工向YearnRewards 合約指定的目標DeFi 合約(可為自動做市商DEX、或借貸協議)提供流動性(通常為存入穩定幣),拿到對應的流動性證明Token(通常也稱為Pool Token) ,該Token 可以用於換回資產以及賺取利息或手續費收益。

  • 礦工將得到的Pool Token 通過調用stake() 函數存入YearnRewards 合約中,合約自動根據Stake 時長和礦工存入資金規模佔資金池總規模的大小來計算礦工應得的獎勵。

  • 二級標題

二級標題

一些發現

前面提到YFII 相對於YFI 的改動,代碼改動整體較小。

新增兩個修飾器函數用於約束stake() withdraw() getReward() 三個主要功能函數。

notifyRewardAmount() 函數中新增了一行代碼,用於在notify 的同時直接控制YFI Token 合約mint (增發)指定數量的Token 到當前YearnRewards 合約,將其作為獎勵用於分發。因此,Pool1 和Pool2 合約必須是YFII Token 合約的minter。

這讓YFII 與YFI 在Token 分發細節邏輯上稍有不同。 YFI 每期獎勵的分發都需要由特定地址負責設置金額並轉入Token。而YFII 除了第一期開始前執行了notifyRewardAmount() 操作,之後會隨著用戶的調用,產量自動定期減半。

另外,在與社區開發者Madao 和gaojin 討論代碼細節的過程中,Madao 提到Token 產量自動減半的執行需要依賴checkhalve() 函數的執行,實際則依賴用戶與合約交互,執行時間無法精準控製到上一個週期的結尾,減半發生時間會與預期時間存在一定的時間差,並且合約減半實際發生時間很大概率晚於預期時間。

二級標題

二級標題

YFII 管理員權限處理

YFI 類Token 都存在鑄幣(Mint)接口,具有mint 權限的地址可以增發Token。 YFI 類Token 還存在Governance 管理員,具有權限添加和刪除Minter。通常理想情況下這些地址特殊權限地址應該為多簽合約或其他專門合約。

另外YearnRewards 合約有rewardDistribution 權限地址,用於調用notifyRewardAmount() 函數設置獎勵金額。 YearnRewards 合約還存在owner 權限地址,用於設置rewardDistribution 地址。

目前,YFII 項目的做法是將YFII Token 的Governance 管理員、Pool1 和Pool2 的rewardDistribution 均設為了0 地址。管理員權限銷毀記錄可參見https://burn.yfii.finance/。經查驗,管理員權限銷毀屬實。目前只有Pool1 和Pool2 兩個合約地址具有YFII Token 的mint 權限,屬於為了實現週期性減半的必要權限,且未來無法被濫用。

特別值得一提地是,原版YFI Token 代碼實現中,並未給addMinter() 該特權函數添加Event,導致普通用戶無法方便地查看究竟合約有多少minter。當心,這讓各種類YFI 項目非常容易藏入後門。

經查驗,YFII Token 合約總共總結總結

總結

安全建議

安全建議

安全建議

隨著流動性挖礦和DeFi 產品的火熱,市面上湧現出來各種新型DeFi 智能合約,組合性風險劇增。安比實驗室提醒用戶與任何DeFi 項目交互時一定要注意安全第一,認清域名、合約地址,仔細審查所有與資金相關的操作,盡量不要與來源不明的智能合約交互。另外,我們應更多關注DeFi 產品本身和智能合約安全,分析價值基礎和風險來源,不盲信APR,只投入能夠承受損失的金額。

特別提醒,記得用本文中提供的線索自行檢查參與的類YFI 項目管理員權限。

yfiifinance
作者文库