11 月 30 日,我們的安全事件監控系統 ThunderForecast 通過掃描以太坊上的歷史交易,發現了針對 Loopring 協議的攻擊(部落格 英文版、中文版)。結論是,此次攻擊的根本原因是 sellTokenForLRC 函數缺乏存取控制。攻擊者獲取了 80.97 ETH,按當時價格計算相當於 48,849.2 美元。
2020 年 12 月 11 日,我們的監控系統 ThunderForecast 報告了一系列交易匯率異常的交易。隨後,我們使用研究團隊開發的 EthScope 系統 對這些交易進行了分析,發現這是一次利用 Seal Finance 協議漏洞進行套利的攻擊。
什麼是 Seal?
正如 Seal 白皮書 中所述:「SEAL 是一個實驗性協議,作為主要 DeFi 協議代幣之間的中介,旨在創建更深度的流動性」。截至目前,存在超過 10 個流動性資金池,將 Seal 與其他知名的代幣(如 UNI、YFI、USDT、SNX 等)掛鉤。為了賺取獎勵,投資者需要將 LP 代幣存入 SEAL 獎勵合約,並觸發 Farm 合約中的 breed() 函數來產生新的 SEAL 代幣。Farm 合約部署在每個 Seal 資金池中,合約中的 breed() 函數用於發行新的 Seal 代幣。根據 breed() 的設置,它會額外發行 1.6% 的 Seal 代幣。此外,0.8% 的已發行 Seal 代幣會被兌換為另一種代幣,並與另外 0.8% 的已發行 Seal 代幣一同存入資金池作為流動性。然而,由於 breed() 函數沒有設計存取控制,任何人都可以觸發該函數,這種原始的設計成為此次報告攻擊的根本原因。
以下是經確認的 breed() 函數原始碼:
function breed() external {
require(now / 1 days > today);
today += 1;
uint256 sealPairAmount = seal.balanceOf(address(cSeal));
uint256 tokenPairAmount = token.balanceOf(address(cSeal));
uint256 newSeal = sealPairAmount.mul(spawnRate).div(1e18);
uint256 amount = UniswapV2Library.getAmountOut(newSeal, sealPairAmount, tokenPairAmount);
seal.mint(address(cSeal), newSeal);
if(address(seal) < address(token))
cSeal.swap(0, amount, address(this), "");
else
cSeal.swap(amount, 0, address(this), "");
token.transfer(address(cSeal), amount);
seal.mint(address(cSeal), newSeal);
cSeal.mint(address(this));
}
詳細分析
我們現在透過一筆攻擊 交易 來揭露更多攻擊細節。在此交易中,攻擊者對 10 個 Seal 資金池重複了攻擊邏輯,以實現利潤最大化。在接下來的分析中,我們重點關注在 Seal-SNX 資金池中發起的攻擊。

過程涉及三個步驟:
- 步驟 1:在 Seal-SNX 資金池中將 1,084 Seal 兌換為 2,787 SNX。交易匯率為:1 Seal = 2.57 SNX。
- 步驟 2:觸發
Farm合約中的breed()函數。該函數發行了 13.08 Seal 並將其兌換為 10.20 SNX。此時的交易匯率變為:1 SNX = 0.78 Seal。原因是資金池中的大部分 SNX 被兌換為 Seal,導致 SNX 和 Seal 的數量產生巨大差異。隨後,根據 Uniswap 的價格計算演算法,SNX 在資金池中的價值變得極高(價格上漲了 3 倍以上)。 - 步驟 3:在 Seal-SNX 資金池中將 2787 SNX 兌換為 1100 Seal。由於上述兌換進一步提高了 SNX 的價格,攻擊者套出了更多的 Seal 代幣(額外 16 Seal)。
為了進一步衡量和確認損失,我們使用我們的 EthScope 系統,在攻擊發生前的區塊狀態下重放了 breed() 函數。結果顯示,與正常調用相比,Farm 多發行了 18 個 Seal 代幣。攻擊者取走了 16 個 Seal,資金池中僅剩下 2 個 Seal。
獲利與損失
在此次交易中,攻擊者總共獲利 175 Seal。
攻擊規模
截至 2020 年 12 月 13 日,鏈上共部署了 3 個惡意合約(0x49f93e, 0x8b3710, 0x0f20b6),並成功發起了 22 筆交易,盜取了 4,247 個 Seal 代幣。按當時價格計算,攻擊者利用 Seal 協議的漏洞非法獲利約 58,467 美元。值得一提的是,Seal 協議的漏洞當時仍在遭受攻擊!
此外,透過分析獲利 Seal 代幣的流動,我們發現約 900 個 Seal 代幣被存入 DEX,其餘部分則分發到了 6 個不同的地址。如下圖所示,這些地址除了 Seal Finance 和 Uniswap V2 的流動性資金池外,均為 Seal 代幣的前幾大持有者。

結語
隨著以太坊 DeFi 生態系的發展,各種安全問題逐漸浮現。事實上,導致此次攻擊的根本原因——存取控制缺失,在 2020 年 12 月 13 日前透過 22 筆交易給 Seal 造成了相當大的損失(58,467 美元)。
更新(2021/01/04)
繼 2020 年 11 月 30 日的首次攻擊後,攻擊者又部署了第三個攻擊合約並發起了五次攻擊。最後一次攻擊發生在 2020 年 12 月 24 日,並將獲得的 Seal 代幣轉移到了此地址。在此過程中,攻擊者共獲得了 6,021 個 Seal 代幣。
時間軸:
- 2020/12/11:發現可疑交易
- 2020/12/12:完成分析
- 2020/12/13:向 Seal Finance 回報
- 2021/01/03:發布詳細資訊
- 2021/01/03:分配 CVE-2021–3006 編號
關於 BlockSec
BlockSec 是一家開創性的區塊鏈安全公司,由一群全球傑出的安全專家於 2021 年創立。公司致力於提升新興 Web3 世界的安全性和可用性,以促進其大規模採用。為此,BlockSec 提供智慧合約與 EVM 鏈 安全審計 服務;提供用於安全開發與主動阻斷威脅的 Phalcon 平台;提供用於資金追蹤與調查的 MetaSleuth 平台;以及助力 Web3 建設者高效探索加密世界的 MetaSuites 擴充功能。
迄今為止,公司已服務超過 300 家知名客戶,包括 MetaMask、Uniswap Foundation、Compound、Forta 和 PancakeSwap,並獲得了來自 Matrix Partners、Vitalbridge Capital 和萬向區塊鏈實驗室(Fenbushi Capital)等頂尖投資機構的兩輪數千萬美元融資。
官方 Twitter 帳號:https://twitter.com/BlockSecTeam



