macOS Kauth API缺少vnode重命名防护,如何阻止文件被移至废纸篓?
解决方案:拦截Finder将文件移至废纸篓的操作
我之前处理过类似的场景,Finder把文件移去废纸篓的操作确实绕开了常规的vnode删除授权——因为它本质是重命名+移动操作,而非直接调用unlink,所以只会触发检测型的fileop事件。这里给你几个可行的替代方案:
方案1:利用KAUTH_SCOPE_FILEOP拦截移动/重命名事件
虽然KAUTH_SCOPE_FILEOP主要是检测型事件,但针对用户空间发起的操作,返回KAUTH_RESULT_DENY是可以阻止行为的。具体做法:
- 在fileop回调中监听
KAUTH_FILEOP_RENAME或KAUTH_FILEOP_MOVE事件; - 检查操作的目标路径是否指向废纸篓:
- 用户个人废纸篓:
~/Library/Trash/(新系统)或/Users/<用户名>/.Trash(旧系统); - 外接磁盘废纸篓:
/Volumes/<磁盘名>/.Trashes/<用户UID>;
- 用户个人废纸篓:
- 同时验证源文件是否属于你要保护的文件集合,若两者都满足,返回
KAUTH_RESULT_DENY即可阻止操作。
方案2:监听vnode的KAUTH_VNODE_RENAME授权事件
你可能之前忽略了vnode scope里的KAUTH_VNODE_RENAME事件——文件被重命名(包括移去废纸篓)时会触发这个授权事件,这是更直接的拦截点:
- 在
KAUTH_SCOPE_VNODE的回调中,判断事件类型是否为KAUTH_VNODE_RENAME; - 获取源文件路径和目标路径,验证源文件是否受保护,目标路径是否为废纸篓;
- 满足条件时返回
KAUTH_RESULT_DENY,直接阻断重命名操作。
方案3:给保护文件添加自定义扩展属性
给需要保护的文件添加一个自定义扩展属性(比如com.yourteam.protected-file),然后统一在两类事件中检查这个属性:
- 在vnode的
RENAME、DELETE事件中; - 在fileop的
MOVE、RENAME事件中;
只要检测到属性存在,就返回拒绝结果。这种方式能统一拦截逻辑,不管操作是通过哪种途径发起的。
方案4:使用文件系统过滤器(File System Filter)
如果kauth方案仍存在漏洞(比如某些工具绕开kauth检测),可以考虑macOS的文件系统过滤器框架:
- 它能在文件系统底层拦截所有
rename、unlink操作,不受进程类型限制; - 不过这个方案开发成本更高,需要熟悉内核扩展或System Extension的API,签名和分发流程也更复杂,适合对拦截强度要求极高的场景。
额外注意事项
- 测试时要覆盖全场景:Finder拖曳、右键菜单操作、终端
mv命令到废纸篓等; - 注意不同系统版本的路径差异:比如Ventura及以后的废纸篓路径和旧系统略有不同;
- 确保kauth listener拥有足够权限,内核级的listener通常能正常工作,但要避免用户空间权限限制。
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

