Выпуск системной библиотеки Glibc 2.29

После шести месяцев разработки опубликован релиз системной библиотеки GNU C Library (glibc) 2.29, которая полностью следует требованиям стандартов ISO C11 и POSIX.1-2008. В состав нового выпуска включены исправления от 55 разработчиков.

Из реализованных в Glibc 2.29 улучшений можно отметить:

  • Добавлена функция getcpu(), позволяющая получить сведения о используемых в настоящий момент CPU и узлах NUMA;
  • Для разработчиков дистрибутивов предложены сборочные команды «make localedata» и «make install-locale-files», дающие возможность собрать и установить все имеющиеся локали в форме раздельного набора каталогов с файлами;
  • В математические функции exp, exp2, log, log2, pow, sinf, cosf, sincosf и tanf внесены неспецифичные для конкретных аппаратных платформ оптимизации;
  • Добавлена поддержка 32-разрядной процессорной архитектуры C-SKY (ABIv2), развиваемой одноимённой китайской компанией для создания SoC для различных потребительских устройств. Для работы требуется наличие binutils 2.32, gcc 9.0 и ядра Linux 4.20. Поддерживается два варианта ABI:
    «C-SKY ABIv2 soft-float little-endian» и «C-SKY ABIv2 hard-float little-endian»;

  • Функция reallocarray() перенесена из набора «_BSD_SOURCE» (интерфейсы BSD, которые конфликтуют с POSIX), в набор «_DEFAULT_SOURCE» (интерфейсы, которые включены по умолчанию);
  • Добавлены функции posix_spawn_file_actions_addchdir_np и
    posix_spawn_file_actions_addfchdir_np, применяющие вызовы posix_spawn и posix_spawnp для запуска нового процесса в другом каталоге. Функции добавлены в секцию расширений GNU;

  • В функциях popen() и system() прекращён вызов обработчиков atfork, вызываемых до и после выполнения fork(). Данное поведение возможно нарушает стандарт POSIX, который в документации на pthread_atfork предписывает в обработчиках atfork обрабатывать состояние мьютекс после выполнения форка в многопоточных процессах, но вызовы popen и system не имеют прямого доступа к пользовательским мьютексам;
  • Механизм блокировок Transactional Lock Elision (позволяет увеличить масштабируемость блокировок на системах с поддержкой инструкции HTM) теперь включается для процессоров powercp64le, только если применяются новые версии ядра Linux, собранные в режиме PPC_FEATURE2_HTM_NOSC на процессорах с поддержкой HWCAP2 (т.е. если выполняется сброс транзакции перед входом в ядро). Ранее для совместимости со старыми ядрами, не сбрасывающими транзакции, Glibc производил данную операцию самостоятельно, что приводило к снижению производительности на новых ядрах;
  • В функции strftime изменено применяемое по умолчанию форматирование альтернативного представления года с учётом локали («%Ey»), которое теперь включает как минимум две цифры (без отбрасывания нулей) по аналогии с «%y». Изменение заметно только для японских локалей, в которых регулярно встречаются годы меньше 10. Для возвращения старого поведения вместе с «%EY» следует использовать флаги ‘_’ и ‘-‘, определённые как расширения GNU;

  • Пространство имён glibc.tune переименовано в glibc.cpu, а glibc.tune.cpu в glibc.cpu.name;
  • Типы элементов pr_uid и pr_gid в структуре elf_prpsinfo из sys/procfs.h приведены в соответствие с типами, используемыми в ядре Linux (размер структуры изменится только для архитектур MicroBlaze, MIPS (n64 ABI), Nios II и RISC-V). Аналогично к типам ядра приведены типы элементов pr_sigpend и pr_sighold структуры elf_prstatus и pr_flag из elf_prpsinfo, но данное изменение затрагивает только MIPS n32 ABI;
  • Устаревшие GNU-расширения форматирования в scanf (‘%as’, ‘%aS’ и
    ‘%a[…]’) теперь доступны только при сборке в режимах C89 и C++98 с флагом _GNU_SOURCE, так как они конфликтуют со спецификациями C99 и C++11. В соответствии с рекомендациями POSIX.1-2008 вместо ‘%as’, ‘%aS’ и’%a[…]’ следует использовать ‘%ms’, ‘%mS’ и ‘%m[…]’. Для выявления применения устаревших расширений форматирования можно использовать режим «-Wformat» в GCC;

  • Для сборки Glibc теперь требуется наличие GCC 5 и Python 3.4 или более новые версии (для сборки программ, использующих Glibc, ограничения на версию GCC не накладываются);
  • Устранены уязвимости:
    • CVE-2018-19591 — устранена утечка файловых дескрипторов в if_nametoindex, которая могла привести к отказу в обслуживании из-за исчерпание доступных дескрипторов. Утечка проявляется при вызове функции getaddrinfo() с передачей специально оформленного имени хоста;
    • CVE-2019-6488 — устранено переполнение буфера при выполнении функции memcpy, проявляющиеся только в окружениях с архитектурой x32 (не путать с x86 IA-32). Проблема вызвана ошибкой в ассемблерной вставке, из-за которой параметр size_t записывается в нижние 32 бита 64-разрядного регистра без обнуления оставшихся верхних 32 бит;
    • CVE-2016-10739блокирована возможность разбора в функции getaddrinfo() адресов IPv4, содержащих произвольный набор символов в конце (например, «127.0.0.1nTEST»). С одной стороны данное изменение нарушает сложившееся поведение и может привести к нарушению работы приложений, в которых осуществлялся разбор значений из /etc/hosts без разделения адресов. Но с другой стороны, указанная особенность приводила к уязвимостям в приложениях, которые используют getaddrinfo для проверки корректности адресов (getaddrinfo не возвращал ошибку и приложение считало адрес корректным, даже если после него указывались произвольные символы). В атаках данная особенность использовалась для подстановки HTTP-заголовков в приложения на базе Python-библиотеки httplib через передачу в поле адресов значений вида «127.0.0.1rnHttp-заголовок». В некоторых web-интерфейсах домашних маршрутизаторов в форме ping-проверки можно было запустить произвольные команды через передачу значений «127.0.0.1;cat /etc/passwd».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.