问题描述
我正在尝试端点安全系统扩展,以防止用户删除我的应用数据。
我使用“ES_EVENT_TYPE_AUTH_UNLINK
”来阻止用户删除应用文件。
解决方法
遗憾的是,没有官方方法可以使用 Endpoint Security 执行您想要的操作:没有与任何钥匙串操作相关的此类事件。
您可以在 Endpoint Security 中使用所需的新事件向 Apple 提交请求,以使其以官方方式可行,但他们几乎总是不关心此类请求。
虽然,使用间接方法可能实现您想要的效果,但这需要您付出很多额外的努力。
用户钥匙串的文件通常存储在 ~/Library/Keychain 中。例如,有一个 login.keychain-db 文件,它很可能是一个 sql-lite 数据库,其中存储了所有钥匙串数据。
值得一提的是,就我而言,我无法直接打开它,因为我的 sql 查看器说它受密码保护。
所以您可以做的是创建一个您认为正常的状态的钥匙串文件的备份,然后在 Endpoint Security 中侦听当前钥匙串文件的写入事件。
您将无法拒绝此类事件,但您可以做的是在此操作后立即锁定钥匙串文件(就是这样,使用 Endpoint Security,您应该拒绝任何其他使用钥匙串数据库文件的文件操作一段时间),然后搜索您确定希望出现在钥匙串中的钥匙串项目。
您需要从用户上下文执行此操作,并且 Endpoint Security 在根上下文中运行,因此这是您需要代理的地方(如果您在守护进程中使用 ES aa libs)/UI 应用程序(如果您使用 ES作为系统扩展)和它们之间的 IPC。
如果搜索结果是肯定的,则说明用户没有删除您想要的记录,所以您可以解锁钥匙串文件并高兴。
否则,我建议您只从备份中恢复钥匙串文件(您可以在 ES 中允许从您的应用程序进行操作,因为您知道您需要它),这样有效地看起来用户还没有从钥匙串中删除您的记录.
如果此时钥匙串文件正在使用中,这可能是一个问题。 (钥匙串应用程序可能持有文件描述符) 如果是这样,我建议调用普通 API,然后从代理手动将需要的项目读取到钥匙串中。
这可能需要您解析备份钥匙串文件,或将您的项目单独存储在其他地方,但可以克服。
这种方案可能会在没有任何保证的情况下运行一段时间,并且可能会被 Apple 随时破坏。