
用于在用户态进程中为 pid 和 objc 提供方创建陷阱节点的 /dev/fasttrap 设备具有权限 666。与同样是 666 的 /dev/dtrace 不同,fasttrap 缺少权限检查。这使得任何进程都可以发起 FASTTRAPIOC_MAKEPROBE 或 FASTTRAPIOC_GETINSTR ioctl 调用。
攻击者可以利用 FASTTRAPIOC_MAKEPROBE 在任何其他进程中的任意内存位置创建探针。当这些探针被激活时,指定内存位置的值会被替换为陷阱指令(在 x86 上是 0xCC),而原始值则被存放在影子内存中。通过 FASTTRAPIOC_GETINSTR ioctl 可以恢复原始值。这允许攻击者通过放置多个陷阱来读取另一个进程的任意内存。
此漏洞被追踪为 CVE-2020-27949,在 macOS Big Sur 11.1、Security Update 2020-001 Catalina、Security Update 2020-007 Mojave 中已修复。
0xCC)写入其他在 DTrace 下执行的进程的任意内存位置。甚至可以写入以 root 身份运行的进程的内存。通过修改其他指令或跳转地址,可以改变目标进程的控制流,从而实现权限提升。作为用户,我期望启用 DTrace 只允许拥有 root 权限的进程对其他进程进行跟踪、检测或修改。DTrace 是用于管理任务的宝贵工具,提供诸如 dtruss、iotop 等实用程序。
我们的目标(target)是一个以 root 身份运行的可执行文件。攻击者(memaccess)是一个以普通用户权限运行的可执行文件。追踪脚本 libc_monitor.d 记录对 libsystem_c.dylib 共享对象中函数的调用次数(这只是一个简单的示例,演示机器所有者可能会运行的管理脚本)。
libc_monitor.d)中发生。FASTTRAPIOC_GETINSTR 读取创建的探针的内存值。第 4 步会用陷阱指令值替换目标进程中的内存。根据应用程序的不同,攻击者可以利用此操作将已知值写入关键内存位置。例如,攻击者可能控制随机数生成器的种子或替换进程中的加密密钥。
注意:攻击者始终不需要提权或 root 权限。
注意2:不需要自写的 DTrace 脚本。例如,dapptrace 也使用 pid 提供方来追踪任意函数。
在 /dev/fasttrap 中实现权限检查,如同 /dev/dtrace 一样,或者移除全局可写权限。
注意:我们未检查已发布的修复。
target 并按照屏幕上的提示操作