漏洞利用原因:
-
漏洞的根本原因是在 glibc 的
__vsyslog_internal()
函数中存在基于堆的缓冲区溢出。 -
这种溢出可能允许攻击者通过构造恶意输入,覆盖堆中的特定数据,从而触发未经授权的行为或升级权限。
漏洞利用情况:
-
触发条件:
-
漏洞的触发需要满足一定的条件,具体来说,需要
argv[0]
或openlog()
的ident
参数的长度超过 1024 字节。 -
这意味着需要通过传递特定长度的参数来触发漏洞,通常在攻击者有一定控制权的情况下触发。
-
影响范围:
-
受影响的系统包括 glibc 版本为 2.36 和 2.37 的系统,涉及多个 Linux 发行版,如 Debian 12 和 13、Ubuntu 23.04 和 23.10、Fedora 37 到 39 等。
-
报告中明确指出在 Fedora 38 上成功利用了该漏洞,从而实现了从非特权用户本地升级权限至完全根权限。
-
利用结果:
-
漏洞的成功利用可能导致本地权限升级,攻击者从非特权用户的权限提升到完全Root权限。
-
在报告中提到,在 Fedora 38 上成功利用了漏洞,这表明攻击者可以通过此漏洞实现本地系统的完全控制。
思考部分:
Qualys 的安全团队在几个小时前发布了 glibc 中的线性两步堆缓冲区溢出 syslog()
:
206 buf = malloc ((bufsize + 1) * sizeof (char));
...
213 __snprintf (buf, l + 1,
214 SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
...
221 __vsnprintf_internal (buf + l, bufsize - l + 1, fmt, apc,
222 mode_flags);
tl;dr 是指bufsize
while0
是l
用户控制的。Baron Samedit
正如公告中提到的,在(惊人的) sudo 漏洞利用中扰乱 nss 结构 是在 glibc 上获取 root shell 的好方法。
虽然该错误存在于 glibc 中syslog
,但人们出于性能/安全/速度/……原因运行自定义分配器并非闻所未闻。其中之一可能是,例如,hardened_malloc, GrapheneOS的以安全为中心的分配器,提出了这样一个问题:“会让hardened_malloc
这个特定的错误在我的 x86_64 Debian 机器上无法利用吗?”
hardened_malloc
使用基于大小的板隔离,由 PartitionAlloc推广。由于bufsize
为零,因此这是一个 1 字节分配,属于 16 字节 size-class,是特殊字节之后最小的0
。因此,要利用这一点,必须找到一个大小为 16 字节或更低的有趣对象来覆盖。但由于金丝雀是默认启用的,这变得更加困难:分配的大小实际上增加了 8 个字节,这意味着实际上必须找到一个大小为 8 字节或更低的有趣对象。
此外,16 字节的slab 最多可以包含256 个分配,并且被保护页包围,这意味着访问下面buf
和上面的任何内容buf+(256*16)
都会导致崩溃。
分配是随机的,这可能有助于暴力破解堆布局:如果当前的分配不可利用,则只需崩溃并重新开始。但它也会导致更多的崩溃,因为buf
可能会分配得更靠近保护页面。
当然还有其他缓解措施,但它们在这种特殊情况下并不相关,例如在 上检查的金丝雀free
,或完全消除线性溢出的ARM 的 MTE 。
鉴于适用于堆基的随机化量非常可笑hardened_malloc
(每个区域 32G),对不在堆上的任何内容进行暴力破解是徒劳的。因此,人们必须在堆上 8 字节以下的对象中找到一些有趣的东西,比如像 中那样的损坏路径service_user
,或者对函数指针的某些部分覆盖来调用 一次性小工具,……
原文地址:
https://dustri.org/b/musings-on-cve-2023-6246-on-hardened_malloc.html
参考阅读:
https://seclists.org/oss-sec/2024/q1/68
https://www.qualys.com/2024/01/30/cve-2023-6246/syslog.txt
奇安信CERT复现:
原文始发于微信公众号(Ots安全):关于CVE-2023-6246:glibc 的 syslog() 中存在基于堆的缓冲区溢出提权漏洞的思考
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论