加密貨幣交易所 加密貨幣交易所
Ctrl+D 加密貨幣交易所
ads
首頁 > AVAX > Info

漏洞隨筆:通過Jet Protocol任意提款漏洞淺談PDA與Anchor賬號驗證_ACC:Meta Course

Author:

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

據 Jet Protocol 官方博客披露,他們近期修復了一個賞金漏洞,這個漏洞會導致惡意用戶可以提取任意用戶的存款資金,慢霧安全團隊對此漏洞進行了簡要分析,并將分析結果分享如下。

(來源:https://www.jetprotocol.io/posts/jet-bug-disclosure)

相關信息

Jet Protocol 是運行在 Solana 上的一個借貸市場,用戶可將賬號里的代幣(如:USDC、SOL)存入金庫,賺取年化收益,同時也可以按一定的比例借出另一種代幣。在這個過程中合約會給用戶一個 note 憑證,作為用戶未來的提款憑證,用我們熟悉的字眼來說就是 LP,而本次漏洞發生的原因也和這個 LP 的設計有關。

我們知道和以太坊合約相比,Solana 合約沒有狀態的概念,取而代之的是賬號機制,合約數據都存儲在相關聯的賬號中,這種機制極大提升了 Solana 的區塊鏈性能,但也給合約編寫帶來了一些困難,最大的困難就是需要對輸入的賬號進行全面的驗證。Jet Protocol 在開發時使用了 Anchor 框架進行開發,Anchor 是由 Solana 上的知名項目 Serum 團隊開發的,可以精簡很多賬號驗證及跨合約調用邏輯。

7月份與黑客和漏洞相關的DeFi損失達3.8982億美元:金色財經報道,據Rekt數據庫報告稱,7 月份與黑客和漏洞相關的 DeFi 損失達 3.8982 億美元,使所有損失的累計總價值突破 770 億美元。

以太坊成為最受攻擊的目標,在 36 起事件中損失了 3.5 億美元。然而,據 De.Fi 分析,由于訪問控制漏洞,Multichain遭受了最嚴重的單案損失,達 2.31 億美元。[2023/8/8 21:31:47]

Anchor 是如何工作的呢?我們可以從 Jet Protocol 的一段代碼說起:

programs/jet/src/instructions/init_deposit_account.rs

這里的 deposit_account 賬號就是用于存儲 LP 代幣數據的賬號,用戶在首次使用時,需要調用合約生成該賬號,并支付一定的存儲費用。

OpenSea向兩名發現漏洞的白帽黑客各獎勵10萬美元賞金:9月28日消息,OpenSea 已向兩名發現漏洞的白帽黑客獎勵 20 萬美元賞金。其中一人是安全公司 Zellic 的安全專家兼首席營銷官 Corben Leo,其通過漏洞賞金平臺 HackerOne 發現了一個關鍵的 OpenSea 漏洞,并表示該漏洞可能會被利用以盜取資產;另一名白帽黑客名為 Nix,未透漏有關漏洞的信息。兩人各獲得了 10 萬美元的賞金獎勵。OpenSea 發言人證實了賞金的真實性并表示已經發布了針對漏洞的補丁。(The Block)[2022/9/28 22:37:27]

而這里的 #[account] 宏定義限定了這個賬號的生成規則:

規則 1:#[account(init, payer = <target_account>, space = <num_bytes>)]這個約束中,init 是指通過跨合約調用系統合約創建賬號并初始化,payer=depositor 意思是 depositor 為新賬號支付存儲空間費用。

MDEX開啟漏洞賞金計劃 獎勵最高60000刀:據MDEX官方消息,隨著MDEX的功能逐漸完善,支持的區塊鏈底層也由初始的HECO增加拓展BSC、ETH以及未來將會支持更多的底層資產加入到MDEX生態中來。為了MDEX的生態穩健成長以及在成長的路上持續保障用戶的資產安全、交易安全,MDEX現推出漏洞賞金計劃,嚴重漏洞最高獎勵 60000USDT。漏洞賞金計劃具體詳情可查看官方消息。[2021/6/18 23:47:49]

規則 2:#[account(seeds = <seeds>, bump)]這個約束中將檢查給定帳戶是否是當前執行程序派生的 PDA,PDA (Program Derived Address) 賬號是一個沒有私鑰、由程序派生的賬號,seed 和 bump 是生成種子,如果 bump 未提供,則 Anchor 框架默認使用 canonical bump,可以理解成自動賦予一個確定性的值。

使用 PDA,程序可以以編程方式對某些地址進行簽名,而無需私鑰。同時,PDA 確保沒有外部用戶也可以為同一地址生成有效簽名。這些地址是跨程序調用的基礎,它允許 Solana 應用程序相互組合。這里用的是 "deposits" 字符 + reserve 賬號公鑰 + depositor 賬號公鑰作為 seeds,bump 則是在用戶調用時傳入。

RunMiner挖礦木馬團伙使用新增漏洞武器攻擊云主機挖礦:騰訊安全云防火墻檢測到RunMiner挖礦木馬團伙使用新增漏洞武器攻擊云主機挖礦:利用weblogic反序列化漏洞(CVE-2017-10271)對云主機發起攻擊,攻擊得手后,會下載、執行惡意腳本嘗試對Linux、Windows雙平臺植入挖礦木馬,進行門羅幣挖礦操作。

RunMiner挖礦木馬挖礦前會嘗試卸載云主機安裝的防護軟件,并嘗試結束其他占系統資源較高的進程,以清除可能存在的挖礦木馬競爭對手。RunMiner挖礦木馬團伙的攻擊活動會嚴重影響云主機性能,干擾政企機構正常業務運行。(騰訊安全威脅情報中心)[2021/1/19 16:32:14]

規則 3:#[account(token::mint = <target_account>, token::authority = <target_account>)]

這是一個 SPL 約束,用于更簡便地驗證 SPL 賬號。這里指定 deposit_account 賬號是一個 token 賬號,它的 mint 權限是 deposit_note_mint 賬號,authority 權限是 market_authority。

動態 | Blockstream工程師公布閃電網絡漏洞全部細節:閃電網絡上個月底被發現安全漏洞。近日,開發了閃電網絡大部分協議的Blockstream工程師Rusty Russell公布了該漏洞的全部細節。根據披露,該漏洞正在創建和資助閃電網絡渠道。創建通道后,不需要通道的接收者來驗證資金交易輸出。由于閃電網絡協議不需要這種驗證,攻擊者可以聲稱打開了一個通道,但不向對等方支付,或者不支付全部金額。這使得攻擊者可以在不警告受害者的情況下,將資金花在與受害者一起創建的通道中。只有當受害者關閉與攻擊者的通道時,他們才會注意到通道之間提交的任何事務都是無效的。盡管閃電網絡開發人員已推送更新,但較舊的版本仍會受到影響,因此建議用戶升級。(The Block)[2019/9/28]

Account 的宏定義還有很多,這里略表不提,詳細可以考慮文檔:https://docs.rs/anchor-lang/latest/anchor_lang/derive.Accounts.html

有了這些前置知識,我們就可以直接來看漏洞代碼:

programs/jet/src/instructions/withdraw_tokens.rs

正常情況下,用戶調用函數 withdraw_tokens 提幣時,會傳入自己的 LP 賬號,然后合約會銷毀他的 LP 并返還相應數量的代幣。但這里我們可以看到 deposit_note_account 賬號是沒有進行任何約束的,用戶可以隨意傳入其他用戶的 LP 賬號。難道使用別人的 LP 賬號不需要他們的簽名授權嗎?

通過前面分析宏定義代碼,我們已經知道了 market_authority 賬號擁有 LP 代幣的操作權限,確實不需要用戶自己的簽名。那么 market_authority 又是一個怎么樣的賬號呢?我們可以看這里:

programs/jet/src/instructions/init_market.rs

這個 market_authority 也是一個 PDA 賬號。也就是說合約通過自身的調用就可以銷毀用戶的 LP 代幣。那么對于惡意用戶來說,要發起攻擊就很簡單了,只要簡單地把 deposit_note_account 賬號設置為想要竊取的目標賬號,withdraw_account 賬號設置為自己的收款賬號,就可以銷毀他的 LP,并把他的存款本金提現到自己的賬號上。

最后我們看一下官方的修復方法:

補丁中并未直接去約束 deposit_note_account 賬號,而是去除了 burn 操作的 PDA 簽名,并將 authority 權限改成了 depositor,這樣的話用戶將無法直接調用這里的函數進行提現,而是要通過另一個函數 withdraw() 去間接調用,而在 withdraw() 函數中賬號宏定義已經進行了嚴密的校驗,惡意用戶如果傳入的是他人的 LP 賬號,將無法通過宏規則的驗證,將無法通過宏規則的驗證,因為 depositor 需要滿足 signer 簽名校驗,無法偽造成他人的賬號。

programs/jet/src/instructions/withdraw.rs

總結

本次漏洞的發現過程比較有戲劇性,漏洞的發現人 @charlieyouai 在他的個人推特上分享了漏洞發現的心路歷程,當時他發現 burn 的權限是 market_authority,用戶無法進行簽名,認為這是一個 bug,會導致調用失敗且用戶無法提款,于是給官方提交了一個賞金漏洞,然后就去吃飯睡覺打豆豆了。

而后官方開發者意識到了問題的嚴重性,嚴格地說,他們知道這段代碼沒有無法提現的漏洞,而是人人都可以提現啊,老鐵,一個能良好運行的 bug 你知道意味著什么嗎?!所幸的是沒有攻擊事件發生。

目前在 Solana 上發生過多起黑客攻擊事件均與賬號校驗問題有關,慢霧安全團隊提醒廣大 Solana 開發者,注意對賬號體系進行嚴密的審查。

Tags:ACCCCOCOUUNTACCE幣musiccoinMeta CourseUNT幣

AVAX
金色觀察|Cosmos將實施的Theta升級重要在哪里?_區塊鏈:SHIBCAKE

金色財經報道,4 月 5 日,Juno Network 開發貢獻者 dimi 發推表示,Cosmos Hub 將在接下來一周內激活 Theta 升級.

1900/1/1 0:00:00
人是Web3平臺的最終進化_WEB:ATM

在Web3中,平臺通過成為協議而成功——這意味著人們通過成為平臺而成功。可能不再有三個詞的畏縮組合,但是——上帝保佑我們——扎克是對的:“ 我已經談了很多我認為我們應該以人為中心而不是應用程序來.

1900/1/1 0:00:00
金色Web3.0日報 | Axie Infinity將Origin版本發布時間推遲一周_NFT:NFTM

1.DeFi代幣總市值:1447.33億美元 DeFi總市值 數據來源:coingecko2.過去24小時去中心化交易所的交易量:51.

1900/1/1 0:00:00
出資500萬美元“綠化”比特幣 Ripple聯合創始人為何激起社區抗議?_比特幣:SEN

周二,Ripple 的聯合創始人Chris Larsen發起了一場改變比特幣代碼的運動,呼吁減少比特幣對環境的影響,這在加密界引起了極大爭議.

1900/1/1 0:00:00
區塊鏈率先鄉村振興 日本老齡化和少子化迎來轉機?_區塊鏈:區塊鏈工程專業學什么及就業方向

日本的山越村有超過千年的歷史,也是錦鯉的發源地之一,但是時代發展之下只剩八百人的規模。為了實現“鄉村振興”,居民議會主動擁抱web3并引入DAO的方式進行治理.

1900/1/1 0:00:00
為什么每個人都對 Web3 如此困惑_WEB:WOOD

在過去的6個月里,各種各樣的媒體都在努力為“Web3是什么”這個問題提供答案。與此同時,“Web3”受到了強烈的質疑,這些聲音主要來自對加密貨幣整體持根本懷疑態度的人.

1900/1/1 0:00:00
ads