比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > 幣贏 > Info

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

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

消息人士:Coinbase曾因漏洞導致數百名交易員獲得百倍利潤:9月2日消息,消息人士透露,8月下旬,因Coinbase平臺上以格魯吉亞拉里 (GEL) 計價的加密貨幣交易對的錯誤匯率,約900名美國佐治亞州交易員利用該漏洞獲得百倍利潤,而Coinbase正尋求從銀行賬戶追回這些資金。Coinbase發言人稱,小數點錯位問題是由于第三方技術所致。報道稱,Coinbase的損失在1400萬美元到1.4億美元之間,盡管Coinbase駁斥了這一說法。

這些交易員從Coinbase提取相關資金后不久,他們收到了金融機構的通知,告知他們的銀行賬戶和相關的Visa借記卡已被凍結。一位知情人士稱,據說至少有兩家國內銀行參與了凍結資金的行動,盡管并非按照Coinbase的指示。(Blockworks)[2022/9/2 13:04:45]

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

programs/jet/src/instructions/init_deposit_account.rs

Rari Capital:Fuse池所有可借用資產都可能被盜,目前漏洞已修復:4月4日消息,DeFi借貸協議Rari Capital核心貢獻者@Jack Longarzo近日披露一起安全漏洞事件,此前在3月3日下午4:30左右,包括@samczsun、@hritzdorf等安全研究人員發現了一個跨多個Fuse池的漏洞,池0至32(池6除外)處于危險之中,管理員多簽錢包立即暫停了所有Fuse池的借貸。

據介紹,該漏洞存在于舊版本的cToken和comptroller實施中,它允許在cEther贖回時進行跨資產重入,其中脆弱池中的所有資產都可以免費借入。這是因為在ETH轉移之前,cEther狀態尚未完全更新為贖回的影響。結果,所有可借用資產都可能從這些池中被盜。對此,該項目表示每個Fuseatrisk池都很快升級到最新的cToken和Comptroller實施,從而防止此或類似的重入漏洞被利用。所有池都經過重新測試,以確認漏洞已得到修復,并在第二天早上重新啟用借貸。(Medium)[2022/4/4 14:03:14]

比特幣工程師再次發現巨大的區塊鏈漏洞:比特幣工程師Braydon Fuller和Javed Khan于2018年在比特幣區塊鏈上修復了名為INVDoS的漏洞,本周又發表了一份研究論文,詳細介紹了他們如何在其他多個區塊鏈迭代中發現Btcd和Decred。該漏洞的攻擊工作方式是:一個敵對的區塊鏈節點(驗證交易的區塊鏈網絡的成員)通過向不存在的交易發出垃圾郵件來淹沒另一個。該漏洞被稱為“拒絕服務”攻擊,可被黑客“輕松利用”,并可用于使整個比特幣節點網絡崩潰。報告稱,這可能導致處理交易的延誤,進而導致“資金或收入的損失”。(decrypt)[2020/9/14]

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

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

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

動態 | Zcash 2.0.7-3版本重新發布以糾正漏洞:Zcash開發公司ECC重新發布了Zcash 2.0.7-3版本。該公司此前已發布相同版本,但曾被指出存在兩個漏洞:Reject和Ping。Zcash的最新可用版本旨在解決這些漏洞。此前據9月29日報道,Komodo (KMD)的核心開發者Duke Leto稱,Zcash存在一個漏洞,可以顯示被屏蔽的完整節點的IP地址。(ambcrypto)[2019/10/4]

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

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

動態 | 8 月共發生 12 起較典型的安全事件,假充值漏洞給交易所造成巨大損失:據 SlowMist Hacked 統計,8 月共發生 12 起較典型的安全事件,累計造成近千萬美元損失。慢霧區塊鏈威脅情報(BTI)系統監測發現,多家交易所遭受假充值漏洞攻擊,使用的攻擊手法有:USDT(Omni)假充值漏洞、ERC20 Token 假充值漏洞、EOS 假充值漏洞、XRP 假充值漏洞以及門羅幣(XMR)轉賬鎖定漏洞,給交易所造成巨大損失。同時慢霧 BTI 系統也發出預警,近期針對交易所的 APT(Advanced Persistent Threat)攻擊也愈演愈烈,慢霧安全團隊在此提醒各交易所,提前做好安全漏洞自查,進一步增強人員安全意識及平臺風控體系,必要時可聯系專業的區塊鏈安全公司尋求幫助,避免遭受損失。[2019/9/1]

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

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

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:COUACCCCOUNTCOURSE價格FACCtauccoinHunter

幣贏
Web 3音樂 對傳統音樂產業鏈的實驗性革新_WEB

一、傳統音樂市場概況 1. 傳統音樂市場正在經歷消逝和新生在過去的20年中整個音樂市場規模可以用消逝和新生來形容.

1900/1/1 0:00:00
區塊鏈邁向普及應用的挑戰 詳解Layer1、側鏈及Layer2擴展方案的發展與挑戰_ROL

截至2021年底,以太坊(Ethereum)已經發展到支持成千上萬個應用,包括去中心化金融(DeFi)、NFT、游戲……等,整個網路每年結算數兆美元的交易,平臺上鎖定的資金超過1700億美元.

1900/1/1 0:00:00
DAO 生態系統概述:工作方式、部署框架_LOC

從叢林法則到人類法則,人類是依賴并需要合作才能生存和繁榮的社會動物。因此,我們始終將自己組織成部落、團體、團隊、委員會、公司和其他形式的集體行動,以發展、學習、適應、協調和執行我們的更高愿景,在.

1900/1/1 0:00:00
從傳統投資到加密市場DeFi掘金 投資者們的正確方式_DAO

1956 年,時年二十六歲的沃倫·巴菲特成立了一家投資合伙企業,以收購中小企業和入股大型企業。1965 年,該合伙企業獲得了伯克希爾哈撒韋股份有限公司 (Berkshire Hathaway I.

1900/1/1 0:00:00
聲譽代幣 Web3 世界的社交名片?_QUO

重新思考一個問題:在以社區為本的去中心化元宇宙中,我們應如何更好地建立聲譽機制、認同機制和獎賞機制.

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

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

1900/1/1 0:00:00
ads