CPI中的風險: CPI Guard 與 Arbitrary CPI

更新於 發佈於 閱讀時間約 5 分鐘

CPI 全名叫做 Cross Program Invocation,它可以讓Solana的program直接呼叫另一個Program中的instruction,這個功能可以讓程式有更高的可組合性。可以把CPI想像成一個API在被呼叫的時候又去呼叫另外一個API。

圖示如下:

CPI Guard

在Token 2022中新增了一個extension叫做 CPI Guard,它的作用是預防某些濫用CPI的行為。聽起來有點抽象,那麼實際上是在預防什麼呢?


基本上當user使用dapp時有三種方法轉移user資產到dapp端:

  1. 在transaction中加入transfer instruction
  2. 在transaction中加入一個 approve instruction,隨後使用Program的授權進行CPI transfer
  3. 在transaction中加入一個不透明指令,在使用者授權之下進行CPI transfer

前兩種方式是安全的,user都會知道program想對他做什麼。

第一種相當於直接跟使用者說:“商品 10 元請付錢”; 第二種相當於我們去餐廳結帳時將信用卡給服務生,他們只能刷我們餐費的金額; 第三種方式是問題的所在,因為Program(dapp) 後面的CPI call是不透明的,使用者如果又對program進行授權,program將可以對user的token進行任意操作,相當於你將信用卡交給路人。

CPI Guard禁止了一系列跨program間instruction的呼叫來避免這類濫用發生。

Arbitrary CPI

雖與CPI Guard不同,但提到CPI濫用攻擊時這也是重要的一個安全性議題,在此一起討論。

可先參考這一篇了解Solana Account Model: SPL Token & Token Ext - Part 1: 簡介Account Model

在進行CPI呼叫的時候通常會傳入一個Program ID來代表目標地址,但我們無法確保這個地址的Program真的是我們想要使用的Program。這個呼叫可能被攻擊者導向其他惡意程式,產生未預期的執行結果。

以這個範例來說:

#[program]
pub mod arbitrary_cpi_insecure {
use super::*;

pub fn cpi(ctx: Context<Cpi>, amount: u64) -> ProgramResult {
solana_program::program::invoke(
&spl_token::instruction::transfer(
ctx.accounts.token_program.key,
ctx.accounts.source.key,
ctx.accounts.destination.key,
ctx.accounts.authority.key,
&[],
amount,
)?,
...
)
}
}
#[derive(Accounts)]
pub struct Cpi<'info> {
source: AccountInfo<'info>,
destination: AccountInfo<'info>,
authority: AccountInfo<'info>,
token_program: AccountInfo<'info>,
}

這個program的第六、七行用cpi呼叫了token program裡面的 transfer instruction

// transfer instruction​
pub fn transfer(
token_program_id: &Pubkey,
source_pubkey: &Pubkey,
destination_pubkey: &Pubkey,
authority_pubkey: &Pubkey,
signer_pubkeys: &[&Pubkey],
amount: u64,
)

但是我們無法保證第24行token_program的Account在傳入時真的是SPL Token的帳戶地址​。避免利用這個漏洞的攻擊發生開發者應該加一段針對地址正確性的檢查動作。

讀者可以在這一個commit中看到commiter新增了spl-token program id 檢查 -- 一個check_program_account() 函式來確保Program ID真的代表使用者預期呼叫的Program。


文中有任何的錯誤或想法歡迎在下方討論!

Reference

