网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

漏洞公告团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 网络安全 > 漏洞公告 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

macOS 10.14.6 (18G87) -由于wait_for_namespace_event()中的竞争条件,导致内核使用后释放

文章来源:重庆网站建设 发布时间:2019-12-19 09:46:37 围观次数:
分享到:

摘要:bsd vfs vfs_syscalls c中的XNU函数wait_for_namespace_event()释放一个文件描述符供用户空间使用,但是随后可能会使用fp_free()销毁该文件描述符,fp_free()会无条件地释放fileproc和fileglob。

bsd/vfs/vfs_syscalls.c中的XNU函数wait_for_namespace_event()释放一个文件描述符供用户空间使用,但是随后可能会使用fp_free()销毁该文件描述符,fp_free()会无条件地释放fileproc和fileglob。这打开了一个竞争窗口,在此期间,进程可以在这些对象被释放时操作它们。利用需要根特权。


可以从fsctl(FSIOC_SNAPSHOT_HANDLER_GET_EXT)访问函数wait_for_namespace_event();它用于监听文件系统事件以生成快照。下面是代码中的漏洞路径:

static int
	wait_for_namespace_event(namespace_handler_data *nhd, nspace_type_t nspace_type)
	{
	...
			error = falloc(p, &fp, &indx, ctx);
			if (error) goto cleanup;
			fp_alloc_successful = true;
	...
			proc_fdlock(p);
			procfdtbl_releasefd(p, indx, NULL);
			fp_drop(p, indx, fp, 1);
			proc_fdunlock(p);
	...
			error = copyout(&nspace_items[i].token, nhd->token, sizeof(uint32_t));
			if (error) goto cleanup;
	...
	cleanup:
			if (error) {
				if (fp_alloc_successful) fp_free(p, indx, fp);
	...
	}

首先,使用falloc()分配文件描述符(indx)和fileproc (fp)。此时文件描述符已被保留,因此用户空间无法使用。接下来,调用procfdtbl_releasefd()来释放文件描述符供用户空间使用。在后续的proc_fdunlock()之后,进程中的另一个线程可以通过另一个syscall访问该文件描述符,即使wait_for_namespace_event()仍然在运行。


这是有问题的,因为在错误路径wait_for_namespace_event()中(如果copyout()失败,可以到达)期望能够使用fp_free()释放文件描述符。fp_free()是一个非常特殊的函数:它将清除文件描述符,释放fileglob,释放fileproc,而不考虑是否在其他地方引用了fileproc或fileglob。


违反这些期望的一种方法是在proc_fdunlock()和fp_free()之间调用fileport_makeport()。理想的利用情况是,在使用fp_free()释放fileglob之前创建一个fileport,它持有对fileglob的引用,在fileport中留下一个悬空的fileglob指针。在实践中很难达到那种状态,但我相信这是可能的。


附加的POC应该会引发内核恐慌。POC的工作方式如下:首先,创建并挂载一个HFS DMG,因为到达wait_for_namespace_event()的惟一路径将通过HFS驱动程序。接下来,创建几个racer线程,这些线程反复尝试调用fileport_makeport()。然后,调用fsctl(FSIOC_SNAPSHOT_HANDLER_GET_EXT)来阻塞wait_for_namespace_event()。传递给fsctl()的namespace_handler_info_ext结构设置为最后一次调用copyout()将失败,这将导致调用fp_free()。最后,为了触发这个bug,另一个进程在挂载的HFS DMG上创建并删除一个目录,这将导致nspace_snapshot_event()生成一个wait_for_namespace_event()正在等待的事件。通常情况下,这将生成一个恐慌消息“已释放的区域元素已被修改”。


本文由 重庆网站建设 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:macOS 10 14 6 (18G87) wait_for_namespace_event竞争条件 内核释放

上一篇:TP-Link已发布修补程序解决TP-Link Archer系列路由器漏洞可使Admin账户密码保护失效的问题
下一篇:新的WhatsApp漏洞导致群组聊天崩溃,造成历史聊天记录永久被删除

热门资讯

鼠标向下滚动