内核授权文件操作范围在小牛队中已损坏
Kernel Authorization File Operation Scope broken in Mavericks
我开发了一个系统,需要使用 kext 监控文件,它注册到文件操作范围 (KAUTH_SCOPE_FILEOP)。在OSX 10.8及更早版本中,一切都按预期工作,程序的执行将提供开始执行的程序所需的pid,ppid和文件名。
在虚拟节点范围内,我按照"Mac OS X Internals"一书中的建议在回调中检索 pid,如下所示: -
data.pid = vfs_context_pid((vfs_context_t)arg0);
对于我使用的文件范围:-
proc_t self = proc_self();
data.pid = proc_pid(self);
proc_rele(self);
我在 Mavericks 中看到的问题发生在应用程序通过 xpc 生成帮助程序应用程序时。例如,安装软件包 (.pkg) 会启动 Apple 的安装程序,该安装程序使用关联的"运行器"帮助程序应用程序。
当 filescope 报告执行"runner"时,文件路径是正确的,但报告的 pid 和 ppid 是父应用程序安装程序的 pid 和 ppid,而不是帮助程序应用程序的 pid 和 ppid。
测试时,注册到 VNode 范围 (KAUTH_SCOPE_VNODE) 会报告正确的 pid 和 ppid。
如Apple文档中所述,文件操作范围可用于实施防病毒扫描程序。
在这种情况下,如果将帮助程序应用的 pid 和 ppid 报告为其父应用的 pid 和 ppid,则可能无法检测到帮助程序应用。
有人可以告诉我在 Mavericks 中注册文件操作范围时如何检索帮助程序应用程序的正确 pid 和 ppid 吗?
问题是由于Apple正在用posix_spawn替换对fork/exec的调用。
posix_spawn的性质意味着在创建实际进程之前通知文件范围,这是看到父 pid 而不是子 pid 的原因。
KAuth 和文件范围早于 posix 生成,这就是它在这种情况下无效的原因。
解决方案是改用 VNode 作用域。
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 变量周围的堆栈'sortArray'已损坏
- 变量周围的堆栈'folderPath'已损坏
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- AES-128 CFB-8解密的前16个字节已损坏
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 图像在本地主机上显示已损坏
- 检查工作正常的 CXX 编译器:/cygdrive/c/cygwin64/bin/clang++ -- 已损坏
- 数组变量周围的堆栈已损坏
- 运行时检查失败 - 变量周围的堆栈已损坏
- 串行端口的传入值有时已损坏或丢失
- 内核授权文件操作范围在小牛队中已损坏