Cobo Labs 是亞太最大的加密貨幣託管平台,最受機構歡迎的金融資管服務商Cobo 的加密貨幣研究實驗室。

我們專注於創新項目,前沿加密數字技術領域,全球市場合規動向,市場基本面及波動因子;旨在幫助市場參與者和加密貨幣愛好者,降低進入市場的認知門檻。

此篇文章由Cobo 區塊鏈安全研究團隊供稿,團隊成員來自知名安全實驗室,有多年網絡安全與漏洞挖掘經驗,曾協助谷歌、微軟處理高危漏洞,並獲得谷歌、微軟等廠商致謝,曾在微軟MSRC 最有價值安全研究員Top 榜單中取得卓越的成績。團隊目前重點關注智能合約安全、DeFi 安全等方面,研究並分享前沿區塊鏈安全技術。

我們也希望對加密數字貨幣領域有研究精神和科學方法論的終身迭代學習者可以加入我們的行列,向行業輸出思考洞察與研究觀點!

此篇是CoboLabs的第4篇文章。

跨鏈橋Multichain 漏洞

1月18日知名跨鏈橋Multichain(前身Anyswap)發現並修復了一個針對WETH, PERI, OMT, WBNB, MATIC, AVAX 共6 種代幣有重要影響的漏洞。凡對Multichain Router 授權過上述代幣的用戶均受影響,攻擊者可直接利用漏洞轉走用戶授權的代幣。根據19 日的官方公告,由於部分用戶未及時取消授權,有約445 WETH 被攻擊者盜走。

漏洞發生在AnyswapV4Router 合約上的anySwapOutUnderlyingWithPermit 函數中,由於函數對Token 參數的合法性沒有校驗,攻擊者可傳入偽造的Token 合約來代替原本官方的AnyswapV1ERC20Token。另一方面WETH 等代幣合約沒有實現permit 方法但是實現了fallback 函數,因此在後續調用permit 時不會發生revert,可以繼續成功執行下去。最終導致攻擊者可以將受害者approve 給AnyswapV4Router 合約的Token 盜走。

關鍵代碼如下:

 function anySwapOutUnderlyingWithPermit(  address from,  address token,  address to,  uint amount,  uint deadline,  uint8 v,  bytes32 r,  bytes32 s,  uint toChainID  ) external {  address _underlying = AnyswapV1ERC20(token).underlying();  IERC20(_underlying).permit(from, address(this), amount, deadline, v, r, s);  TransferHelper.safeTransferFrom(_underlying, from, token, amount);  AnyswapV1ERC20(token).depositVault(amount, from);  _anySwapOut(from, token, to, amount, toChainID);  }

Cobo Comment

對於普通用戶來說,需要特別留意Token 無限授權(ERC20 Infinite Approval )所帶來的風險。授權盡可能保證只授權用到的Token 數量,而不要使用默認的無限授權,避免節約了gas 卻丟失了本金。對已有的無限授權要及時撤銷,查詢賬戶的授權情況可以使用Etherscan 的工具https://etherscan.io/tokenapprovalchecker 。

Reference

https://github.com/W2Ning/Anyswap_Vul_Poc

https://theblockbeats.info/news/28774

https://hackernoon.com/erc20-infinite-approval-a-battle-between-convenience-and-security-lk60350r

BSC 上的DEX Crosswise 遭攻擊1月18日BSC 上的DEX 項目Crosswise 遭受攻擊,損失約30 萬美金,並造成CRSS Token 幣價閃崩。問題是因MasterChef 合約的setTrustedForwarder 函數沒有正確進行權限校驗。當攻擊者修改了TrustedForwarder 後,可以實現偽造msg.sender 的效果,從而直接獲取到MasterChef 的owner 權限。然後再利用owner 權限調用set 函數設置strategy 為攻擊者的惡意參數0xccddce9f0e241a5ea0e76465c59e9f0c41727003 。修改strategy 後通過少量deposit 即可withdraw 大量的CRSS Token 獲利。相關代碼如下:

 function setTrustedForwarder(address _trustedForwarder) external {  require(_trustedForwarder != address(0));  trustedForwarder = _trustedForwarder;  emit SetTrustedForwarder(_trustedForwarder); } 
