以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads

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

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 團隊開發的,可以精簡很多賬號驗證及跨合約調用邏輯。

加密KOL:Mango Markets攻擊者曾使用虛假KYC進行漏洞攻擊:12月29日消息,加密KOL@oilysirs披露,Mango Markets攻擊者Avraham Eisenberg曾使用虛假的烏克蘭女性的身份進行KYC,并以此進行Mango Markets的漏洞攻擊。

此外,Zhu Su也轉推表示,此前看好FTX的原因就在于,人們低估了FTX上虛假KYC的交易用戶占比,因為這些虛假KYC用戶根本沒有辦法進行索賠。[2022/12/29 22:14:00]

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

programs/jet/src/instructions/init_deposit_account.rs

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

zkSync在Code4rena平臺啟動漏洞賞金計劃:10月29日消息,以太坊Layer2擴容解決方案zkSync宣布在Code4rena平臺啟動漏洞賞金計劃,總獎金池達165,000美元。活動將于北京時間10月29日4時開啟,至11月10日4時結束,本次活動旨在提高網絡安全性,使zkSync2.0成為更多開發人員的選擇。[2022/10/29 11:55:24]

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

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

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

Kyber Network:攻擊媒介已被成功識別并刪除,此次攻擊源于一個前端漏洞:金色財經消息,鏈上流動性協議Kyber Network發文稱,攻擊媒介已被成功識別并刪除,Kyber Swap智能合約、聚合器和API一直是安全的,此次攻擊源于一個前端漏洞,與Kyber Network的智能合約無關。

昨日報道,Kyber Network表示攻擊者在9月6日前返還資金可獲得15%漏洞賞金,否則將采取下一步行動。[2022/9/6 13:12:02]

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

期權協議Primitive智能合約發現嚴重漏洞,被黑資金安全并將返還其所有者:官方消息,以太坊鏈上期權協議Primitive Finance智能合約中發現了一個嚴重漏洞。由于合約不可升級或暫停,因此官方選擇自己對智能合約進行黑客攻擊以保護用戶資金。被黑的資金是安全的。所有被黑的資金都將返還給它們的所有者。官方表示,對該漏洞的事后分析、為保護用戶資金而采取的行動的時間表,以及立即返回用戶資金的下一步措施都將很快出臺。[2021/2/22 17:38:37]

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

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

動態 | BTC核心開發人員承認曾匿名向BCH開發團隊披露漏洞:有消息稱,BTC核心開發者Cory Fields披露,今年4月份他發現了一個BCH漏洞,該漏洞破壞性巨大可阻礙BCH轉賬,之后他以匿名的方式向相關開發團隊披露該漏洞。之后該漏洞被修復且公布于眾,并未對BCH造成負面影響。Cory Fields稱,BTC未來最大的挑戰就是避免破壞性的軟件bug。在數字貨幣世界中,軟件bug的威脅被遠遠低估。[2018/8/10]

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:COUACCUNTCCOCool CousinBACCHuntercmccone

以太坊價格
金色Web3.0日報 | 派拉蒙影業公司將構建《星際迷航》NFT市場_NFT

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

1900/1/1 0:00:00
高于meme的Vibe Web3世界不可缺少的元素_VIBE

「你聽說過 Vibe 風嗎?」如果你是一位潮流圈的玩家,過去 2 年你可能聽過,甚至追隨過這個潮流.

1900/1/1 0:00:00
2022年預測:零知識證明(ZKP)成為 Web3 的關鍵_WEB

去年,零知識證明(ZKP)在加密領域和Web3中扮演了重要角色,它在可擴展性和用戶許可隱私方面都發揮著重要作用.

1900/1/1 0:00:00
a16z:「社區可組合性」能否幫助Web2用戶躍入Web3?_WEB

Web3 已經滲透到主流文化中,從帕麗斯·希爾頓(Paris Hiltion)在《今夜秀》上展示她的 NFT 到 ConstitutionDAO 試圖購買僅存的美國憲法副本之一.

1900/1/1 0:00:00
金色前哨|Axie Infinity計劃通過三個階段逐步實現去中心化_AXS

金色財經報道,3月25日消息,Axie?Infinity發文表示,由于仍面臨著大量從未解決的技術和社會治理挑戰,當下將財庫資金交由社區管理可能會對項目造成損害.

1900/1/1 0:00:00
解析 StepN:突然爆火的原因 經濟模型可持續嗎?未來發展方向是什么_STE

編輯前言:StepN 迅速在全球躥紅,引發行業的廣泛思考。它的成功離不開小眾賽道的選擇、用戶需求的滿足、團隊快速開發落地、模型與玩法上的思考、大量行業領袖的“自來水”、以及 Binance 的支.

1900/1/1 0:00:00
ads