avatar-img
3會員
7內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ppe ha的沙龍 的其他內容
上一篇提到要在Solana上鑄造新的token需要使用到token program,功能較為陽春。隨著各種新需求的增加同時兼顧安全性的目的,一個新的token program - token 2022 (另名token extension)被開發出來,發佈在一個新的地址上。 Token 2022在
SPL 是 Solana Program Library的簡稱,是一個用來在Solana上創造fungible/non-fungible token的工具,內含多個Program Account。 有別於以往在Ethereum上,每當想創造新的token就需要寫一個智能合約,SPL有點像是API的
簡介如何使用Solana Pay API整合商店頁面進行支付
Solana Pay是基於Solana區塊鏈開發的支付協議,允許使用加密貨幣進行支付。文章介紹了Solana Pay的優勢和功能,下一篇文章將簡單介紹其API的機制與實作。
上一篇提到要在Solana上鑄造新的token需要使用到token program,功能較為陽春。隨著各種新需求的增加同時兼顧安全性的目的,一個新的token program - token 2022 (另名token extension)被開發出來,發佈在一個新的地址上。 Token 2022在
SPL 是 Solana Program Library的簡稱,是一個用來在Solana上創造fungible/non-fungible token的工具,內含多個Program Account。 有別於以往在Ethereum上,每當想創造新的token就需要寫一個智能合約,SPL有點像是API的
簡介如何使用Solana Pay API整合商店頁面進行支付
Solana Pay是基於Solana區塊鏈開發的支付協議,允許使用加密貨幣進行支付。文章介紹了Solana Pay的優勢和功能,下一篇文章將簡單介紹其API的機制與實作。
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本篇文章提供清晰的步驟與代碼,指導開發者如何在實際項目中設置和使用 CandyPay。無論是新手還是有經驗的開發者,您都可以輕鬆掌握如何將這一強大的支付工具無縫整合到應用中,並實現加密貨幣支付功能。文章中還介紹了 NFT-Based Discount 的設置方法,幫助商家擴展客戶忠誠度。
Thumbnail
CandyPay 是一個使用 Solana 區塊鏈的 Payment solution,企業只需撰寫幾行程式碼,即可將這個支付基礎設施整合到自己的應用中,並開始接受 Solana Payments。這使得企業能夠輕鬆利用 Solana 提供的快速、低成本的去中心化支付網路。 值得一提的是,Cand
1.簡述 Solana Pay 的基本概念及其運作方式。 2.簡述 Solana Pay 整合到商業銷售系統的教程。 3.簡述使用 Solana Pay 對商戶和消費者的好處 4.簡述 Stripe 與 USDC 的整合方式。 5.簡述如何為企業設置 Stripe USDC 的指南。 6.
你有聽過Solana上新推出的超強功能 「Token Extension」嗎?有了Token Extension,工程師能夠更快速的在Solana上建立專案,並且大幅增強了各個專案之間融合的便利性。如果你還不知道什麼是Token Extension,這篇文章你必須看完!
Token Extension Standard 是 Solana 區塊鏈上的一個代幣標準, 基於原始的 SPL(Solana Program Library)代幣標準進行構建。 具有增強的安全性和功能、改進的代幣處理能力, 如多重簽名和時間鎖定、設計 用於支持更複雜的代幣操作和使用案例
在上一篇part 1的文章中簡單的介紹了什麼是Solana Actions & Blinks後,這篇我來詳細一點介紹一下Solana Actions以開發者的角度來看是怎麼樣子的。
Thumbnail
This is 就這樣栽進Web 3.0 &Economic 的路易斯啦!!!! 與Solana Payment最後的戰役,阿不是...是最後篇章! 本次要說明的是 使用 Solana Pay 對商業用戶和消費者的『好處』有哪些呢? 以『共同好處』來說,總共有四點。
Thumbnail
什麼是代儲值? 隨著手遊市場的快速發展,遊戲內購買(in-app purchases)成為了玩家提升遊戲體驗的重要途徑之一。然而,對於某些玩家而言,直接在遊戲中充值可能會遇到支付方式限制或費用過高等問題。這時,代儲值服務應運而生。代儲值是指通過第三方平台,幫助玩家完成遊戲內的充值過程,使玩家能夠以
Thumbnail
金融業需遵守金檢規則,建立API分級協助和管理程序確保API合規,使用OAuth 2.0和API KEY授權功能降低風險,實行API認證和金鑰機制保障資料安全。監控API使用,建立控制機制,選擇優良的APIM,提供全面的API管理和安全。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本篇文章提供清晰的步驟與代碼,指導開發者如何在實際項目中設置和使用 CandyPay。無論是新手還是有經驗的開發者,您都可以輕鬆掌握如何將這一強大的支付工具無縫整合到應用中,並實現加密貨幣支付功能。文章中還介紹了 NFT-Based Discount 的設置方法,幫助商家擴展客戶忠誠度。
Thumbnail
CandyPay 是一個使用 Solana 區塊鏈的 Payment solution,企業只需撰寫幾行程式碼,即可將這個支付基礎設施整合到自己的應用中,並開始接受 Solana Payments。這使得企業能夠輕鬆利用 Solana 提供的快速、低成本的去中心化支付網路。 值得一提的是,Cand
1.簡述 Solana Pay 的基本概念及其運作方式。 2.簡述 Solana Pay 整合到商業銷售系統的教程。 3.簡述使用 Solana Pay 對商戶和消費者的好處 4.簡述 Stripe 與 USDC 的整合方式。 5.簡述如何為企業設置 Stripe USDC 的指南。 6.
你有聽過Solana上新推出的超強功能 「Token Extension」嗎?有了Token Extension,工程師能夠更快速的在Solana上建立專案,並且大幅增強了各個專案之間融合的便利性。如果你還不知道什麼是Token Extension,這篇文章你必須看完!
Token Extension Standard 是 Solana 區塊鏈上的一個代幣標準, 基於原始的 SPL(Solana Program Library)代幣標準進行構建。 具有增強的安全性和功能、改進的代幣處理能力, 如多重簽名和時間鎖定、設計 用於支持更複雜的代幣操作和使用案例
在上一篇part 1的文章中簡單的介紹了什麼是Solana Actions & Blinks後,這篇我來詳細一點介紹一下Solana Actions以開發者的角度來看是怎麼樣子的。
Thumbnail
This is 就這樣栽進Web 3.0 &Economic 的路易斯啦!!!! 與Solana Payment最後的戰役,阿不是...是最後篇章! 本次要說明的是 使用 Solana Pay 對商業用戶和消費者的『好處』有哪些呢? 以『共同好處』來說,總共有四點。
Thumbnail
什麼是代儲值? 隨著手遊市場的快速發展,遊戲內購買(in-app purchases)成為了玩家提升遊戲體驗的重要途徑之一。然而,對於某些玩家而言,直接在遊戲中充值可能會遇到支付方式限制或費用過高等問題。這時,代儲值服務應運而生。代儲值是指通過第三方平台,幫助玩家完成遊戲內的充值過程,使玩家能夠以
Thumbnail
金融業需遵守金檢規則,建立API分級協助和管理程序確保API合規,使用OAuth 2.0和API KEY授權功能降低風險,實行API認證和金鑰機制保障資料安全。監控API使用,建立控制機制,選擇優良的APIM,提供全面的API管理和安全。