本文介绍了几种自动化扫描工具,帮助审计Solana智能合约。工具包括x-ray、cargo-audit、cargo-clippy、cargo-geiger和cargo-spellcheck,并通过示例展示了如何使用这些工具检测智能合约中的安全漏洞。文章结构清晰,提供了详细的工具描述和实用示例,旨在提高Solana智能合约的安全性。
继第一部分:系统方法之后,本文介绍了一些自动扫描工具来帮助审核Solana智能合约。
接下来我们将使用两个实际合约(solido 和 jet-v1)展示这些工具的功能。solido和jet-v1在Immunefi上提供漏洞奖金。
X-Ray是sec3团队开发的自动扫描器,专门用于查找Solana智能合约中的所有常见漏洞。
$ sh -c "$(curl -k https://supercompiler.xyz/install)"
接下来我们将用两个示例展示X-Ray的功能。
在这个拉取请求中,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中的缺失检查漏洞
在这个提交中, jet-v1对borrow函数中的整数溢出进行了修复(第119行如下):
此溢出的可能后果是:
为了重现此漏洞,我们从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\
_文件,查找已报告在RustSec Advisory Database中的安全漏洞。
要安装,请执行\
cargo install cargo-audit`。
要运行,请在任何Cargo项目的顶层执行cargo audit(那里有Cargo.lock)。
以下显示了cargo audit对solido的结果。它加载了371个安全建议并扫描了143个crate依赖,但没有发现漏洞。
cargo-clippy是一个linter,用于捕获Rust代码中的常见错误。它拥有超过450条lint规则的集合。
要安装,请执行rustup update和rustup component add clippy。
要运行,请在智能合约的目录下执行cargo clippy(那里有Xargo.toml)。
cargo clippy在jet-v1上报告了大量警告。以下是其中的一部分:
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是一个检查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团队很高兴为Solana上的高影响力Dapps提供审核服务。请邮件email@sec3.dev或访问sec3.dev。
sec3由区块链安全和软件验证领域的领先思想家创立。
在接下来的几篇文章中,我们将继续介绍审核Solana智能合约的技能,包括自动化测试工具和Anchor。
如何审核Solana智能合约系列?
有关sec3的所有博客,请访问https://www.sec3.dev/blog
- 原文链接: sec3.dev/blog/how-to-aud...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!