我正在为 OS X 上的额外安全层构建一个 kext(围绕 KAtuh 构建)。我在用户空间中使用一个通过套接字连接到 kext 的客户端(按照 Apple 的建议),并且基本上控制着 kext。因为该产品应该为 OS X 提供额外的安全性,所以它对攻击“尽可能安全”是很重要的。一种攻击向量如下:A malicious process impersonates the client and sends malicious control data to the kext, disabling the security mechanism.
. 我想通过在连接时进行身份验证来防止这种情况。以下是我的解决方案:
以 root 身份运行客户端,使用
CTL_FLAG_PRIVILEGED
flag 确保只有 root 客户端可以连接到 kext。我不确定我是否想让我的客户端以特权模式运行(再次:额外的攻击向量)。让 kext 只连接到一个客户端。但是,这很容易绕过。
理想情况下,我想验证通过static int ctl_connect(kern_ctl_ref ctl_ref, struct sockaddr_ctl *sac, void **unitinfo)
. 我怎样才能做到这一点?
我也可以在 中进行数据包身份验证static int ctl_set(kern_ctl_ref ctl_ref, u_int32_t unit, void *unitinfo, int opt, void *data, size_t len)
,但是,我必须想出一个动态共享密钥。我在考虑secret = SHA256(getUDID())
,但是 AFAIK 没有可用的加密 KPI,也没有getUDID()
从内核空间获取的方法。
关于对客户进行“正确”身份验证还有其他想法吗?