4

我正在为 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_PRIVILEGEDflag 确保只有 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()从内核空间获取的方法。

关于对客户进行“正确”身份验证还有其他想法吗?

4

2 回答 2

1

我已经向 Apple 的开发人员技术支持询问了这个问题,他们说唯一受支持的限制用户客户端访问 kexts 的方法是区分 root 和非 root 进程。

就个人而言,为了减少攻击面,放弃用户客户端权限确实很有用。检查特定组成员身份的 Linux 方式似乎也应该在 OS X 上工作。(例如,您通常需要成为“kvm”组的成员才能在 Linux 上使用 KVM 虚拟化技术。)成为该组成员的唯一方法是通过 root 权限(设置 Launch Daemon 的 GroupName 需要 root 权限) 所以这应该是安全的。我自己还没有尝试过,但我有 2 个项目可以做到这一点,所以我会试一试,并用我的发现更新这个答案。

于 2016-02-27T10:06:30.100 回答
1

Apple 已在 AMFI kext(标头)中实现<sys/codesign.h>了可用于从已签名二进制文件中获取 TeamID 的功能。如果此标头是公开的,那么这正是可用于验证连接到 kext 的客户端进程的内容。

/*
 * Function: csfg_get_teamid
 *
 * Description: This returns a pointer to
 *      the teamid for the fileglob fg
 */
const char *
csfg_get_teamid(struct fileglob *fg)
{
    struct ubc_info *uip;
    const char *str = NULL;
    vnode_t vp;

    if (FILEGLOB_DTYPE(fg) != DTYPE_VNODE)
        return NULL;

    vp = (struct vnode *)fg->fg_data;
    if (vp == NULL)
        return NULL;

    vnode_lock(vp);
    if (!UBCINFOEXISTS(vp))
        goto out;

    uip = vp->v_ubcinfo;
    if (uip == NULL)
        goto out;

    if (uip->cs_blobs == NULL)
        goto out;

    /* It is OK to extract the teamid from the first blob
       because all blobs of a vnode must have the same teamid */    
    str = uip->cs_blobs->csb_teamid;
out:
    vnode_unlock(vp);

    return str;
}
于 2016-03-22T14:24:23.063 回答