Vault Labs, HardenedVault
Linux内核漏洞CVE-2021-26708
Alexander Popov 于2021年发表了一篇文章 Four Bytes of Power:Exploiting CVE-2021-26708 在 Linux 内核中使用四字节覆盖漏洞来执行权限提升,这篇文章详细的分析和记录了提升root权限的漏洞利用全过程。简单总结,该漏洞有几个步骤如下
1.在可预测的地址上分配一个“good msg”:在vsock上赢得竞态;从/dev/kmsg中读取堆信息泄漏地址后使用msgsnd()分配一个“good msg”到那个泄漏地址上。
2.针对“good msg”任意释放:在vsock上赢得竞态;以泄漏地址覆写msg->security;使用失败的msgsnd分配一个污染的msg并且释放msg->security。需要注意的是“good msg”可以被释放但它依然存在msg队列中,而这让UAF(user-after-free)变得可行。
3.任意写“good msg”:任意读可以通过 setxattr 在“good msg” 的地址处分配对象,然后覆写。
4.从“good msg”中任意读:使用msgrcv()泄漏vsk结构体内容。
6.类似step-4:搜索堆上特殊flag以获得sk_buff地址。
7.类似step-2:释放 sk_buff。
8.类似step-3:覆写sk_buff函数指针以劫持执行流。
9.构建ROP链进行提权。
This is the way: sshd
您可能会注意到,步骤 4 能够获取owner_cred泄露的地址,而步骤 2 可以实现任意释放,cred 结构在特殊的slab缓存中分配:cred_jar。如果创建了多个特权进程,并且同时释放了cred指针(或者特权进程的创建时间比释放的cred指针晚一点),那么其中一个进程的cred可以位于释放的地址,这使得权限提升成为可能,sshd 似乎是我们需要的特权进程,登录完成后的 ssh 连接有两个进程:
$ ps -axu|grep ssh
USERPID %CPU %MEMVSZRSS TTYSTAT STARTTIME COMMAND
...
root9240.60.543876 10576 ?Ss01:470:00 sshd: victim [priv]
victim9390.00.3437766196 ?S01:470:00 sshd: victim@pts/0
...
在没有完成登录的情况下与目标的ssh连接将如下所示:
$ ps -axu|grep ssh
USERPID %CPU %MEMVSZRSS TTYSTAT STARTTIME COMMAND
sshd9880.00.2305645676 ?S01:540:00 sshd: victim [net]
客户端ssh的权限无关紧要,因为sshd(其用户默认为 root)将建立连接,sshd将等待密码输入,直到超时,这些机制会使漏洞利用编写工作更容易,以下为基本步骤:
1.在可预测的地址上分配一个“good msg”:在vsock上赢得竞态;从/dev/kmsg中读取堆信息泄漏地址后使用msgsnd()分配一个“good msg”到那个泄漏地址上。
2.针对“good msg”任意释放:在vsock上赢得竞态;以泄漏地址覆写msg->security;使用失败的msgsnd分配一个污染的msg并且释放msg->security。需要注意的是“good msg”可以被释放但它依然存在msg队列中,而这让UAF(user-after-free)变得可行。
3.任意写“good msg”:任意读可以通过 setxattr 在“good msg” 的地址处分配对象,然后覆写。
4.从“good msg”中任意读:使用msgrcv()泄漏vsk结构体内容。
5.准备多个 “ssh user@target&” 在主机上但先别运行。
6.类似step-2,任意释放owner_cred。在owner_cred被释放后执行上面的ssh连接命令。其中一个sshd的cred会定位在owner_cred上以实现提权目的。
结果:
[victim@hardenedvault ~]$ uname -a
Linux hardenedvault 5.10.11-200.fc33.x86_64 #1 SMP Wed Jan 27 20:21:22 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[victim@hardenedvault ~]$ id
uid=1001(victim) gid=1001(victim) groups=1001(victim) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[victim@hardenedvault ~]$ ./cve-2021-26708
[+] finish init userfaultfd:
pagefault addr: 5004000
[+] try to get addr of good msg_msg...
[+] 1598'th finished get addr of good msg_msg
[+] get the address of good msg after 1598 trys
[+] addr_of_good_msg: 0xffff977a85f71340
[+] addr_of_vsk: 0xffff977a8555e600
[+] adapt the msg_msg spraying payload:
msg_ptr0x5003fd8
m_type1337 at 0x5003fe8
m_ts6096 at 0x5003ff0
msgsegnext 0xffff977a8555e600 at 0x5003ff8
[+] prepare setxattr threads...
[+] start read userfault...
[+] Start free good msg...
[+] msgsnd failed: msg->security maybe freed
[+] intriguring userfaultfd page fault(msg)
pagefault address: 5004000 flags: 0
[+] try to read kernel leak...
[+] 8177'th finished read the leak
[+] read leak:
sk_def_write_space:ffffffff939851b0
owner_cred:ffff977a83e15600
sk_memcg:ffff977a85549000
[+] Start free cred...
[+] msgsnd failed: owner cred maybe freed !!!
[+] 100'th free owner_cred, waitting for sshd
[root@hardenedvault ~]# id
uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:unconfined_t:s0-s0:c0.c1023
关于sshd辅助堆喷cred-jar的细节
一个步骤完成漏洞利用是否可能?
事实上是可能的,但需要创建一个特殊的进程,该进程在任意释放owner_cred之前创建一个进程,并等待owner_cred被释放以及启动ssh到localhost。
ssh登录与否?
sshd可能会因超时而终止,ssh登录效果会更好,在这种情况下,当sshd终止时会出现内核崩溃,但时间窗口对于攻击者来说足够了!可以在/etc/ssh/sshd_config中配置 LoginGraceTime。
多个ssh效果更好?
由于cred_jar缓存可能会受到其他进程的影响,所以运行多个 ssh 会更稳定。
限制
目标机器必须开启ssh服务器
显然,在目标计算机上运行的 ssh 服务器对于权限提升是必需的,我们还没有调查是否可以在一个非特权进程上触发创建特权进程来帮助cred_jar堆喷,如果进程满足以下条件:
1.非特权进程可以让目标创建特权进程。
2.一个特权进程对一个非特权进程的响应。
3.特权进程具有较长的生存期。
然后可以用来做cred_jar堆喷。
被其他进程影响
如果目标机器是执行创建并终止了大量进程的服务器,则权限可能会受到它们的影响。
PoC和防御
测试过的GNU/Linux发行版和内核版本?
公开版本仅针对Federa 33 和5.10.11-200.fc33.x86_64进行过测试。
PoC/Exploit是开源的吗?
是的,可以在Vault Range PoC中找到.
有关于防御建议吗?
针对此漏洞利用,有很多有效的防御缓解措施,但赛博堡垒这里想指出的是,某些缓解措施比其他缓解措施更重要,纯数据污染攻击可以通过任意写入来实现,这可能会在两个阶段绕过大多数缓解措施:利用阶段(exploitation stage)和后利用阶段(post-exploitation stage)。PaX/GRsecurit的KERNSEAL/AUTOSLAB是一个非常出色的缓解措施,因为它可以针对前漏洞利用阶段(pre-exploitation stage)进行安全防护的同时保障性能。
Mitigation |
Pre-exploitation |
Exploitation |
Post-exploitation |
Bypassable |
PaX RAP |
N |
Y |
N |
L4: Hardcore |
PaX KERNSEAL/AUTOSLAB |
Y |
N |
N |
L5: Nightmare |
VED wCFI |
N |
Y |
N |
L3: Hurt Me Plenty |
Metadata integrity |
N |
N |
Y, AKO/LKRG/VED |
L2: Bring It On |
VED self-protection |
N |
Y |
N |
L3: Hurt Me Plenty |
根据赛博堡垒客户的反馈,平台安全级别的诸多威胁中,大多数带有花哨名称安全产品(例如:EDR/ XDR,HIDS等)的可绕过级别只能保持"L1:I can win",安全产品容易被攻陷对于生产环境来说并不是一件值得骄傲的事情,不是吗?
Demo
获得PoC代码,请在公众号输入:poc
原文始发于微信公众号(赛博堡垒):堡垒靶场:sshd辅助CVE-2021-26708(Linux内核)漏洞利用提权
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论