从 EVM 到 SVM:资深安全研究员给出的 2026 安全指南

  • zealynx
  • 发布于 4天前
  • 阅读 45

本文面向资深安全研究员,探讨从以太坊虚拟机(EVM)到Solana虚拟机(SVM)的安全迁移,强调了Solana生态系统中所需的深层系统工程知识。内容涵盖了Rust内存管理、Borsh序列化、Sealevel并行架构、PDA安全、Anchor框架应用以及关键漏洞和审计工具,旨在为掌握Solana安全提供技术路线图。

对于资深安全研究员而言,从以太坊虚拟机 (EVM) 到 Solana 虚拟机 (SVM) 的过渡不仅仅是语法上的变化,更是一种结构性迁移。从顺序的、状态繁重的环境转向并行化的、无状态的执行模型,这需要的不仅仅是学习一门新语言,还需要一种深层系统工程方法。

在2026年,安全不再是简单的勾选框。它需要对内存布局、确定性序列化和 Sealevel 运行时的细微差别有精通的掌握。本指南旨在为旨在精通 Solana 生态系统的资深工程师提供一份技术教学大纲。


I. Rust 基础:内存作为第一道防线

在 SVM 中,程序被编译成 eBPF 的一种特殊变体,称为 Solana 字节码格式 (SBF)。与 EVM 的托管环境不同,SBF 要求内存管理绝对精确。

The Rust foundation: memory as the first line of defense

1. 借用检查器作为审计工具

资深研究员必须将 Rust 的所有权模型视为一种安全原语。漏洞通常出现在开发者试图通过使用 unsafe 块绕过借用检查器的地方。

  • 结构化精通:对于需要以安全为中心的教学路径,将传统逻辑转换为内存安全代码的工程师,Cyfrin Updraft Rust 编程基础提供了 Rust 仿射类型系统所需的理论基础。
  • 技术细分:理解 Rust 所有权对于防止高吞吐量环境中的数据竞争至关重要。
  • 不安全边界:为了识别不健全的代码,Rustonomicon不安全的 Rust 最佳实践 是在深入审计期间识别未定义行为 (UB) 的强制性参考。

Rust ownership and unsafe boundaries

2. 使用 Borsh 进行确定性序列化

Solana 无状态逻辑的完整性依赖于 Borsh (用于哈希的二进制对象表示序列化器)。审计员必须理解 Borsh Schema Generation,因为一个字节的偏移就可能导致“Type Cosplay”漏洞。要连接客户端和链上逻辑,请参阅 揭秘 Borsh 序列化

Borsh serialization pipeline


II. 架构心智模型:Sealevel 转变

Solana 的性能来源于 Sealevel,这是一个允许并行事务执行的运行时。这种并行性之所以可能,是因为事务必须预先声明所有账户依赖项。

EVM sequential execution vs Sealevel parallel execution

1. 无状态与全局状态

EVM 到 SVM 迁移官方指南 解释了为何 Solana 的以账户为中心的模型在扩展性方面更优,但同时也引入了账户注入等风险。要全面综合这些概念,Cyfrin Updraft Solana 课程 提供了 SVM 安全隐患的高级视角,超越了基本的账本管理,深入到协议层面的弹性。

2. PDA 和“规范 Bump”

Program Derived Addresses (PDAs) 允许程序在没有私钥的情况下“签名”交易。

  • 核心机制:官方 PDA 文档 解释了派生和签名。
  • 安全风险:资深审计员必须警惕“bump seed canonicalization”。未能使用规范 bump 允许攻击者为相同的种子创建多个有效地址。请参阅 解锁 PDA 潜力

PDA derivation and canonical bump


III. 开发范式:从原生到 Anchor

专业审计要求“原生优先”的心态,但“Anchor 标准”的执行。

Native development vs Anchor framework

1. 原生开发(“困难模式”)

在使用抽象之前,你必须了解 Native Entrypoint。手动 Instruction Data Layout parsing 是发现大多数高严重性 bug 的地方。PaulX 托管教程(及其 现代实现)对于理解原始账户初始化和 lamport 转移仍然至关重要。

2. Anchor 框架标准

Anchor 已发展成为生态系统的“标准库”。

  • 官方文档:使用 Anchor 0.30+ 参考 来掌握声明式约束。

  • 约束掌握:资深工程师必须优先学习 Anchor 安全约束has_oneseeds 等属性在构建过程中经过数学验证,以强制执行访问控制。

    • *

IV. 审计员的武器库:漏洞与工具

The auditor's security tooling arsenal

1. 漏洞目录

研究 Solana 程序安全旅行者指南 以了解诸如签名者授权失败等攻击向量。Anchor 用户还应参考 Anchor 安全漏洞指南

