研究实现,演示与 CVE-2021-3490 相关的 Linux eBPF 子系统交互。包含 BPF map 创建、系统调用封装、命名空间设置和验证器分析。仅用于教育和安全研究目的。
CVE-2021-3490 – eBPF 验证器边界跟踪分析 概述
本仓库包含探索 Linux 内核 eBPF 子系统的 C 实现,涉及 CVE-2021-3490,这是一个涉及 eBPF 验证器中 32 位边界跟踪不正确的漏洞。
该项目的目标是理解 bpf() 系统调用的内部工作方式、如何从用户空间创建和管理 BPF map,以及验证器如何处理寄存器约束。这是一个专注于内核内部机制和安全分析的研究与学习项目。
此代码不适用于生产环境。
背景
eBPF 允许用户空间程序将经过验证的字节码加载到 Linux 内核中。在执行之前,内核验证器会检查程序是否:
不执行不安全的内存访问
保持在寄存器边界内
不违反内核安全规则
在易受攻击的内核版本中,验证器在某些 ALU 操作期间错误地跟踪了 32 位边界。此缺陷可能允许特制程序绕过验证逻辑。
官方详情:
Ubuntu 安全公告: https://ubuntu.com/security/CVE-2021-3490
Red Hat 安全通告: https://access.redhat.com/security/cve/CVE-2021-3490
本项目演示内容
此实现重点包括:
直接使用 bpf() 系统调用
手动定义 union bpf_attr
BPF map 创建 (BPF_MAP_TYPE_ARRAY)
更新和查询 map 元素
获取 BPF 对象元数据
用于受控执行的命名空间设置
它旨在帮助理解用户空间如何与内核 BPF 基础设施交互。
本仓库不包含自动漏洞利用 payload 逻辑。
测试环境
Ubuntu 20.10 (Groovy)
Linux kernel 5.8.0-48-generic
你可以使用以下命令检查内核版本:
uname -r
在已修补或较新的内核上,行为可能有所不同。
构建
使用 GCC 编译:
gcc -o exploit exploit.c -lpthread
除标准 Linux 头文件外,不需要外部库。
使用方法
运行程序:
./exploit
程序将:
配置用户和网络命名空间
创建一个 BPF map
插入一个元素
查询 map 元数据
显示执行结果
安全声明
本项目仅用于:
教育目的
内核安全研究
理解 eBPF 内部机制
受控实验室环境
未经适当授权,请勿在系统上运行此代码。
学习目标
通过本项目,你可以了解:
Linux 内核如何暴露 BPF 接口
BPF map 如何结构化
验证器逻辑如何与用户空间输入交互
如何手动构造低级系统调用