漏洞详情
-
受影响产品:Parallels Desktop for macOS [2] -
受影响主机:基于x86_64的主机(搭载Intel处理器的Mac) -
受影响版本:16.0.0 至 19.3.0 -
修复版本:19.3.1 -
CVE编号:CVE-2024-34331
漏洞发现
程序SUID位的魔力
-
UID (User ID) - 实际用户标识:指启动进程的用户的实际用户ID。例如,如果以用户名 alice
登录系统,那么该进程的UID就是alice
的用户ID。 -
GID (Group ID) - 实际组标识:指启动进程的用户所属的实际组的组ID,表示用户所属的组。例如,如果 alice
属于组developers
,那么该进程的GID就是developers
的组ID。 -
EUID (Effective User ID) - 有效用户标识:在程序运行时用于权限检查的用户ID。它可以与UID相同,也可以不同,这取决于程序是否设置了特殊权限位,如Set-User-ID(SUID)。当程序具有SUID权限时,EUID通常会变为程序文件的所有者的用户ID。这允许程序以文件所有者的权限运行,通常用于提供临时的权限提升,例如 passwd
命令。 -
EGID (Effective Group ID) - 有效组标识:在程序运行时用于权限检查的组ID,程序具有SGID权限时,EGID通常会变为程序文件的所有者的组ID。 -
SUID (Set-User-ID) - 设置用户标识:SUID是一种文件权限,用于可执行文件,当设置了SUID位的可执行程序运行时,它的EUID将变为文件所有者的UID,而不是启动进程的实际UID。典型的例子是 passwd
程序,它需要以root权限更改密码。 -
SGID (Set-Group-ID) - 设置组标识:SGID是一种文件权限,类似于SUID,但是针对组。例如,某些目录需要以特定组的权限运行,以便其他用户可以访问其中的文件。 -
FSUID (Filesystem User ID) - 文件系统用户标识:在文件系统级别上用于权限检查的用户ID,确保文件系统上的访问权限正确。 -
FSGID (Filesystem Group ID) - 文件系统组标识:在文件系统级别上用于权限检查的组ID。
ls -la /usr/bin/top
# 输出结果为
-r-sr-xr-x 1 root wheel 273520 6 15 2023 /usr/bin/top
top
命令。/usr/bin/find . -perm -u=s
Parallels历史权限提升漏洞
int
main (argc, argv, env)
int argc;
char **argv, **env;
{
. . .
running_setuid = uidget ();
. . .
if (running_setuid && privileged_mode == 0)
disable_priv_mode ();
. . .
shell_initialize ();
. . .
if (locally_skip_execution == 0 && running_setuid == 0)
{
. . .
run_startup_files ();
/* Fetch the current set of uids and gids and return 1 if we're running
setuid or setgid. */
static int
uidget ()
{
uid_t u;
u = getuid ();
. . .
current_user.uid = u;
current_user.gid = getgid ();
current_user.euid = geteuid ();
current_user.egid = getegid ();
/* See whether or not we are running setuid or setgid. */
return (current_user.uid != current_user.euid) ||
(current_user.gid != current_user.egid);
}
void
disable_priv_mode ()
{
setuid (current_user.uid);
setgid (current_user.gid);
current_user.euid = current_user.uid;
current_user.egid = current_user.gid;
}
-
CVE-2023-27322(ZDI-23-216)- 通过Parallels服务进行本地权限提升
__text:000000010000603B loc_10000603B: ; CODE XREF: child_process+4D↑j
__text:000000010000603B ; child_process+68↑j
__text:000000010000603B call _geteuid
__text:0000000100006040 test eax, eax
__text:0000000100006042 jnz short loc_10000605B
__text:0000000100006044 call _getuid ; when effective uid is 0
__text:0000000100006049 mov ebx, eax
__text:000000010000604B call _geteuid
__text:0000000100006050 cmp ebx, eax ; check real uid == effective uid
__text:0000000100006052 jz short loc_10000605B
__text:0000000100006054 xor edi, edi ; uid_t
__text:0000000100006056 call _setuid ; setuid(0)
__text:000000010000605B
__text:000000010000605B loc_10000605B: ; CODE XREF: child_process+E2↑j
__text:000000010000605B ; child_process+F2↑j
__text:000000010000605B call _getuid
__text:0000000100006060 test eax, eax
__text:0000000100006062 jz short loc_1000060B9
__text:0000000100006064
__text:0000000100006064 loc_100006064: ; CODE XREF: child_process+162↓j
__text:0000000100006064 mov rdi, [r14] ; __path
__text:0000000100006067 mov rsi, r14 ; __argv
__text:000000010000606A call _execv
execv
函数是对 execve
的一个包装,它使用 _NSGetEnviron()
获取环境变量并将其传递给 execve
。因此,作为子进程生成的 Bash shell 可以访问由启动 Parallels Service 的用户设置的所有环境变量,该用户可能是一个非特权用户。最终通过使用bash特权模式参数“-p”修复了此漏洞。-
CVE-2023-27324 (ZDI-23-218)和 CVE-2023-27325(ZDI-23-219),通过Parallels Updater进行本地权限提升。这两处漏洞是在Parallels Updater prl_update_helper 二进制文件中发现的。在CVE-2023-27324中,prl_update_helper 二进制文件调用一个名为 inittool 的bash脚本,而无需设置特权模式: snprintf(&script_path, 0x400uLL, "%s/Contents/MacOS/inittool", appbundle_path);
__argv[0] = &script_path;
__argv[1] = "install";
__argv[2] = "-t";
__argv[3] = target_path;
__argv[4] = 0LL;
. . .
v48 = posix_spawn(&v47.st_dev, &script_path, 0LL, 0LL, __argv, &_envp);在调用 inittool
脚本之前,将真正的用户标识符设置为有效用户标识符,即root。这意味着bash将作为root运行,并将信任其执行环境,这可能会导致本地特权升级:__text:0000000100005B90 start proc near
. . .
__text:0000000100005B90
__text:0000000100005B90 push rbp
__text:0000000100005B91 mov rbp, rsp
__text:0000000100005B94 push r15
__text:0000000100005B96 push r14
__text:0000000100005B98 push rbx
__text:0000000100005B99 sub rsp, 0CD8h
__text:0000000100005BA0 mov rax, cs:___stack_chk_guard_ptr
__text:0000000100005BA7 mov rax, [rax]
__text:0000000100005BAA mov [rbp+var_20], rax
__text:0000000100005BAE cmp edi, 2
__text:0000000100005BB1 jnz short loc_100005BD9
__text:0000000100005BB3 mov rbx, rsi
__text:0000000100005BB6 call _geteuid
__text:0000000100005BBB test eax, eax
__text:0000000100005BBD jz short loc_100005BF3 ; if effective uid == 0
. . .
__text:0000000100005BF3 loc_100005BF3: ; CODE XREF: start+2D↑j
__text:0000000100005BF3 xor edi, edi ; uid_t
__text:0000000100005BF5 call _setuid ; setuid(0)可以通过使用 BASH_ENV
环境变量或导出shell函数dirname
来利用此漏洞:而 CVE-2023-27325 会影响从 inittool
脚本调用的inittool2
可执行文件。与Parallels Service
一样,inittool2
fork 子进程,并使用调用为/bin/bash -s
的非交互式bash shell执行嵌入式脚本,漏洞利用方式与CVE-2023-27324相似。修复方案是,在调用posix_spawn
时,envp
参数没有将environ
数组传递给子进程,而是提供了指向NULL数组的指针,并向inittool
脚本的解释器以及inittool2
中的嵌入式脚本中添加了bash特权模式“-p”。
历史总是惊人的相似
-
创建一个 macOS 安装程序应用,其中包含位于 Contents/Resources/createinstallmedia 下的恶意载荷; -
让 Parallels Desktop 打开该应用程序,并准备进行安装:
i. prl_client_app 获取恶意的 macOS 安装程序应用;ii. prl_client_app 运行 Parallels Service; iii. Parallels Service 运行 setuid,提升为 root 权限; iv. Parallels Service 运行 repack_osx_install_app.sh; v. repack_osx_install_app.sh 以 root 权限运行 createinstallmedia。
总结
Create macOS Installer.tool
的脚本,位于VMware Fusion.app/Contents/Library/
下,该脚本试图手动创建有效的安装程序,并绕过对createinstallmedia的使用。hdiutil
创建类似于VMware Fusion的磁盘映像。并且Parallels添加了对基于createinstallmedia的虚拟机的支持,同时检查主机是否可以使用它,所以不会在M系列芯片平台的Mac上触发漏洞。以下错误消息是由ParallelsVirtualizationSDK.framework
在M芯片Mac上尝试使用macOS安装程序时生成的:Reference
原文始发于微信公众号(山石网科安全技术研究院):CVE-2024-34331:Parallels Desktop权限提升漏洞分析
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论