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
留言分享你的想法!
avatar-img
ppe ha的沙龍
4會員
7內容數
ppe ha的沙龍的其他內容
2024/08/10
前言 本篇要用 Token-2022 和 solana cli 來鑄造一個新的代幣叫做TYC。 如前篇所述,Token-2022 與 Spl Token 是不同的 Program,所以在呼叫的時候要特別註明以示明區別。 Token-2022 Program ID 地址: TokenzQdBNb
Thumbnail
2024/08/10
前言 本篇要用 Token-2022 和 solana cli 來鑄造一個新的代幣叫做TYC。 如前篇所述,Token-2022 與 Spl Token 是不同的 Program,所以在呼叫的時候要特別註明以示明區別。 Token-2022 Program ID 地址: TokenzQdBNb
Thumbnail
2024/08/07
前兩篇講了SPL Token與Account Model,現在要正式介紹token extension。 Token Extension Program(以下簡稱TEP) 原名 Token 2022,是一個基於原本Token Prgram(以下簡稱TP)的擴充版本。TEP被部署到的地
Thumbnail
2024/08/07
前兩篇講了SPL Token與Account Model,現在要正式介紹token extension。 Token Extension Program(以下簡稱TEP) 原名 Token 2022,是一個基於原本Token Prgram(以下簡稱TP)的擴充版本。TEP被部署到的地
Thumbnail
2024/08/05
上一篇提到要在Solana上鑄造新的token需要使用到token program,功能較為陽春。隨著各種新需求的增加同時兼顧安全性的目的,一個新的token program - token 2022 (另名token extension)被開發出來,發佈在一個新的地址上。 Token 2022在
Thumbnail
2024/08/05
上一篇提到要在Solana上鑄造新的token需要使用到token program,功能較為陽春。隨著各種新需求的增加同時兼顧安全性的目的,一個新的token program - token 2022 (另名token extension)被開發出來,發佈在一個新的地址上。 Token 2022在
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
CPI 全名叫做 Cross Program Invocation,它可以讓Solana的program直接呼叫另一個Program中的instruction,這個功能可以讓程式有更高的可組合性。可以把CPI想像成一個API在被呼叫的時候又去呼叫另外一個API。 圖示如下: 在Token 202
Thumbnail
CPI 全名叫做 Cross Program Invocation,它可以讓Solana的program直接呼叫另一個Program中的instruction,這個功能可以讓程式有更高的可組合性。可以把CPI想像成一個API在被呼叫的時候又去呼叫另外一個API。 圖示如下: 在Token 202
Thumbnail
上一篇提到要在Solana上鑄造新的token需要使用到token program,功能較為陽春。隨著各種新需求的增加同時兼顧安全性的目的,一個新的token program - token 2022 (另名token extension)被開發出來,發佈在一個新的地址上。 Token 2022在
Thumbnail
上一篇提到要在Solana上鑄造新的token需要使用到token program,功能較為陽春。隨著各種新需求的增加同時兼顧安全性的目的,一個新的token program - token 2022 (另名token extension)被開發出來,發佈在一個新的地址上。 Token 2022在
Thumbnail
SPL 是 Solana Program Library的簡稱,是一個用來在Solana上創造fungible/non-fungible token的工具,內含多個Program Account。 有別於以往在Ethereum上,每當想創造新的token就需要寫一個智能合約,SPL有點像是API的
Thumbnail
SPL 是 Solana Program Library的簡稱,是一個用來在Solana上創造fungible/non-fungible token的工具,內含多個Program Account。 有別於以往在Ethereum上,每當想創造新的token就需要寫一個智能合約,SPL有點像是API的
Thumbnail
簡介如何使用Solana Pay API整合商店頁面進行支付
Thumbnail
簡介如何使用Solana Pay API整合商店頁面進行支付
Thumbnail
Permit、Approve、Increase Allowance三個最近常見的token scam
Thumbnail
Permit、Approve、Increase Allowance三個最近常見的token scam
Thumbnail
不要被高收益沖昏頭,冷靜、分析、檢查,才能安全的在這虛擬的世界平安走下去。
Thumbnail
不要被高收益沖昏頭,冷靜、分析、檢查,才能安全的在這虛擬的世界平安走下去。
Thumbnail
專案分析 Chainlink 跨鏈互操作性協議 CCIP 上線主網,如何為跨鏈帶來安全性? 從解析 Lens V2 :開放式操作和價值共享,能否改變社交的遊戲規則? 解讀 UniswapX :將聚合交易去中心化,鏈上做市商的黃金時代來臨 深入 MakerDao 的過去和未來:長期價值被低估,
Thumbnail
專案分析 Chainlink 跨鏈互操作性協議 CCIP 上線主網,如何為跨鏈帶來安全性? 從解析 Lens V2 :開放式操作和價值共享,能否改變社交的遊戲規則? 解讀 UniswapX :將聚合交易去中心化,鏈上做市商的黃金時代來臨 深入 MakerDao 的過去和未來:長期價值被低估,
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News