本文介绍了X-Ray,一个用于自动扫描Solana智能合约的安全工具,旨在检测常见安全隐患。文章中列出了Solana智能合约中常见的五类问题,并通过代码示例说明了如何检测和修复这些问题。最后,文章还提供了X-Ray的使用和安装方式。
Solana 是一个快速增长的区块链,拥有 一种独特类型的智能合约 — 被称为Solana程序。本文介绍了X-Ray,一个自动扫描Solana程序以检测常见安全陷阱的安全工具。
Neodyme 最近收集了一份 Solana智能合约中的常见陷阱 的清单,分为五类:
举个例子,下面的代码展示了缺失签名者检查的一个常见陷阱。
fn update_admin(accounts: &[AccountInfo], admin: [u8; 32]) -> ProgramResult {
let acc_iter = &mut accounts.iter();
let admin_info = next_account_info(acc_iter)?;
let staking_info = next_account_info(acc_iter)?;
// if !admin_info.is_signer {
// return Err(ProgramError::MissingRequiredSignature);
// }
let mut staking = StakingInfo::try_from_slice(&staking_info.data.borrow())?;
if staking.admin == [0; 32] {
staking.admin = admin;
} else if staking.admin == admin_info.key.to_bytes() {
staking.admin = admin;
} else {
return Err(StakeError::AdminRequired.into());
}
let _ = staking.serialize(&mut &mut staking_info.data.borrow_mut()[..]);
Ok(())
}
函数 _updateadmin 更新一个staking_info账户的管理员。它试图通过将staking.admin与admin_info账户的公钥进行比较来确保该函数仅由当前的staking_info管理员调用。必须检查admininfo是否实际签署了此操作。这可以通过添加检查 **if !admin_info.issigner** 来完成。否则 如果检查被遗漏,攻击者可以将管理员更新为任何账户。
原因在于,在Solana中,用户可以在调用智能合约时提供任意账户,因此没有任何事情可以阻止恶意用户仅仅提供一个假的admin_info,使用admin_info.key.to_bytes()作为staking.admin,而他们自己的账户作为新的管理员。
由 GreenCore技术 提供驱动,sec3 X-Ray 可以通过检查所有代码路径来自动检测Solana程序中的安全漏洞,这些代码路径针对这些常见陷阱。基本思路是查看提供给程序的每个用户账户的数据流,并 在其有效性未在程序的执行上下文中得到适当检查 时标记为不可信。图1显示了X-Ray在update_admin代码中检测到的缺失签名者检查的屏幕截图。图2显示了X-Ray在Jet协议中检测到的算术溢出/下溢的屏幕截图。
图1. Soteria发现的缺失签名者检查漏洞的屏幕截图
图2. X-Ray在 Jet协议 中发现的真实漏洞,并由其开发者修复
在Solana程序的目录中(其中存在Xargo.toml),运行X-Ray . 或X-Ray -analyzeAll 。
点 . 是以下cargo build命令的快捷方式:
根据代码复杂性,X-Ray当前仅增加约一秒的构建时间。在屏幕结尾,它还会显示发现的摘要,并生成可以在浏览器中检查的报告。
选项1(Linux终端)
sh -c "$(curl -k https://supercompiler.xyz/install)"
export PATH=$PWD/soteria-linux-develop/bin/:$PATH
选项2(Docker)
docker run -v $PWD/jet-v1/:/workspace -it greencorelab/soteria:latest /bin/bash
快速启动
soteria --version
- 原文链接: sec3.dev/blog/xray...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!