function _msgSender() internal override virtual view returns (address payable ret) { if (msg.data.length >= 24 && isTrustedForwarder(msg.sender)) { // At this point we know that the sender is a trusted forwarder, // so we trust that the last bytes of msg.data are the verified sender address. // extract sender address from the end of msg.data assembly { ret := shr(96,calldataload(sub(calldatasize(),20))) } } else { return msg.sender; } }

官方公告也承認這個漏洞過於明顯,似乎是開發者有意為之,其內部調查後開除了4 個開發者。目前已經對鏈上數據進行了快照,後續將進行重新部署。官方git 上已經開始進行整體的代碼審計,據稱後續會再聯合Certik 進行審計。

Cobo Comment

此次攻擊針對的是MasterChef 合約,其實不會直接盜取用戶的LP 或者CRSS token,但幣價大跌還是會讓持有CRSS 的用戶造成實際的損失。查看官方doc 上無法找到項目審計報告,此漏洞比較明顯,如果經過安全公司審計的話,很大概率可以暴露出來。對於個人投資者來說,未經過審計的項目還需謹慎。

Reference

https://twitter.com/peckshield/status/1483340900398895105

https://crosswise.medium.com/post-exploit-update-2a24c3370466

https://bscscan.com/address/0x70873211cb64c1d4ec027ea63a399a7d07c4085b#code

https://github.com/crosswise-finance/crosswise-code-review-1.1

Rari #90 即Float Protocol Pool 遭受預言機操縱攻擊

1月15日,RariCapital 上的90 號池即Float Protocol 池遭受預言機操縱攻擊。

該池使用Uniswap V3 FLOAT/USDC 交易對報價,而在攻擊發生之前幾天,FLOAT/USDC 池中流動性下降(只剩下約~$550k),低流動性給了攻擊者進行進行預言機操縱攻擊的機會。攻擊者使用47 ETH(價值約$120k)在池中使用USDC 兌換FLOAT,導致FLOAT 報價升高。之後再使用FLOAT 抵押到Rari #90 池中藉出其他資產實現獲利。攻擊手法與2021 年11 月發生的Rari #23 池Vesper Lend Beta 攻擊一致。

Cobo Comment

對於一些無法使用ChainLink 預言機報價的小幣種,DeFi 合約中通常會使用DEX 作報價。目前UniswapV2/V3 延時報價雖然可以抵抗閃電貸攻擊,但無法抵抗真實的大資產操縱;而TWAP 時間加權機制雖然可以在一定程度上提高操縱難度,但只能緩解不能根除。從開發者角度,可以考慮在合約中添加一定風控類代碼針對惡意報價進行檢查。對普通用戶而言,則要留意相關的流動性池,提防價格操縱風險。

Reference

https://twitter.com/FloatProtocol/status/1482184042850263042

https://medium.com/vesperfinance/on-the-vesper-lend-beta-rari-fuse-pool-23-exploit-9043ccd40ac9

DefiDollar 發現潛在攻擊

1月8日DefiDollar Finance (@defidollar) 發推表示在DUSD 合約中發現一個潛在漏洞,合約已經暫停,所有資金安全。據稱該漏洞可能是使用了區塊鏈監測系統自動發現的。其思路是監測鏈上Tornado.Cash 轉賬到新地址並部署合約的行為(這是許多真實攻擊中的典型初期準備行為)。進一步通過對合約和相關交易的分析來發現潛在的攻擊行為,發現問題時將立刻通知相關項目方進行預防。有人已經在Forta 上實現了類似的Agent.

Cobo Comment

項目方可以考慮類似的方式,通過監測鏈上的新合約和內存池中的交易,對於可疑的合約或交易可以進行靜態分析或模擬執行,檢查是否會對自身項目關聯合約中的資產有不良影響。隨著區塊鏈攻防的升級,可以預見類似的監測告警系統將會越發成熟,當然攻擊者也會挖掘到更多bypass 監測的攻擊方式。在傳統安全中攻防持續對抗的局面在區塊鏈安全中也將不斷重現。

Reference

https://twitter.com/AndreCronjeTech/status/1479778350084333574

https://connect.forta.network/agent/0x2fbec7dcd4eebf34c5b94d899109057eea3642a2400b7143e64873d453b7ba61

Rari pool #19 攻擊失敗

知名區塊鏈安全白帽@samczsun 發布了針對Rari #19(Index Coop Pool)的預警推文,但後面攻擊沒有實際發生。

攻擊手法與前面提到的Float Protocol Rari #90 預言機攻擊是類似的。攻擊者在Uniswap V3 將約300 個ETH 兌換成了BED,實現對幣價的操縱。由於Uniswap V2/V3 Oracle 都是在第二個區塊才會更新幣價,使攻擊者無法在一個交易內完成對幣價的操縱,從而可以對抗閃電貸攻擊。而當使用真實的大資金進行操縱時,攻擊者則需要至少等待到第二個區塊才能看到幣價的反應。由於TWAP 的存在,通常攻擊者還需要多等待幾分鐘,以使幣價變得更加明顯。對於此次攻擊來說,攻擊者也確實是這樣做的。然而尷尬的是,在第二個區塊出現了疑似套利機器人的存在,此地址在第二個區塊立刻將將手中的大量BED 兌換成了ETH,維持住了原本幣價的穩定。使得攻擊者無法繼續攻擊,並且還要承擔swap 的gas、手續費與大單交易滑點的損失。

Cobo Comment

Uniswap V2/V3 Oracle 雖然可以抗閃電貸攻擊,但是無法直接對抗大資金操縱。因此對於流動性較小的交易對,仍然存在預言機價格被操縱的風險。從攻擊者的角度看,要進行對Uniswap V2/V3 Oracle 操縱攻擊,需要較高的攻擊成本,而且需要保證自己持有市場中大部分所操縱的池子的目標代幣,否則就會出現上面的情況,被其他持有目標代幣的大戶套利,最終偷雞不成蝕把米。

Reference

https://twitter.com/samczsun/status/1486243806739587076

OpenSea 前端漏洞

@PeckShield 發文稱OpenSea 可能有前端問題,有用戶利用該問題獲利347 ETH。這個漏洞可能與@yakirrotem 披露的問題有關。

OpenSea 的交易架構是:

賣家發起listing(相當於報價),這時用戶會對報價數據進行簽名,表示同意以設置的價格出售其NFT。

這個簽名數據會保存在OpenSea 的鏈下數據庫中,當買家在OpenSea 上購買該NFT 時,OpenSea 會把這個簽名數據上鍊驗證,通過後即可完成NFTtransfer,OpenSea 也會收取一部分手續費。

售出前,賣家也可以取消之前的listing,被cancel 的listing 會在鏈上驗籤時失敗,從而不會被出售。

這裡存在的問題是,OpenSea 允許在原有listing 不取消的情況下,再次發起listing(目前該問題已經修復)。這時雖然OpenSea UI 上已經看不到賣家舊的報價,但其實舊的listing 依然存在並有效。攻擊者可以在https://orders.rarible.com 中查詢到舊的listing。由於OpenSea 的listing 並沒有交易Nonce 機制,舊的listing 依然是有效的。攻擊者可以通過舊的listing 直接購買NFT,並以新的價格售出。由於NFT 有劇烈的價格波動,通過這種方式可以實現巨額套利。

https://etherscan.io/token/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d?a=9991#inventory 就是一例子:1 月24日BAYC 的NFT 在OpenSea 上先以0.77 ETH 買入,又以84.2 ETH 賣出。

Cobo Comment

普通用戶建議登錄https://orders.rarible.com 查詢自己是否有舊的listing,並立刻進行取消處理。更穩妥安全的方式是直接將NFT 轉移到新地址上。

Reference

https://twitter.com/PeckShieldAlert/status/1485547426467364864

https://twitter.com/yakirrotem/status/1485559864948629512

Metamask 洩露個人IP 漏洞

@alxlpsc 在medium 上披露稱Metamask 存在嚴重的隱私洩露問題。漏洞主要是利用了MetaMask 自動加載NFT 圖片URL。基本的攻擊思路:攻擊者在可以將NFT 的URI 設置成自己可控的服務器網址,並將NFT transfer 給目標賬戶;當用戶登錄Metamask 時,Metamask 會自動掃描賬戶上所擁有的NFT,並發起指向攻擊者服務器的HTTP 請求;攻擊者則可以從訪問日誌中得到受害者的IP 信息。

Cobo Comment

區塊鏈的匿名性主要來自鏈上地址與鏈下身份的剝離。如果能夠通過鏈上的地址確認鏈下身份,在區塊鏈場景下確實是比較嚴重的危害。在傳統安全中洩露主機IP 通常不被認為是特別嚴重的問題(畢竟一條釣魚短信或者郵件就可能做到),但在主張匿名性的區塊鏈世界,隱私的重要程度會再上一個台階。相信類似的,因安全場景不同而導致漏洞級別不同的情況,在區塊鏈這個相對較新的領域還會不斷出現。

Reference

https://medium.com/@alxlpsc/critical-privacy-vulnerability-getting-exposed-by-metamask-693c63c2ce94

wxBTRFLY 漏洞披露與修復

@immunefi 的白帽黑客發現了wxBTRFLY Token 合約中存在嚴重漏洞。合約中的transferFrom 函數沒有正確更新recipient 的授權,並且會錯誤更新msg.sender 的授權。

相關代碼如下:

 function transferFrom(address sender, address recipient, uint256 amount) public virtual override onlyAuthorisedOperators returns (bool) {  _transfer(sender, recipient, amount);  _approve(sender, msg.sender, allowance(sender, recipient ).sub(amount, "ERC20: transfer amount exceeds allowance"));  // 应该使用allowance(sender, **msg.sender**)  return true; }

漏洞本身雖然嚴重但成因並不復雜(更像是開發者筆誤產出的),比較有意思的是官方的修復方式。由於合約本身不支持升級,因此無法直接更新合約代碼;合約不支持暫停,因此也沒法用快照+ 遷移的方式轉移用戶資產。最終官方的措施是自己發動了攻擊交易,將所有受漏洞影響用戶的資產轉移到了一個多簽錢包中。待後面部署新Token 合約後會再行分配。

Cobo Comment

ERC20 Token 已經有比較成熟的代碼模板,wxBTRFLY 是在重寫transferFrom 時出現的問題。這個問題如果有完善的單元測試應該會很容易發現,項目方可能在開發過程中是缺少完善的測試流程。

Reference

https://discord.com/invite/rpkPDR7pVV

https://twitter.com/redactedcartel/status/1482497468713611266?s=20

https://etherscan.io/tx/0xf0e4ccb4f88716fa5182da280abdb9ea10ec1c61cfc5bbe87e10bdde07c229d6

Qubit 跨鏈橋被攻擊

1 月28 日,BSC 上的DeFi 平台Qubit Finance 的跨鏈橋QBridge 遭受攻擊,損失約8000 萬美金。

跨鏈橋一種常見的實現形式是在源鏈的合約中抵押資產,並emit event。由監聽節點捕捉event,向目標鏈的跨鏈橋合約發起調用,mint 等量的資產。來源鏈上只要有event 事件產生,跨鏈橋系統就會認為有跨鏈資產需要轉移。但如果源鏈上跨鏈橋合約代碼存在問題,就可能出現沒有資產抵押進跨鏈橋合約但仍emit event 的情況,產生漏洞,造成目標鏈Token 的錯誤增發。

QBridge 就存在這樣的問題。 QBridge 支持抵押ETH 和ERC20 Token 兩類資產。由於以太坊的ETH 作為native 代幣,與ERC20 Token 由兩套單獨的代碼處理。在源鏈抵押Token 時,會調用deposit 方法,在抵押時ETH 應該調用depositETH 方法。 QBridge 將零地址作為ETH 的標識。但是實現時沒有完善的校驗,導致合約處理ETH 時仍使用deposit 方法,相當於將ETH 當成了合約地址為零地址的Token 處理。在轉賬時使用transferFrom 則相當於是對零地址進行合約調用。而以太坊底層設計上,對EOA 地址發起合約調用會默認成功,不會revert。以上條件結合起來,最終的情況就是雖然攻擊者在源鏈沒有抵押任何資產,但仍可以在目標鏈上mint 出大量qXETH,實現獲利。

Cobo Comment

目前區塊鏈行業中多鏈並存,跨鏈橋已經是重要的基礎設施。跨鏈橋本身由於要進行鏈上鍊下配合,整體複雜度要比普通dapp 高上許多,因此更容易出現問題。同時跨鏈橋上通常會抵押大量的資產,如果可以非法轉移那麼獲利頗豐。各個跨鏈橋系統似乎成為了攻擊者們最近一兩月中的重點目標。

Reference

https://mp.weixin.qq.com/s/PLbuI9JFxyFRlDlj9rPvmQ

https://mp.weixin.qq.com/s/-kTsAs2WH5_4N4_3-XIxag

Cobo Labs 希望協助加密世界投資者規避風險、提高收益,為傳統金融機構、風險投資公司、通證基金、個人投資者、交易所、媒體等夥伴提供客觀、有深度的數據分析。

關於亞太最大的加密貨幣託管及資管平台Cobo:我們向機構提供領先的安全託管與企業資管業務;我們向全球高淨值合格投資人提供加密數字錢包業務和豐富靈活的定期與結構化產品,我們關注金融創新,並於2020年第三季度成立了第一家面向全球機構的基金產品「DeFi Pro」。