CVE-学习笔记1

前情提要:

以下是针对一个cve,CVE-2024-45021的处理过程中,相关疑问的搜集报告。

针对CVE 具体的处理流程主要参考以下的链接:

https://zhuanlan.zhihu.com/p/14297194302

CVE官网信息

针对cve 官网中信息的分析

当然可以。你提供的是 CVE 官网(https://www.cve.org) 上某一个特定漏洞记录(CVE-2024-45021)的页面截图。下面我将从结构和内容两个层面,为不熟悉该网站的人员详细解释页面中的各个部分内容和其意义。


✅ 一、网站简介:什么是 CVE 网站?

  • CVE 是 “Common Vulnerabilities and Exposures” 的缩写,中文一般叫“公共漏洞与暴露”。

  • MITRE 机构维护,该数据库为所有公开安全漏洞提供唯一编号(CVE-ID)。

  • CVE 网站的作用是提供公开漏洞的标准描述和参考链接,让安全从业人员、开发人员、维护者可以了解漏洞信息、补丁状态及其影响范围。


🧩 二、页面结构解读:以 CVE-2024-45021 为例


🏷️ 顶部部分:

  • CVE-2024-45021:这是该漏洞的唯一标识号。

  • Published: 2024-09-11 —— 表示首次公开时间。

  • Updated: 2025-05-04 —— 表示最新一次的更新维护时间。

  • CNA: kernel.org:表示是由 kernel.org(Linux 内核社区)报告和维护的漏洞。


📄 Description(漏洞描述):

"memcg_write_event_control(): Fix a User-Triggerable Oops"

  • 表示该漏洞位于 Linux 内核的 memcg_write_event_control 函数中。

  • “User-Triggerable Oops” 指这个函数在特定条件下,会导致用户可触发的“Oops”(一种内核错误崩溃)。

  • 描述指出:漏洞成因是该函数中对指针终止符 NUL 后的数据映射未进行合理校验。

✅ 通俗理解:用户可能传入一个不正确或不完整的内存区域,Linux 内核没有检查就使用它,从而引发系统崩溃。


📦 Product Status(影响版本)

分两部分说明了:

  • 受影响的版本(affected)

  • 不受影响的版本(unaffected)

例如:

受影响版本:
 - Linux 内核在 commit odea116876ef... 到 f1aa7c509aa... 之间
不受影响版本:
 - 5.10.225 ~ 5.10
 - 5.15.166 ~ 5.15
 - ...

✅ 说明哪些 Linux 内核版本中有这个问题,哪些版本已经修复了这个问题。


🔗 References(参考链接)

  • 这里提供了多个指向 git.kernel.org 的链接。

  • 每一个链接都是一次补丁提交(commit),你可以点击查看具体修复了哪一行代码、改了什么逻辑。

✅ 安全研究员、开发者或系统管理员可根据这些 commit 查看漏洞修复详情,或者验证自己系统是否已包含补丁。


🧾 Authorized Data Publishers(数据发布者)

  • 当前主要发布者是 CISA-ADP(美国网络安全和基础设施安全局授权的数据提供者)。

✅ 表示该漏洞数据的权威性和可信度来源。


📌 三、总结一下这个页面的信息价值

项目说明
📌 CVE编号全球唯一的漏洞标识,便于跟踪和沟通
🧠 描述漏洞具体成因与影响,简洁明了
📅 时间公布与更新时间,有助于评估新旧
🧱 影响范围哪些版本有漏洞,哪些没问题
🔧 补丁链接可以直接查看修复内容、确认自己版本是否包含
🔐 数据可信度明确指出由谁报告、谁审定

🧠 适合哪些人看?

  • 系统管理员:查看是否需要打补丁。

  • 内核开发人员:分析漏洞根因、学习修复手法。

  • 安全研究员/分析师:评估影响、撰写通告。

  • 漏洞检测/扫描工具开发人员:编写检测规则。


修复链接

这里的多个补丁的链接,主要是因为有多个linux 的版本。

补丁链接中的实际内容如下:

CVE漏洞验证

验证的测试例来源主要包括:

(1) 提交linux CVE漏洞代码里面是否有描述并且有操作说明或者测试代码

(2) LTP(linux test project)是否有测试代码。此项我们进行了移植和调试,会有单独专文说明,当然网上也有不少文档了

(3) CVE漏洞网站描述是否有验证方法

(4) Linux bugzilla或者maillist是否有

(5) 自己构造测试例子或者测试代码吧,价值体现。[1]

你提到的 “CVE 漏洞验证” 是漏洞处理过程中最关键但也最棘手的一步,确实是现实中让很多开发/安全人员头疼的老大难问题。下面我将按照你列出的五个信息来源,详细介绍 CVE 漏洞验证的基本流程和方法,并通过一个具体例子来帮助你理解实际如何操作。


🧠 一、CVE 漏洞验证的基本来源与策略说明


✅ (1) Linux CVE 提交代码中的验证信息

当 Linux 开发者修复 CVE 漏洞时:

  • 有些会在 commit message 中说明如何复现或验证该漏洞;

  • 也可能提供 PoC(Proof of Concept)代码或触发条件;

  • 如果是用户空间可触发的漏洞,验证起来较容易;

  • 内核崩溃类漏洞一般通过查看 dmesg 输出或触发内核 oops 验证是否修复。

操作方式:

  • 查找补丁(patch)地址,例如来自 kernel.org 或者 github;

  • 仔细阅读 commit 信息,查找关键词如 reproducertestcasecrashOops

  • 查看补丁修改了哪些代码,思考能否构造输入触发这些路径。


✅ (2) Linux Test Project(LTP)测试用例

LTP 是一个社区维护的 Linux 系统功能和稳定性测试套件。

  • 里面很多测试模块就是为了验证特定系统调用的边界行为;

  • 社区会将一些 CVE 测试代码合并进 LTP;

  • 如果 LTP 提供了对应 CVE 的测试用例,可以直接运行确认漏洞是否存在/被修复;

  • LTP 支持用户态测试,因此无需修改内核代码。

操作方式:


✅ (3) CVE 漏洞网站的验证描述

很多 CVE 网站(例如:

有的会提供:

  • 影响范围(受影响的 kernel 版本);

  • 复现条件(需要开启某些内核配置如 CONFIG_MEMCG);

  • 有时还会提供复现链接(如 GitHub PoC)或第三方分析报告。

操作方式:

  • 搜索 CVE 编号;

  • 查找 References 中的复现或测试链接;

  • 看是否有 issue、blog、mailing list 提供 PoC 或运行方式。


✅ (4) Linux Bugzilla 或 mail list 邮件列表

很多补丁来源于社区报告,在下面这些平台可以看到原始复现描述:

操作方式:

  • 搜索关键词如 CVE 编号或函数名;

  • 查看是否有用户描述触发方法(如特定的 syscall 调用顺序);

  • 从描述中提取关键触发行为。


✅ (5) 自己构造测试用例

在没有公开 PoC 情况下,自己手动构造是唯一的出路:

  • 基于补丁内容还原漏洞代码逻辑;

  • 构造调用链模拟漏洞触发路径;

  • 利用 Fuzzing 工具,如 syzkaller、AFL、Trinity 模糊测试内核接口;

  • 记录未打补丁时触发结果(crash/oops),再观察打补丁后是否阻止触发。

关键技巧:

  • 分析 patch 所修改的函数及调用流程;

  • 从 syscall 层或者 /proc/sys 等接口构造输入;

  • 对应内核崩溃的日志必须记录好。


🧪 二、验证例子:CVE-2024-45021(memcg_write_event_control 越界访问)


📌 背景

补丁修改位于:

static ssize_t memcg_write_event_control(struct kernfs_open_file *of, ...)

这个函数负责处理 /sys/fs/cgroup/memory/.../cgroup.event_control 写入事件。攻击者可以通过向该文件写入非法格式的数据触发越界访问。


🔍 验证流程

1️⃣ 阅读补丁内容(见你提供的图片)
  • 漏洞点:buf = endp + 1; 无条件执行,导致越界;

  • 补丁加入 endp[1] 的检查。

2️⃣ 构造触发输入(验证旧内核是否崩溃)

未修复版本内核下执行:

echo -n "5 5" > /sys/fs/cgroup/memory/<group>/cgroup.event_control

可尝试构造不带空格或特殊结构的写入,例如:

echo -ne "12345678" > /sys/fs/cgroup/memory/<group>/cgroup.event_control

🧠 触发后检查 dmesg 中是否出现类似:

BUG: unable to handle kernel NULL pointer dereference
3️⃣ 安装修复内核,重新尝试,观察是否仍会崩溃

🔬 更进一步(构造 PoC)

编写 C 程序,打开 cgroup.event_control 并以写入方式操作:

int fd = open("/sys/fs/cgroup/memory/foo/cgroup.event_control", O_WRONLY);
write(fd, "42 42\n", 5);  // 可尝试越界构造

使用 strace 观察调用是否进入内核后异常中断,或查看 dmesg 是否出现 oops 日志。


📌 三、总结建议

来源适用场景建议
提交代码最直接有效,优先查看补丁中经常包含复现条件
LTP适合标准系统接口验证可集成到 CI 流水线中
CVE 网站适合快速判断影响和范围通常信息不够详细
bugzilla/mail可挖掘社区讨论中的复现方法很多历史资料很有用
自构造最灵活但技术门槛高适合有经验开发者或 fuzz 工具辅助

如果你希望,我可以帮你 基于某个具体的 CVE 编号,编写一个完整的复现脚本(shell/C/fuzz 任选),或者提供自动验证脚本框架。是否需要?

补充

LTP的使用

Strace 命令的使用

参考链接:

1.  linux CVE 漏洞修复 日常工作 https://zhuanlan.zhihu.com/p/14297194302 

### CVE-2021-44228 漏洞详情 CVE-2021-44228 是指在 Log4j 2.x 版本中存在的严重安全漏洞,允许攻击者通过精心构造的日志输入实现远程代码执行 (RCE)[^3]。具体来说,当应用程序日志记录含有特定模式的字符串时,Log4j 尝试解析并处理 JNDI 查询语句,这可能导致连接到由攻击者控制的服务端点,并加载恶意 Java 类文件。 #### 影响范围 受影响版本包括但不限于 Log4j 2.0 至 2.14.1 版本之间的所有发行版。 ### 技术细节 此漏洞利用了 Java 命名和目录接口(JNDI),它通常用于定位分布式资源和服务。如果配置不当或存在未受保护的环境变量,则可能被用来发起针对内部网络基础设施或其他系统的攻击。一旦成功触发 RCE 条件,攻击者就能完全控制系统,安装程序、查看/修改数据甚至创建新账户等操作均成为可能。 ### 复现过程概述 为了验证该漏洞的存在以及理解其工作原理,研究人员常会在隔离环境中设置实验场景来重现问题。例如,在 vulhub 靶场上按照指定路径 `/home/vulhub-master/log4j/CVE-2021-44228` 启动相关服务后,可以通过模拟发送包含特殊字符组合的日志条目给目标应用来进行测试[^2]。 另外也有开发者分享了自己的学习笔记,提供了详细的步骤指导如何构建类似的测试案例,比如使用 `bkfish/Apache-Log4j-Learning` 工具集辅助完成整个流程中的各个环节,从准备必要的依赖项到最后分析结果都进行了详尽描述[^4]。 ### 修复建议 对于已经部署的应用程序而言,最直接有效的措施是尽快升级至最新稳定的安全补丁级别——即至少更新为 Log4j 2.15.0 或更高版本。除此之外: - **移除不必要的功能模块**:禁用任何不使用的特性特别是那些涉及动态查找机制的功能; - **严格审查外部输入源**:确保所有来自用户的输入都被充分过滤净化后再参与任何形式的数据交互活动; - **加强监控力度**:定期扫描现有系统是否存在异常行为迹象以便及时响应潜在威胁事件的发生。 ```bash # 更新命令示例 mvn dependency:update -DgroupId=org.apache.logging.log4j \ -DartifactId=log4j-core \ -Dversion=2.17.1 # 替换成最新的安全版本号 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值