By:Johan@慢霧安全團隊
據JetProtocol官方博客披露,他們近期修復了一個賞金漏洞,這個漏洞會導致惡意用戶可以提取任意用戶的存款資金,慢霧安全團隊對此漏洞進行了簡要分析,并將分析結果分享如下。
相關信息
JetProtocol是運行在Solana上的一個借貸市場,用戶可將賬號里的代幣存入金庫,賺取年化收益,同時也可以按一定的比例借出另一種代幣。在這個過程中合約會給用戶一個note憑證,作為用戶未來的提款憑證,用我們熟悉的字眼來說就是LP,而本次漏洞發生的原因也和這個LP的設計有關。
我們知道和以太坊合約相比,Solana合約沒有狀態的概念,取而代之的是賬號機制,合約數據都存儲在相關聯的賬號中,這種機制極大提升了Solana的區塊鏈性能,但也給合約編寫帶來了一些困難,最大的困難就是需要對輸入的賬號進行全面的驗證。JetProtocol在開發時使用了Anchor框架進行開發,Anchor是由Solana上的知名項目Serum團隊開發的,可以精簡很多賬號驗證及跨合約調用邏輯。
FalconX CEO:受FTX崩盤事件影響,需重建投資人對其信任:11月23日消息,FalconX CEO及聯創Raghu Yarlagadda在接受彭博社采訪時表示,FalconX對Alameda沒有風險敞口,在FTX有一定風險敞口,但他拒絕透露具體金額。“相較于FalconX的資產負債表,FalconX在FTX的風險敞口是完全可控的。”他還表示,受FTX崩盤事件影響,FalconX并沒有失去用戶對其的信任,但需要重建投資人對其的信任。
此前The Block新聞總監Frank Chaparro在個人社交媒體發文表示,據消息人士稱,FalconX是FTX破產事件中最大的債權人。[2022/11/23 8:00:25]
Anchor是如何工作的呢?我們可以從JetProtocol的一段代碼說起:
跨鏈互操作性協議Multichain已集成至Aptos主網:據官方公告,跨鏈互操作性協議Multichain已集成至Aptos主網,支持USDT、USDC、WBTC、ETH和DAI五種資產從Multichain已支持的15種區塊鏈網絡跨鏈至Aptos。[2022/11/4 12:17:36]
programs/jet/src/instructions/init_deposit_account.rs
這里的deposit_account賬號就是用于存儲LP代幣數據的賬號,用戶在首次使用時,需要調用合約生成該賬號,并支付一定的存儲費用。
而這里的?#?宏定義限定了這個賬號的生成規則:
規則1:#
紐約梅隆銀行獲監管機構批準,將為客戶持有加密貨幣資產:10月11日消息,約梅隆銀行表示已獲得監管機構批準,將開始為客戶持有加密貨幣資產,成為美國首家在同一平臺上保護數字資產和傳統投資的大型銀行。(華爾街日報)[2022/10/11 10:31:21]
這個約束中,init是指通過跨合約調用系統合約創建賬號并初始化,payer=depositor意思是depositor為新賬號支付存儲空間費用。
規則2:#
這個約束中將檢查給定帳戶是否是當前執行程序派生的PDA,PDA(ProgramDerivedAddress)?賬號是一個沒有私鑰、由程序派生的賬號,seed和bump是生成種子,如果bump未提供,則Anchor框架默認使用canonicalbump,可以理解成自動賦予一個確定性的值。
緬甸民族團結政府希望利用被凍結的國家儲備發行CBDC:金色財經消息,緬甸民族團結政府計劃和財政部長Tin Tun Naing表示,正在考慮利用該國被凍結的國家儲備作為發行央行數字貨幣(CBDC)的資產支持。
據悉,Naing提到的資金已被紐約聯邦儲備銀行凍結在新加坡、泰國和日本的賬戶上,金額可能達到數十億美元。(Cointelegraph)[2022/9/6 13:12:05]
使用PDA,程序可以以編程方式對某些地址進行簽名,而無需私鑰。同時,PDA確保沒有外部用戶也可以為同一地址生成有效簽名。這些地址是跨程序調用的基礎,它允許Solana應用程序相互組合。這里用的是"deposits"字符+?reserve?賬號公鑰+?depositor?賬號公鑰作為?seeds,bump?則是在用戶調用時傳入。
前TheBlock研究員提出改善Uniswap并為UNI賦能的方案:7月6日消息,前TheBlock研究員Mika Honkasalo提出了一套改善Uniswap使其進一步去中心化,減少對UniswapLabs的依賴同時為UNIToken賦能的方案。該方案大致分為四個步驟,即:收入調整實驗、建立公認的代表計劃、在UniswapLabs之外組建團隊和制定開發路線圖。
收入調整實驗是指Uniswap擁有一個交易費用開關,可以打開給指定池10-25%的LP費用。交易費用收入可以收集到國庫或向UNI持有者分發,具體細節需要一份數據驅動的研究報告;建立公認的代表計劃,參考MakerDAO為其代表支付年薪的治理方案,鼓勵UNI持有者將投票權委托給更優秀的代表并給予薪水,以提高治理水準;在UniswapLabs之外組建團隊,引入更多的團隊建設Uniswap生態,UNI持有者將通過標準化流程對入職開發團隊和預算批準進行投票;制定開發路線圖,制定易于UNI持有者理解的項目發展路線圖和愿景,與UniswapLabs合作實現戰略協同,避免出現重復工作。[2022/7/6 1:54:17]
規則3:#
這是一個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開發者,注意對賬號體系進行嚴密的審查。
前言:致新世界 如果說兩年前的DeFi開啟了主流貨幣經濟學進入“Crypto”的序幕,則今天風靡全球的Web3正在迸發有關經濟學的思潮,圍繞著公共物品和產權.
1900/1/1 0:00:00什么是宇宙富豪Monopolon?小時候大家都玩過“大富翁”游戲——用一對骰子和一疊紙幣組成的單人棋盤游戲.
1900/1/1 0:00:00在電影《007:大戰皇家賭場》中,詹姆斯·邦德在沒有任何預約的情況下,僅僅出示了一張黑色的卡,巴哈馬高檔酒店服務生就主動帶他走進了上等套房.
1900/1/1 0:00:00撰文:PeterRizzo 編譯:Amber 在誕生以來的短短十余年間,科技偶像和頂級投資者的站臺以及幣價的表現為比特幣帶來了相當可觀的「信徒」.
1900/1/1 0:00:00撰文:GeorgiosKonstantopoulos,Paradigm研究合伙人 編譯:Amber 簡介 零知識密碼學是計算機科學領域在近50年間最引人注目的創新之一.
1900/1/1 0:00:00背景 2022年3月4日,a16z加碼去中心化Staking解決方案LidoFinance,投資7000萬美元.
1900/1/1 0:00:00