比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads

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

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

DefiLlama創始人:Foundation存在合約漏洞:6月21日消息,DefiLlama創始人0xngmi發推表示,NFT市場Foundation的NFT合約有一個漏洞,可以讓基金會團隊銷毀幾乎所有在其平臺上鑄造的NFT。Foundation的集合合約使用轉發代理模式來節省部署的Gas,這意味著所有集合調用一個單一的合約來使用它的代碼不是問題,并且基金會的集合有一個功能,允許創建者在沒有NFT的情況下銷毀它,目前基金會團隊的合約所有權由6個中的2個多重簽名持有。[2023/6/21 21:51:45]

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

programs/jet/src/instructions/init_deposit_account.rs

朝鮮黑客組織利用 Chrome 0day 漏洞攻擊加密貨幣等機構:金色財經報道,谷歌研究人員發現有 2 個朝鮮黑客組織利用了 Chrome 瀏覽器中的一個遠程代碼執行 0 day 漏洞超過 1 月,用于攻擊新聞媒體、IT 公司、加密貨幣和金融科技機構。Operation AppleJeus 利用同一個漏洞利用套件攻擊了加密貨幣和金融科技行業的 85 個用戶,并成功入侵了至少 2 個金融科技公司網站,并植入了隱藏的 iframe。研究人員還發現攻擊者搭建了一些偽造的網站來傳播木馬化的加密貨幣應用,隱藏了 iframe 并將訪問者指向漏洞利用套件。[2022/3/28 14:22:12]

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

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

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

Kraken的加密貨幣托管提供商Etana報告數據安全漏洞:金色財經報道,Kraken交易所的加密貨幣托管服務提供商Etana Custody報告了數據安全漏洞。Etana表示,該漏洞發生在4月18日,導致未經授權的外部用戶訪問其客戶端用戶界面。該公司稱,客戶資金沒有受到影響,但是入侵者可能已經獲取了一些信息。Kraken的發言人表示,其客戶資金是安全的,將很快直接與客戶溝通。[2020/4/25]

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

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

動態 | IOTA 主網因 bug 出現宕機,相關漏洞現已修復:公鏈 IOTA 主網在數小時前忽然出現共識分裂而無法更新的情況,TPS 一度接近 0。目前該漏洞已經修復。根據官方公告,該漏洞的具體情況為:在極端情況下,IRI(IOTA 主網客戶端名稱)沒有考慮兩個不同 bundle 之間共享的交易。一旦在一個 bundle 將某個交易標記為「已計數」,下一個 bundle 就會將其忽略,這一 bug 導致了賬本狀態的損壞。目前,該漏洞已經得到修復。相關客戶端版本和漏洞說明已經在 Github 更新。(區塊律動)[2019/12/30]

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

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

獨家 | 數據顯示眾籌項目Enhanced Society存在多處智能合約安全漏洞:區塊鏈項目評級機構RatingToken最新數據顯示,2018年7月23日全球共新增5328個合約地址,其中351個為代幣型智能合約。在RatingToken發布的最新“新增代幣型智能合約風險榜”中,位于排行榜第三名的Enhanced Society雖致力于解決信息的真實性問題,通過以太坊密鑰對用戶發布的信息進行簽名,信息的發布日期、內容和標題也包含在簽名哈希中以確保信息的不可篡改,但合約本身漏洞較多,RatingToken安全團隊已檢測到12個安全漏洞,存在整數溢出漏洞及資金被盜風險,能否保障用戶信息安全還有待考證;風險榜TOP10的還包括EvaUSD、TBB、500m、Kreos、OTCC、TEA和Safe Pay Wallet,皆為代幣型合約,且合約代碼均相同;此外,TOP 100的危險合約中有44個為Fomo 3D山寨合約,創建24小時內交易數達1865筆,涉及資金超過190ETH,可見龐氏騙局游戲熱度不減,投資人仍需警惕,更多詳情請查看原文鏈接。[2018/7/24]

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:COUCCOUNTACCCool CousinCrypticCoinSuntonSPACC

幣安app官網下載
PICO:晚間必讀5篇 | Pico狂奔:字節元宇宙按下快進鍵

1.SEC新提案重新定義“dealer” 或波及DeFi美國證券交易委員會于3月28日提出了一項新的擬議規則,旨在使更多的交易公司注冊為交易商,并公開他們的賬簿以接受更嚴格的監管.

1900/1/1 0:00:00
DAO:DAO的紀元已經開啟

DAO是什么? 不知道是正常的, 這是一個時髦且極具理想主義和浪漫主義的詞。值得每一個對理想有追求的人去了解.

1900/1/1 0:00:00
DRAG:對話 Dragonfly 合伙人:如何成為優秀的Web3 VC?

以下為GuildFi分析師 Cloud 針對Bankless播客《How to be a Web3 VC with Haseeb Qureshi 》所做播客筆記.

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

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

1900/1/1 0:00:00
區塊鏈:北京上海深圳都在建設:獨家專訪解密“數據交易所”

在2月28日的國新辦發布會上,工信部總工程師、新聞發言人田玉龍透露,要積極培育數據要素市場,支持北京、上海建設數據交易所。京滬兩地的數據交易所已經在2021年相繼成立.

1900/1/1 0:00:00
NFT:2小時血賺10000+ 微信、支付寶出手治理NFT炒作亂象

當NFT在國內被稱為“數字收藏品”之日起,新的炒作風氣就正在形成。當下,國內的這陣炒作惡風,有愈演愈烈的勢頭.

1900/1/1 0:00:00
ads