【发布时间】:2016-02-01 13:18:48
【问题描述】:
我正在为 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标志确保只有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() 的方法。
关于对客户端进行“正确”身份验证还有其他想法吗?
【问题讨论】:
-
我也很好奇这样做(以及授权其他内核调用)的最佳方式。一种选择是为您的守护程序设置一个专用的非特权用户,并检查尝试连接的进程的 EUID 的 UUID。我不确定这一定是苹果希望你这样做的方式。无论如何,我会尽快为此添加赏金,如果没有人回答,我可能会提交 DTS 请求。
-
@pmdj 您是否知道一种从以太网或 WiFi 卡的内核空间获取 MAC 地址并将其用作动态验证码的方法?
-
我不确定它有多安全,但是您可以找到系统中所有以太网设备的 IOEthernetController 和/或 IOEthernetInterface 实例,并查询它们。我不太确定这将如何帮助解决这个问题,因为 MAC 地址很容易获得。
-
仅供参考,我已经为此提交了 DTS 请求,因为了解我们的两个项目也会很有用。我怀疑解决方案可能只允许根进程。 :-/
-
一种可能性是在 kext 加载时为
KAUTH_FILEOP_EXEC注册一个 KAuth 侦听器并跟踪所有执行的进程;他们的 procname、二进制路径、pid、ppid 等。然后在ctl_connect中基于proc_selfname()和proc_selfpid()以及其他一些公共 KAuth 函数进行一些路径验证。然而问题是 kext 需要在引导链的早期加载。
标签: sockets security authentication kernel-extension xnu