多链静态分析技能Skill mvx_static_analysis

这个技能用于提供对 MultiversX 区块链代码库的静态分析指南,专注于 Rust 和 Go 语言中常见漏洞的模式识别,如不安全代码使用、未验证的 unwrap 和浮点算术。通过自动化工具和手动审查,帮助开发者识别和修复潜在问题,提升代码安全性和质量。关键词包括:静态分析、Rust、Go、MultiversX、智能合约、安全漏洞、代码审计、区块链安全。

智能合约 0 次安装 0 次浏览 更新于 3/21/2026

名称: 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": 关键。浮点是非确定性的,在共识中禁止。
  • 映射迭代:
    • MapMapperVecMappergrep -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] 假阳性已过滤。


完成标准

静态分析完成时:

  1. cargo checkcargo clippy 通过,零警告。
  2. 所有检查清单中的 grep 模式都已执行。
  3. 所有发现都已分类(严重性分配,假阳性标记)。
  4. 关键和高发现已记录在输出表中。