介绍一下solana智能合约审计和安全的一些系统方法!
文章开头分享一个区块链安全和智能合约审计的交流群:741631068! And enjoy it!
Solana 因其极低的交易费用而大受欢迎。随着越来越多的高价值 Dapps 在 Solana 上构建,为它们发展审计技术至关重要。
然而,与以太坊(在过去三年中建立了审计规则)相比,审计 Solana 智能合约需要新的和更高级的技能。Solana 在两个主要方面与以太坊不同:
在本系列文章中,我们将介绍一种系统的方法,包括一些用于审计 Solana 智能合约的自动化技术。
首先,审计应该_培养攻击者的心态并了解他们的动机.以下是来自攻击者的一些想法:
上面的列表可以很容易地扩展到包括利用智能合约中任何经济或逻辑错误的攻击。
然后找出智能合约的所有攻击面。与攻击者可以调用每个公共或外部函数的 Solidity 不同,Solana 智能合约具有单个入口点宏定义:entrypoint!
entrypoint!(process_instruction);
fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult
在上面,函数process_instruction是单一入口点。它传递三个参数:program_id、accounts和instruction_data,后两个参数可以由攻击者控制(除了program_id)。换句话说: 攻击者可以为 Solana 智能合约提供任意数据给参数accounts和instruction_data并加以利用由 program_id 标识的 Solana 智能合约 在process_instruction中,合约可以实现任何业务逻辑。以下显示了solido的代码片段:
pub fn process(program_id: &Pubkey, accounts: &[AccountInfo], input: &[u8]) -> ProgramResult {
let instruction = LidoInstruction::try_from_slice(input)?;
match instruction {
LidoInstruction::Initialize {…} => process_initialize(…),
LidoInstruction::Deposit {…} => process_deposit(…),
LidoInstruction::StakeDeposit { … } => process_stake_deposit(…),
...
}
根据instruction_data的解析结果,然后合约调用不同的函数来处理不同的逻辑process_initialize , process_deposit , process_stake_deposit,等等。这些函数可以在accounts中读写数据,调用 Rust 库和 Solana 辅助函数,或者进一步调用其他链上程序. 如果这些代码路径中的任何一个存在缺陷,攻击者可能会利用它们来窃取金钱或做其他坏事。
然后,了解Solana 中特定领域的规则和复杂性 。虽然智能合约漏洞和攻击向量的数量在不断增加,但已知的漏洞有多个,有些在所有智能合约中都很常见,有些在 Solana 中是独一无二的:
审计还应记住,Solana 区块链和 Rust 编程语言存在几个普遍问题,例如跨程序调用的深度、有限的可重入性、不安全的 Rust 等。
cargo-outdated
可用于检查过时的依赖项。除了检查这些常见漏洞和一般问题外,审计还应检查智能合约是否存在高级语义错误,例如:
Happy for it!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!