比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads
首頁 > 以太坊 > Info

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

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

Mango Labs 起訴攻擊者 Avraham Eisenberg,要求歸還 4700 萬美元漏洞賞金:1月26日消息,Mango Labs LLC 于曼哈頓正式起訴攻擊者 Avraham Eisenberg,要求其歸還此前賠償提案中保留的 4700 萬美元漏洞賞金。

此前報道,Solana 生態 DeFi 平臺 Mango 于 2022 年 10 月遭遇黑客攻擊,黑客 Avraham Eisenberg 通過非法操縱抵押品 Token 價格在 20 分鐘內獲利 1.14 億美元。此后 Mango 社區投票通過關于償還壞賬的新提案(Repay Bad Debt #2),允許 Avraham Eisenberg 保留 4700 萬美元作為漏洞賞金,其余 6700 萬美元被盜 Token 歸還 Mango Labs,且 Mango Markets 不會對此案提出刑事訴訟。[2023/1/26 11:31:00]

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

以太坊客戶端Geth發布1.10.8版本以修復倫敦升級之前的漏洞:8月24日消息,以太坊客戶端Geth發布修補EVM漏洞的v1.10.8版本,具體的漏洞細節將晚些時候公開,從而給節點方和相關項目方時間來更新它們的節點和軟件以避免攻擊。同時由于此漏洞在倫敦升級之前即已存在,因此所有支持倫敦硬分叉的Geth版本都易受到攻擊 ,應該馬上更新。

該漏洞由在Sentnl工作的荷蘭開發者Guido Vranken于審計智能合約平臺Telos的Telos EVM時發現,并提交了報告。[2021/8/24 22:34:12]

programs/jet/src/instructions/init_deposit_account.rs

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

Mesh Finance在Immunefi推出最高5萬美元的漏洞賞金計劃:據官方消息,由社區驅動的DeFi項目Mesh Finance在智能合約漏洞賞金平臺Immunefi推出最高5萬美元的漏洞賞金計劃,具體賞金金額將根據Immunefi制定的漏洞嚴重程度分類來進行分配,智能合約和區塊鏈漏洞等級被分為嚴重高風險、高危、中等、低等、無威脅五個等級,其中最高級別漏洞獎勵高達5萬美元。[2021/4/22 20:48:07]

而這里的 #[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,可以理解成自動賦予一個確定性的值。

安全研究人員披露Ledger簽名安全漏洞 漏洞或導致用戶資金被盜:安全研究人員Monokh撰文披露加密貨幣錢包Ledger硬件錢包存在的安全漏洞。Monokh指出,該漏洞可能導致用戶資金被盜。Ledger會在除比特幣之外的應用程序上公開比特幣(主網)密鑰和簽名信息,會提供誤導性的交易確認請求。以比特幣和萊特幣應用程序為例,漏洞攻擊路徑為:1.打開萊特幣應用程序;2.獲取比特幣隔離見證地址;3.根據地址查看UTXOs;4.發起比特幣交易并發送給Ledger設備要求簽名;5.得到有效的已簽名比特幣交易信息。Ledger本應在上述第二、第四步驟中識別錯誤并對其進行阻止,但仍然提示用戶進行交易。所有固件版本和App版本均受到此漏洞影響。Monokh建議Ledger在實時應用程序目錄上禁用山寨幣(Altcoin)應用程序,直至發布修補程序。根據漏洞披露進程表,2019年1月份,Monokh最初于2019年1月份向Ledger披露與隱私相關的安全漏洞,隨后,Ledger更新了固件但未對應用程序進行更新,并表示在更新應用程序后將立即公開漏洞。2019年4月份,Monokh再次聯系Ledger要求更新應用程序,但未得到反饋。今年5月份,Monokh將該漏洞的根本原因在簽名功能方面,這可能會導致用戶資金被盜。此后,Ledger稱正在調查該漏洞。之后Monokh多次聯系Ledger并要求披露漏洞并對其進行修復,但未得到回應,Ledger也沒有修復或披露相關漏洞。[2020/8/5]

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

動態 | 新西蘭加密貨幣交易所Cryptopia再次出現安全漏洞 被盜1675個以太坊:據ETHNews消息,區塊鏈分析平臺Elementus發布報告稱,新西蘭加密貨幣交易所Cryptopia再次出現漏洞。根據這份報告,1月28日,黑客攻擊又鎖定了1.7萬個Cryptopia用戶的錢包,盜取了1675個以太坊(截至發稿時價值約17.6萬美元)。Elementus的報告指出,在此次被盜的1.7萬個錢包中,5000多個錢包此前的攻擊中已被盜取所有ETH。事實上,在本次攻擊中,黑客將攻擊礦池得到的ETH發送給這些錢包,再將這些錢包中的ETH盜走。由于偷來的資金與最初的黑客相關的錢包相同,Elementus認為此次攻擊者和先前的黑客為同一人。此前消息,1月15日,新西蘭加密交易所Cryptopia宣布其遭遇嚴重安全漏洞,并造成重大損失,也介入調查。[2019/1/30]

規則 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:ACCCOUCCOUNTSPACC幣COURT幣giccoinBHUNT

以太坊
以太坊:以太坊合并:運行主導性客戶端?風險自擔_比特幣以太坊再現斷崖式暴跌原因

特別感謝 Vitalik Buterin, Hsiao-Wei Wang 和 Caspar Schwarz-Schilling 的反饋和評論.

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

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

1900/1/1 0:00:00
CHE:ChelseaDAO的創立是否意味著體育行業開始去中心化?_NFT

本文由”老雅痞laoyapicom“授權轉載 3月18日,據知名切爾西新聞報道賬號ChelsTransferb報道,部分切爾西球迷已經組成團體ChelseaDAO.

1900/1/1 0:00:00
區塊鏈:貴州經偵:警惕虛擬貨幣“挖礦”活動衍生刑事風險_數字貨幣

近年來,幣圈“造富神話”讓虛擬貨幣走進更多人視野,也讓眾多玩家對虛擬貨幣交易的前置環節“挖礦”趨之若騖.

1900/1/1 0:00:00
WEB:走出大廠 All in Web3_BTC

面對三月上旬中概股史無前例的一瀉千里,縱是財大氣粗的互聯網大廠也坐不住了,Web2大廠頻繁傳出裁員消息.

1900/1/1 0:00:00
WEB:金色觀察|什么是web3社交網絡的最簡版設計?_DEG

Web3世界是很多互聯網人期待的世界,那讓我們能確實感受到web3的應用有什么呢?以web3的原則“用戶控制數據”統計,如今公鏈上的應用都是web3,但除了Mirror、ENS這一類應用之外.

1900/1/1 0:00:00
ads