Glibc 2.34 新版本近日正式发布。该版本历经六个月的开发,包含多项重要改进,最显著的是新增了 libpthread、libdl、libutil 和 libanl 库,并修复了多个 bug,其中一个 bug 曾导致程序崩溃。
对于不熟悉 Glibc 的人来说,它是一个 GNU C 库,通常简称为 glibc,是 GNU C 语言的标准运行时库。在使用它的系统中,几乎所有程序都会用到这个 C 库,它提供并定义了系统调用和其他基本功能。
Glibc 2.34 的主要新特性
在 Glibc 2.34 的新版本中,主库 libpthread、libdl、libutil 和 libanl 已被集成;在应用程序中使用它们的功能不再需要使用 -lpthread、-ldl、-lutil 和 -lanl 指示符将它们链接起来。
此外,文中提到已做好将 libresolv 集成到 libc 中的准备工作,这将使 glibc 的升级过程更加顺畅,并简化运行时实现。同时,也提供了存根库,以兼容使用早期版本 glibc 构建的应用程序。
Glibc 2.34针对 Linux 系统进行了诸多改进,其中最显著的一点是新增了在传统上使用32 位time_t 类型的配置中使用 64 位 time_t 类型的功能。此功能仅适用于内核版本 5.1 及更高版本的系统。
Linux 特有的另一项变化是`execveat` 函数的实现,它允许您从打开的文件描述符执行可执行文件。这个新函数也用于 `fexecve` 调用的实现,该调用不需要在启动时挂载 `/proc` 伪文件系统。
此外,还新增了 `close_range()` 函数,该函数适用于 Linux 5.9及更高版本,可用于让进程一次性关闭一整范围的已打开文件描述符。另外,还实现了 `glibc.pthread.stack_cache_size` 参数,该参数可用于调整 pthread 堆栈缓存的大小。
此外,新增了 `_Fork` 函数,它替代了`fork`函数,并满足“异步信号安全”的要求,这意味着它可以安全地从信号处理程序中调用。在执行 `_Fork` 期间,会创建一个最小化的环境,足以在信号处理程序中调用 `raise` 和 `execute` 等函数,而不会调用任何可能更改锁或内部状态的功能。
对于Glibc 2.34修复的部分漏洞,提到以下几点:
CVE-2021-27645:由于在处理特制的网络组请求时对 free 函数进行了两次调用,导致 nscd 进程(名称服务器缓存守护程序)失败。
CVE-2021-33574:当使用 SIGEV_THREAD 通知类型且线程属性设置了备用 CPU 绑定掩码时,mq_notify 函数中存在访问释放后使用内存区域的漏洞。此漏洞可能导致程序崩溃,但不排除其他攻击途径。
CVE-2021-35942: wordexp 函数中的参数大小溢出可能会导致应用程序崩溃。
其他显著变化包括:
- 已添加 ISO C2X 标准草案中定义的 timespec_getres 函数,并且增加了 timespec_get 函数,其功能类似于 POSIX clock_getres 函数。
- 在 gconv-modules 文件中,只保留了最少量的主要 gconv 模块,其余的被移动到位于 gconv-modules.d 目录中的附加 gconv-modules-extra.conf 文件中。
- 使用符号链接将可安装共享对象链接到 Glibc 版本已被删除。 这些对象现在按原样安装(例如,libc.so.6 现在是一个文件,而不是指向 libc-2.34.so 的链接)。
- 在 Linux 上,像 shm_open 和 sem_open 这样的函数现在需要一个文件系统用于挂载在 /dev/shm 挂载点上的共享内存。
最后,如果您有兴趣了解更多关于这个新版本的信息,可以在以下链接中找到详细信息。