没有合适的资源?快使用搜索试试~ 我知道了~
020.task_t指针重大风险预报-修复建议篇1
需积分: 0 0 下载量 130 浏览量
2022-08-04
14:17:31
上传
评论
收藏 233KB PDF 举报
温馨提示
试读
12页
引言:大家都知道知名意大利天才少年Luca放出来的针对<=10.2版本的yalu越狱使用的是对 kernel port 的 buffer overflow 拿到
资源详情
资源评论
资源推荐
task_t 指针重大风险预报-修复建议
篇
引言:大家都知道知名意大利天才少年 Luca 放出来的针对<=10.2 版本的 yalu 越狱使
用的是对 kernel port 的 buffer overflow 拿到了 kernel_task_port,本文对类似的
task_t 指针做出了针对性的分析,从 mach 端口背景知识,到 IOkit 的相关处理,最终如
何利用在堆栈上写出 Exploit,最终甚至给苹果团队给出了修复漏洞的建议,由浅入深,
偏辟入里,值得推荐。
本文分三篇推出,分别是分析篇,Exploit 篇,和修复建议篇。
译者注:
·一些诸如 bug,exploit 之类的行话选择性的翻译,这通常取决于句子的流畅性。
·不确定的地方在括号中附注了原句
·超链接附在括号内,方便查看
by ruanbonan
修复建议篇
XNU 不是 Unix 也不是 Mach
在纯净的 Mach 微内核中,使旧任务端口无效已经能够很充分地避免任何其他进程通过
执行权限提升来保持对任务的控制,但是 XNU 不是微内核。之前我们看了把 mach 任务端口
转换成任务结构体指针的内核函数 convert_port_to_task。这个指针可以被使用,并在内
核中传递,而不没有发送消息的开销。例如,当 IOKit 想要控制一个进程的虚拟内存时,
它直接调用相关的内核函数即可,而不必发送 mach 信息给 mach_vm MIG 子系统(理论上来
说是可以这样做的)。
要弄明白这个机制还可以这样想:所有工作在内核中的 MIG 子系统(IOKit,
mach_vm,tasks,threads,semaphores 等等)相互之间都直接连接。他们可以简单地调
用目标函数,而不必通过 MIG IPC 层。这明显快了很多,但是带来了开销。
所有 task_t 指针都是潜在的安全 bug
权衡来看,没有一个有权使用资源的中心点能够被去除。在内核中,当特权执行发生
时,它们不能仅仅让一个任务端口无效,就期望这会起作用,因为内核内部的 MIG 子系统
不使用任务端口,仅仅在处于用户/内核边界时,它们会在任务端口和任务结构体指针之间
做转化。内核不知道在哪里所有的内核指针会指向一个任务结构体;它无法期望去使它们
无效化。
这是一个比最初的引用计数 bug 严重的多的问题。当一个权限提升操作发生时,
execve 不能创建一个新进程;任务结构体保持原状,仅仅是特权改变了。这意味着内核中
每一个单独的 task_t 指针都是一个潜在的安全 bug——在你获得它的权限后,没有锁机制
让你断言一个任务结构体的权限未曾改变,内核代码在某时获得一个任务结构体的权限也
不意味着之后它应该具有这个权限。
在堆上:重写 IOSurface Exploit
实际上,为了让最初的 IOSurface Exploit 在正确的 task_reference(owningTask 调
用时也能有效,我们仅仅需要稍微改变一下。我们不再让子进程把它的任务端口传回给父
进程,而是在子进程中创建一个 IOSurfaceRootUserClient(正确地使用子进程自己的任
务端口),然后把这个 userclient 端口传回给父进程。
然后子进程通过 execve 来执行一个带有 suid 权限的程序,这将会把任务的 EUID 设置
为 0,且不释放任务结构体。父进程依然有给 IOSurfaceRootUserClient 发送消息的权
限,并且这个 userclient 的 owningTask 现在的 EUID 是 0.父进程可以像之前那样继续执
行,阻塞子进程,映射目标的 libc __DATA 段,覆盖一个函数指针并且取消对子进程的阻
塞,这样子进程会尝试退出,并执行 ROP 栈代码。这个新的 Exploit 也绕过了 10.11.6 中
加入的缓解策略,该缓解策略禁止创建带有其他任务的任务端口的 userclient。
注意,这个 Exploit 没有失败的案例——没有竞态条件需要获得,没有可能出错的
UAF。这个 Exploit 应该在所有版本低于 10.11.6 的 OS X 上生效。
这个原始的 exploit 比 UAF 的威力稍微小了一些,UAF 可以帮助你从非常严格的沙箱
中逃逸,而在这个 exploit 中你的确需要调用 execve。这些在堆上储存 task_t 指针的
IOKit 对象仅仅是冰山一角。
在栈上:利用 task_threads
回到用户/内核边界处,当 convert_port_to_task 把一个从用户空间收到的任务端口
转换成任务结构体指针时,这个任务可能执行一个 suid 或者有权限的二进制程序来提升它
的权限。即使这个任务结构体指针没有存储在堆上,仍然可能存在可以利用的 bug。案例
之一是下面的内核 MIG task_threads 方法:
kern_return_t
task_threads(
task_t target_task,
剩余11页未读,继续阅读
焦虑肇事者
- 粉丝: 58
- 资源: 310
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0