2. 高级安全工具

  • Fuzzing:Trident 是基于属性测试和集成测试的标准工具。
  • 扫描:使用 Soteria 进行自动化漏洞检测。
  • 探索:SolanaFM 提供了最细粒度的指令流视图。

3. 夺旗赛 (CTF) 练习

理论通过漏洞开发进行验证。Neodyme Solana CTF 挑战赛Blocksec CTF 索引 是培养攻击者思维模式的重要训练场。


V. 2026 展望:高级架构

The Solana stack in 2026

1. Firedancer 和客户端多样性

Firedancer 验证器解决了硬件限制,目标是每秒 100 万笔交易 (TPS)。资深工程师必须了解 Firedancer 的模块化架构 如何提高网络弹性和性能。

2. ZK 压缩和状态可扩展性

ZK 压缩 允许状态存储扩展 1,000 倍。掌握 ZK 压缩机制 现已成为 2026 年构建企业级协议的工程师的必备要求。

3. Token 扩展 (Token-2022)

Token-2022 标准引入了原生Hook和保密转账。资深审计员必须熟悉 Token-2022 安全最佳实践 以确保自定义扩展不会破坏可组合性。


结论

在2026年,SVM 将是全球规模应用执行层。得过且过的安全时代已经结束。通过将 Cyfrin Updraft 的教学严谨性OtterSec 和 Neodyme 审计报告 的技术深度相结合,你可以确保你的协议能够抵御现代 Sealevel 运行时复杂攻击向量的冲击。


常见问题:EVM 到 Solana 迁移对安全研究员的意义

1. EVM 和 Solana 之间对审计员来说最大的安全差异是什么?

从 EVM 到 SVM 的转变需要一种根本不同的心智模型。在 EVM 中,合约拥有自己的存储——状态和逻辑是协同定位的。在 Solana 中,账户是无状态容器,程序是纯粹的逻辑。这种分离引入了一类独特的漏洞:

  • 账户所有权混淆 — 未能验证账户是否由预期程序拥有。在 EVM 中,msg.sender 是权威的;在 Solana 中,你必须在每个指令上显式验证账户所有权。
  • 缺少签名者检查 — Solana 指令可以传递未签名的账户。忘记 is_signer 检查会让攻击者伪造权限。
  • Bump seed canonicalization — 与 EVM 中地址是固定的不同,PDA 必须使用规范的 bump 来防止攻击者为相同的种子派生出其他有效的地址。
  • Type cosplay — Borsh 根据位置而不是类型标签反序列化字节。如果未强制执行鉴别器,攻击者可以传递错误类型的账户。

对于 EVM 审计员而言,首先要培养的最有价值的技能是精确的账户验证——这是 Solana 大多数高严重性发现的所在地。

2. 什么是 bump seed canonicalization,为什么它是一个关键漏洞?

Program Derived Address (PDA) 是由一组种子加上一个 bump 值派生而来的——一个从 255 向下迭代的 8 位 nonce,直到找到一个有效的非曲线点。规范 bump 是找到的第一个最高有效值,它会生成一个唯一的、确定性的地址。

当程序接受调用者提供的任何有效 bump,而不是派生并强制执行规范 bump 时,就会出现漏洞。攻击者可以提供一个非规范的 bump,它仍然会生成一个曲线上的点,从而有效地创建一个不同但“看起来有效”的 PDA。这使他们能够:

  • 初始化一个冒充规范账户的第二个账户
  • 绕过依赖地址派生的访问控制检查
  • 通过写入意外账户来破坏程序状态

缓解措施:始终在程序内部使用 find_program_address 派生规范 bump,并将其存储在账户中。绝不信任调用者提供的 bump。Anchor 的 seedsbump 约束会自动强制执行此操作。

3. 一个经验丰富的 EVM 审计员需要多长时间才能在 Solana 上高效工作?

对于具有扎实 Rust 基础的资深 EVM 安全研究员来说,在 Solana 上达到实际高效通常需要 6-10 周的专注学习。一个现实的细分如下:

  • 第 1-2 周:Rust 所有权模型、借用检查器、生命周期规则——不可妥协的基础
  • 第 3-4 周:Solana 账户模型、Borsh 序列化、PDA 派生机制、原生程序入口点
  • 第 5-6 周:Anchor 框架约束、CPI (Cross-Program Invocation) 安全性、签名者/所有权验证模式
  • 第 7-10 周:首次监督审计、漏洞目录审查 (Neodyme CTF, Anchor 安全漏洞, Helius 指南)、工具 (Trident, Soteria)

