You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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事件——文件被重命名(包括移去废纸篓)时会触发这个授权事件,这是更直接的拦截点:

  1. 在KAUTH_SCOPE_VNODE的回调中,判断事件类型是否为KAUTH_VNODE_RENAME;
  2. 获取源文件路径和目标路径,验证源文件是否受保护,目标路径是否为废纸篓;
  3. 满足条件时返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:30:31