如何审计Solana智能合约第二部分:自动化扫描

  • Sec3dev
  • 发布于 2021-11-13 21:42
  • 阅读 41

本文介绍了几种自动化扫描工具,帮助审计Solana智能合约。工具包括x-ray、cargo-audit、cargo-clippy、cargo-geiger和cargo-spellcheck,并通过示例展示了如何使用这些工具检测智能合约中的安全漏洞。文章结构清晰,提供了详细的工具描述和实用示例,旨在提高Solana智能合约的安全性。

第一部分:系统方法之后,本文介绍了一些自动扫描工具来帮助审核Solana智能合约。

  • x-ray:专为Solana程序设计的扫描器,查找所有常见的安全漏洞(例如:缺失检查、算术溢出等)。
  • cargo-audit:审核Cargo.lock文件,查找已知的安全漏洞。
  • cargo-clippy:收集常见错误的lint。
  • cargo-geiger : 报告不安全Rust的使用情况。
  • cargo-spellcheck:检查拼写和语法错误。

接下来我们将使用两个实际合约(solidojet-v1)展示这些工具的功能。solido和jet-v1在Immunefi上提供漏洞奖金。

X-Ray:扫描所有常见漏洞

X-Ray是sec3团队开发的自动扫描器,专门用于查找Solana智能合约中的所有常见漏洞。

  • 要安装sec3,请在Linux终端中运行以下命令:
$ sh -c "$(curl -k https://supercompiler.xyz/install)"
  • 要运行x-ray,请在智能合约目录下调用 `x-ray .` 或 `x-ray -analyzeAll .`(Xargo.toml 文件所在目录)

接下来我们将用两个示例展示X-Ray的功能。

示例1: solido中的缺失检查

这个拉取请求中,solido应用了修复以弥补在reserve_account上缺失的检查(第151行如下):

这个缺失检查是一个关键安全漏洞。它允许攻击者通过提供受攻击者控制的reserve_account来铸造和接收无限的代币。

为了重现此漏洞,我们从GitHub检查出了solido的最新版本:

$ git clone git@github.com:ChorusOne/solido.git

并注释掉包含检查的那一行(在文件solido/program/src/processor.rs中):

lido.check_reserve_account(program_id, accounts.lido.key, accounts.reserve_account)?;

通过运行x-ray -analyzeAll .,X-Ray仅需几秒钟即可检测到该漏洞,并将在终端报告以下内容:

图1. X-Ray报告的solido中的缺失检查漏洞

示例2:在jet-v1中的整数溢出

这个提交中, jet-v1对borrow函数中的整数溢出进行了修复(第119行如下):

此溢出的可能后果是:

  1. 从总存款中扣除大量金额,而实际上仅借出了少量金额给借款人。
  2. 完成贷款交易后,请求大额贷款的借款人最终可能只收到少量贷款。

为了重现此漏洞,我们从GitHub检查出了jet-v1的最新版本:

$ git clone https://github.com/jet-lab/jet-v1

并将check_add修复(第122行在文件programs/jet/src/instructions/borrow.rs中)更改回:

let total_token_debt = requested_tokens.checked_add(fees)
  .expect("Requested a debt that would exceed the maximum potential supply for a token.");

回到:

let total_token_debt = requested_tokens + fees;

同样,通过运行x-ray -analyzeAll .,x-ray在几秒钟内检测到该漏洞,并在终端报告以下内容:

图2. X-Ray报告的jet-v1中的整数溢出漏洞

cargo-audit:扫描Cargo.lock中的漏洞

cargo-audit是一个工具,用于审核\_Cargo.lock\_文件,查找已报告在RustSec Advisory Database中的安全漏洞。

要安装,请执行\cargo install cargo-audit`。

要运行,请在任何Cargo项目的顶层执行cargo audit(那里有Cargo.lock)。

以下显示了cargo audit对solido的结果。它加载了371个安全建议并扫描了143个crate依赖,但没有发现漏洞。

cargo-clippy:捕获常见错误的lint

cargo-clippy是一个linter,用于捕获Rust代码中的常见错误。它拥有超过450条lint规则的集合。

要安装,请执行rustup update和rustup component add clippy。

要运行,请在智能合约的目录下执行cargo clippy(那里有Xargo.toml)。

cargo clippy在jet-v1上报告了大量警告。以下是其中的一部分:

cargo-geiger:扫描不安全Rust的使用

cargo-geiger是一个检测不安全Rust代码使用情况的工具。它列出了Rust crate及其所有依赖项的统计数据。

要安装,请执行cargo install cargo-geiger。

要运行,请在智能合约的目录下执行cargo geiger。

以下是cargo geiger报告的jet-v1的统计数据截图:

warning: length comparison to zero
--> libraries/math/src/number.rs:188:34
188 |         let pretty_decimals = if stripped_decimals.len() == 0 {
    |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: using `is_empty` is clearer and more explicit:
    `stripped_decimals.is_empty()`
= note: `#[warn(clippy::len_zero)]` on by default
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero

warning: the function `handler` doesn't need a mutable reference
--> programs/jet/src/instructions/liquidate_dex.rs:594:45
594 |     handler(&source_market, &target_market, &mut liquidation)?;
    |                                             ^^^^^^^^^^^^^^^^
= note: `#[warn(clippy::unnecessary_mut_passed)]` on by default
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed

cargo-spellcheck:拼写和语法错误

cargo-spellcheck是一个检查Rust代码和文档中的拼写和语法错误的工具。它可能在发现安全相关问题时似乎不太有用,但在许多情况下有助于定位错别字。

要安装,请执行cargo install --locked cargo-spellcheck。

要运行,请在智能合约的目录下执行cargo spellcheck。

以下是cargo spellcheck在jet-v1上报告的一些警告:

error: spellcheck(Hunspell)
--> jet-v1/programs/jet/src/state/market.rs:357
    |
357 |  Disable all borrowing and collateral withdrawls
    |                                       ^^^^^^^^^^
- withdraws, withdrawals, with drawls, with-drawls, withdraw ls, withdraw-ls, withdrawal, or one of 2 others

--> jet-v1/programs/jet/src/state/reserve.rs:104
104 |  liquidating assetr from this reserve as collateral.
    |              ^^^^^^
    | - assert, asset, assets, or asset r

sec3审核

sec3团队很高兴为Solana上的高影响力Dapps提供审核服务。请邮件email@sec3.dev或访问sec3.dev

sec3由区块链安全和软件验证领域的领先思想家创立。

接下来是什么

在接下来的几篇文章中,我们将继续介绍审核Solana智能合约的技能,包括自动化测试工具和Anchor

如何审核Solana智能合约系列?

有关sec3的所有博客,请访问https://www.sec3.dev/blog

  • 原文链接: sec3.dev/blog/how-to-aud...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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