X-Ray:Solana智能合约的漏洞扫描器

  • Sec3dev
  • 发布于 2021-10-09 11:22
  • 阅读 31

本文介绍了X-Ray,一个用于自动扫描Solana智能合约的安全工具,旨在检测常见安全隐患。文章中列出了Solana智能合约中常见的五类问题,并通过代码示例说明了如何检测和修复这些问题。最后,文章还提供了X-Ray的使用和安装方式。

Solana 是一个快速增长的区块链,拥有 一种独特类型的智能合约 — 被称为Solana程序。本文介绍了X-Ray,一个自动扫描Solana程序以检测常见安全陷阱的安全工具。

Solana智能合约中的常见陷阱

Neodyme 最近收集了一份 Solana智能合约中的常见陷阱 的清单,分为五类:

  • 缺失的所有权检查
  • 缺失的签名者检查
  • 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,而他们自己的账户作为新的管理员。

X-Ray — 检测常见陷阱

GreenCore技术 提供驱动,sec3 X-Ray 可以通过检查所有代码路径来自动检测Solana程序中的安全漏洞,这些代码路径针对这些常见陷阱。基本思路是查看提供给程序的每个用户账户的数据流,并 在其有效性未在程序的执行上下文中得到适当检查 时标记为不可信。图1显示了X-Ray在update_admin代码中检测到的缺失签名者检查的屏幕截图。图2显示了X-Ray在Jet协议中检测到的算术溢出/下溢的屏幕截图。

图1. Soteria发现的缺失签名者检查漏洞的屏幕截图

图2. X-Ray在 Jet协议 中发现的真实漏洞,并由其开发者修复

如何使用X-Ray

在Solana程序的目录中(其中存在Xargo.toml),运行X-Ray . 或X-Ray -analyzeAll 。

点 . 是以下cargo build命令的快捷方式:

根据代码复杂性,X-Ray当前仅增加约一秒的构建时间。在屏幕结尾,它还会显示发现的摘要,并生成可以在浏览器中检查的报告。

如何安装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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Sec3dev
Sec3dev
https://www.sec3.dev/