BlockSec 团队在 Solana 的 rBPF 中发现了一个安全漏洞,该漏洞可能导致合约执行路径错误。该漏洞存在于 rBPF 的较新版本中(0.2.26 到 0.2.27)。BlockSec 团队及时向 Solana 安全团队报告了该漏洞,Solana 团队迅速确认并修复了该问题,并授予 BlockSec 团队价值 40 万美元的 SOL 代币奖励。
今年四月,我们的漏洞检测系统在 Solana 的 rBPF 中发现了一个问题(即,所有 Solana dApp 运行的虚拟机:https://github.com/solana-labs/rbpf)。经过仔细调查,我们发现这是一个安全漏洞,可能导致合约的错误执行路径。我们已将该漏洞报告给 Solana 安全团队,该团队立即确认并修复了该漏洞。此外,他们还向我们的团队授予了价值 $400,000$ 美元的 SoL 代币。
该漏洞存在于较新版本的 rBPF(0.2.26 到 0.2.27)中。当我们报告该问题时,主网上使用的验证器尚未升级到受影响的版本。我们的系统在受影响的版本合并之前检测到该问题,这使得主网的验证器免受此漏洞的影响。
我们在下面详细阐述此漏洞的详细信息。
eBPF (Extended Berkeley Packet Filter) 最初是为过滤内核中的数据包而开发的。由于 eBPF 的安全性、效率和可扩展性,它现在被用于各种领域,如网络、跟踪、分析等(etc)。考虑到 eBPF 的丰富功能,Solana 使用它作为智能合约的执行引擎。为了在 Solana 上构建 dApp,开发人员使用 Rust 开发他们的智能合约,并将合约编译成 eBPF 字节码。
Solana 使用 rBPF,一个用 Rust 编写的虚拟机,来执行编译后的 BPF 字节码。然而,所提出的虚拟机(即 rBPF)是否健壮、安全和精确是未知的。如果 rBPF 内部存在安全问题,则所有包含 rBPF 的验证器都可能受到影响,从而导致整个 Solana 网络的巨大损失(例如,资金损失)。
我们开发了一个工具,可以自动定位 rBPF 的实现错误并定期扫描 rBPF 的代码。在扫描过程中,我们在 rBPF(版本 0.2.26)中发现了一个严重问题,这可能会导致合约的错误执行路径。
具体来说,sdiv
指令用作有符号除法指令,作为 rbpf 0.2.26 中默认启用的功能引入。sdiv
支持 32 位(即 sdiv32
)和 64 位(sdiv64
)操作数的除法。对于指令 sdiv32
,计算结果存储在 bpf 寄存器中,这是一个 64 位的寄存器。但是,如果 sdiv32
指令之后的指令以 64 位读取计算结果,则结果可能会有所不同。这是因为 rBPF 在 JIT 编译期间没有将 sdiv32
的计算结果扩展为正确的 64 位值(https://github.com/solana-labs/rbpf/blob/5ab331efbb13f608c384395e94686d122b657435/src/jit.rs#L909-L911)。
例如,如果一个正数(即 12)被一个负数(即 -4)用 sdiv32
除,则正确的结果在 32 位和 64 位中都应该是 -3
。下面的代码是一个例子。
在 JIT 和解释模式下运行和跟踪它之后,我们可以观察到它们之间的差异:
0 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000] 29: lddw r5, 0x10000000c
1 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 000000010000000C, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000] 31: sdiv32 r5, -4
2 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, FFFFFFFFFFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000] 32: jslt r5, 0, lbb_7
3 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, FFFFFFFFFFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000] 36: exit
0 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000] 29: lddw r5, 0x10000000c
1 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 000000010000000C, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000] 31: sdiv32 r5, -4
2 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 00000000FFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000] 32: jslt r5, 0, lbb_7
3 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 00000000FFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000] 33: lddw r0, 0x1
4 [0000000000000001, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 00000000FFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000] 35: exit
在解释模式下,寄存器 r5
设置为 0xFFFFFFFFFFFFFFFD
(在 32 位和 64 位模式下都是 -3
),而在 JIT 模式下,r5
设置为 0x00000000FFFFFFFD
。在这种情况下,对于接收 64 位值的指令 jslt
,r5
将被识别为正数(即 0x00000000FFFFFFFD
)。之后,执行路径将完全错误。
这种错误的实现可能导致合约的错误执行路径,并可能导致严重的问题。
例如,如果智能合约中的一项基本操作依赖于 sdiv32
指令的结果,则可能导致不正确的执行结果并被攻击者滥用。
此问题是在 https://github.com/solana-labs/rbpf/pull/283 中引入的,这意味着 rBPF 从 0.2.26 版本开始容易受到攻击。我们发现了该问题,并在 2022 年 4 月 28 日将其报告给了 Solana 安全团队。该团队迅速响应了我们的报告,并在几个小时内通过为 sdiv32
指令添加符号扩展操作来修复了该问题。修复位于 https://github.com/solana-labs/rbpf/pull/310。由于我们团队的及时检测和报告,主网的验证器不受此漏洞的影响。
此问题被归类为协议活跃性错误,导致 Solana 授予了 $$400,000$ 的漏洞赏金。
BlockSec 团队专注于区块链生态系统的安全,并与领先的 DeFi 项目合作以保护他们的产品。该团队由来自学术界和行业的顶尖安全研究人员和经验丰富的专家组成。他们曾在著名会议上发表多篇区块链安全论文,报告了多个 DeFi 应用程序的零日攻击,并发布了具有重大影响的安全事件的详细分析报告。
- 原文链接: blocksecteam.medium.com/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!