CVE-2019-19726 OpenBSD 动态加载器本地特权升级漏洞
内容提要
OpenBSD动态加载器中的本地特权升级漏洞CVE-2019-19726允许攻击者通过操纵LD_LIBRARY_PATH环境变量来提升权限。该漏洞已被提名为2020 Pwnie奖。文章分析了漏洞并演示了测试代码。还讨论了SUID-root程序中LD_LIBRARY_PATH环境变量的处理方式,并解释了漏洞的利用方法。
延伸解读
漏洞触发条件:资源限制与内存分配失败
漏洞触发需要攻击者通过 setrlimit 设置 RLIMIT_DATA 资源限制,使动态加载器在调用 _dl_split_path 分配内存时失败。_dl_split_path 使用 _dl_reallocarray 分配内存,若失败则返回 NULL,导致后续清理 LD_LIBRARY_PATH 的逻辑被跳过。因此,攻击者需能够控制目标 SUID-root 程序的资源限制,这通常需要程序本身在提权后重置资源限制,如 /usr/bin/chpass 调用 pw_init 将 RLIMIT_DATA 重置为 RLIM
利用链关键:chpass 与 pwd_mkdb 的协作
文章以 /usr/bin/chpass 为例展示利用链:chpass 是 SUID-root 程序,其 main 函数调用 setuid(0) 后,通过 pw_init 将 RLIMIT_DATA 重置为 RLIM_INFINITY,随后调用 pw_mkdb 通过 vfork/execv 执行 /usr/sbin/pwd_mkdb。由于 execv 继承环境变量,且 pwd_mkdb 非 SUID-root,动态加载器不会清理 LD_LIBRARY_PATH,攻击者可通过放置恶意 so 库实现劫持。但 chpass
影响范围有限:仅少数 SUID-root 程序可被利用
总结指出,只有极少数满足特定条件的 SUID-root 程序才能利用此漏洞。这些程序需要在提权后重置 RLIMIT_DATA 资源限制,并通过 exec 执行非 SUID-root 的子进程,同时子进程会继承环境变量。因此,该漏洞的实际影响范围较窄,但一旦存在符合条件的程序,攻击者便可实现本地提权。
Q&A
CVE-2019-19726 漏洞是如何被发现的?
该漏洞由 Qualys Research Team 发现,并获得 2020 年 Pwnie Awards 提名。
CVE-2019-19726 漏洞的利用方法是什么?
攻击者通过操纵 LD_LIBRARY_PATH 环境变量,利用 /usr/bin/chpass 程序实现提权。
LD_LIBRARY_PATH 环境变量在 SUID-root 程序中是如何处理的?
链接器需要去除危险的环境变量,以防止通过环境变量实现提权。
CVE-2019-19726 漏洞的核心问题是什么?
漏洞在于动态加载器清理 LD_LIBRARY_PATH 环境变量时的缺陷,导致权限提升。
该漏洞对系统安全有什么影响?
该漏洞允许攻击者提升权限,可能导致系统安全性降低。
如何修复 CVE-2019-19726 漏洞?
漏洞补丁可参考 libexec/ld.so/loader.c 文件。