这个转变比 EVM → EVM 链(例如以太坊 → Avalanche)要陡峭,因为执行模型确实不同——不仅仅是语法变化。试图跳过 Rust 基础的研究员在他们的首次 Solana 审计中往往会得出不完整的发现。

4. 2026 年 Solana 程序中最常见的高严重性漏洞是什么?

根据 2026 年之前的公开审计报告和 CTF 挑战赛,Solana 程序中最常被利用的漏洞类别是:

  1. 缺少所有者检查 — 未验证账户是否由预期程序拥有。允许替换攻击。
  2. 缺少签名者检查 — 接受权限账户而没有 is_signer 验证。允许特权提升。
  3. Bump seed canonicalization 错误 — 接受非规范 bump,导致账户欺骗。
  4. 原生程序中的算术溢出 — Rust 的发布模式在溢出时不会 panic;token 数量中未检查的数学运算导致可利用的下溢。
  5. 不安全的 CPI (Cross-Program Invocation) — 调用不受信任的程序或未在 CPI 之前验证程序 ID。影响严重性类似于 EVM 的重入漏洞。
  6. Type cosplay / 鉴别器绕过 — 原生程序中缺少账户类型鉴别器,允许恶意账户通过类型检查。
  7. PDA 共享 — 当它们应该有独立的账户时,多个指令共享一个 PDA,导致状态混淆。

Anchor 通过其约束系统缓解了其中许多问题——但只有在实际应用约束时才有效。缺少 has_oneconstraintseeds 属性的 Anchor 程序仍然容易受到攻击。

5. 使用 Anchor 框架是否能让 Solana 程序更安全?

Anchor 显著提高了安全下限,但它并不能消除漏洞——它只是改变了漏洞的发生位置。

Anchor 自动强制执行的功能:

  • 账户所有权验证(通过 Account<'info, T>
  • 反序列化时的鉴别器检查(防止 type cosplay)
  • PDA 派生和规范 bump 强制执行(通过 seedsbump 约束)
  • 签名者验证(通过 Signer<'info>

Anchor 能防止的功能:

  • 业务逻辑错误 — Anchor 验证账户结构,但不验证指令的正确性
  • 缺少约束 — 没有应用任何约束的 #[account] 结构并不比原生代码更安全
  • CPI 安全性 — Anchor 不验证传递给 CPI 调用的程序 ID
  • 算术错误 — 溢出保护必须由开发者使用 checked_* 数学处理

Anchor 程序中最常见的高严重性发现源于缺少或不完整的约束——开发者依赖 Anchor 的“安全默认设置”,而没有理解哪些检查是自动的,哪些必须显式声明。安全审计员必须审查每个 #[account] 结构,以验证所有必要的约束都已存在。

6. 2026 年 Solana 智能合约审计费用是多少?

2026 年 Solana 审计定价大致与 Solidity 相当,但由于稀缺性而带有溢价——能够进行彻底审查的具备 Rust + Sealevel 知识的审计员较少。

根据程序复杂性,典型范围如下:

  • 简单 SPL token 程序或基本质押:15,000–35,000
  • DeFi 协议(DEX、借贷、收益):50,000–120,000
  • 跨程序集成(多个 PDA、CPI、Token-2022 扩展):80,000–200,000+
  • Firedancer 感知或 ZK 压缩协议:120,000–250,000+

标准业务通常需要 1-3 周的时间。使用 Token-2022 扩展、ZK 压缩或自定义序列化格式的协议由于额外的复杂性,需要更长的范围界定和更高的费用。

在 Zealynx,我们为 Solana 程序提供固定范围的报价——没有按小时计费的意外情况。请求范围估算 →

词汇表

术语 定义
SVM (Solana Virtual Machine) 在 Solana 上执行程序的运行时环境,采用并行化的无状态账户模型。
Borsh Binary Object Representation Serializer for Hashing 的缩写,Solana 的确定性序列化格式。
Sealevel Solana 的并行事务处理运行时,支持并发执行不重叠的事务。
Program Derived Address (PDA) 从种子和程序 ID 派生出的确定性地址,允许程序在没有私钥的情况下签署事务。
Anchor framework Solana 程序的标准开发框架,提供声明式安全约束和账户验证。
ZK compression 一种使用零知识证明来压缩链上状态的技术,可在 Solana 上实现高达 1,000 倍的存储可扩展性。
Bump seed canonicalization 在 PDA 派生过程中使用找到的第一个有效 bump seed 的做法,以确保每个种子集只有一个规范地址。
  • 原文链接: zealynx.io/blogs/evm-to-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
zealynx
zealynx
江湖只有他的大名,没有他的介绍。