名称: mvx_static_analysis 描述: Rust/Go 的手动和自动静态分析模式(不安全用法、未验证的 unwrap、浮点算术)。
MultiversX 静态分析
这个技能指导您对 MultiversX 代码库进行静态分析,专注于常常表示漏洞的模式。
执行顺序
按顺序遵循这些步骤。不要跳过;早期步骤捕捉编译错误,使后续模式匹配不可靠。
步骤 1 — 编译器和代码检查器
首先运行编译器和代码检查器。在继续之前修复任何错误。
cargo check
cargo clippy -- -D warnings
两个命令必须在移至步骤 2 之前以 零警告 退出。
步骤 2 — Grep 模式
运行下面检查清单中列出的每个 grep 模式(Rust 和 Go),按出现顺序。在输出表中记录每个匹配。
步骤 3 — Semgrep 规则
运行所有 Semgrep 规则(参见下面的 Semgrep 部分)。将任何新发现添加到输出表中。
步骤 4 — 逻辑模式的手动审查
手动检查检查清单中描述的逻辑模式(令牌 ID 验证、回调状态等)。这些不能完全自动化,需要人工判断。
1. Rust 智能合约 (multiversx-sc)
关键 Grep 模式
- 不安全代码:
grep -r "unsafe": 仅对 FFI 或特定优化有效。在智能合约中通常禁止。
- Panic 诱导器:
grep -r "unwrap()": 高风险。应使用sc_panic!或unwrap_or_else。grep -r "expect(": 高风险。
- 浮点:
grep -r "f32"/grep -r "f64": 关键。浮点是非确定性的,在共识中禁止。
- 映射迭代:
- 在
MapMapper或VecMapper上grep -r "iter()": 潜在的 Gas DoS。
- 在
逻辑模式(手动审查)
- 令牌 ID 验证:
- 搜索
call_value().all()或call_value().single()。 - 验证:
token_id是否与存储变量(例如wanted_token_id)核对?
- 搜索
- 回调状态:
- 搜索
#[callback]。 - 验证:它是否假设异步调用成功?(不应如此)。
- 搜索
2. Go 协议 (mx-chain-go)
并发性
- Goroutines:
grep -r "go func".- 检查:循环变量是否被正确捕获?(常见 Go 陷阱)。
- 竞争:
grep -r "map\\["在 goroutines 中没有 Mutex 编写。
确定性
- 映射迭代: 迭代 Go 映射是非确定性的。
- 规则: 永远不要迭代映射来产生哈希或共识数据。
- 时间:
time.Now()在块处理中禁止使用。使用header.TimeStamp。
3. Semgrep 规则创建
如果模式复杂,创建 Semgrep 规则。
rules:
- id: mvx-float-arithmetic
patterns:
- pattern: $X + $Y
- metavariable-type:
metavariable: $X
type: f64
message: "检测到浮点算术。使用 BigUint。"
languages: [rust]
severity: ERROR
严重性分配规则
使用以下表为每个发现分配严重性。当发现匹配多个规则时,使用最高的适用严重性。
Rust 智能合约
| 模式 | 上下文 | 严重性 |
|---|---|---|
unwrap() / expect() |
在 #[endpoint] 或 #[callback] 函数中 |
高 |
unwrap() / expect() |
在测试代码中 (#[cfg(test)], tests/) |
跳过 |
f32 / f64 |
在智能合约中任何位置 | 关键 |
unsafe |
在智能合约中(无 FFI 理由) | 关键 |
unsafe |
FFI 边界有明确理由 | 中等(记录理由) |
| 映射/向量迭代 | 无限制或无 gas 限制 | 高 |
| 令牌 ID 未验证 | 在 #[payable] 端点中 |
关键 |
| 回调假设成功 | #[callback] 未处理失败路径 |
高 |
Go 协议(仅限 mx-chain-go)
| 模式 | 上下文 | 严重性 |
|---|---|---|
| Go 映射迭代 | 在共识或哈希代码中 | 关键 |
time.Now() |
在块处理逻辑中 | 关键 |
输出格式
以以下结构化表呈现所有发现。
静态分析报告
| # | 模式 | 位置 | 严重性 | 发现 | 假阳性? |
|---|---|---|---|---|---|
| 1 | unwrap() | src/lib.rs:42 | 高 | 端点中的 unwrap | 否 |
| 2 | f64 | src/math.rs:10 | 关键 | 价格计算中的浮点 | 否 |
总结: [N] 发现([C] 关键, [H] 高, [M] 中等)。[F] 假阳性已过滤。
完成标准
静态分析完成时:
cargo check和cargo clippy通过,零警告。- 所有检查清单中的 grep 模式都已执行。
- 所有发现都已分类(严重性分配,假阳性标记)。
- 关键和高发现已记录在输出表中。