21.02.2024

Выпуск системной библиотеки Glibc 2.39 и набора утилит GNU Binutils 2.42

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

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

  • Обеспечена поддержка теневого стека (shadow stack), появившегося в ядре Linux 6.6 и позволяющего блокировать работу многих эксплоитов, используя аппаратные возможности процессоров Intel для защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке. Суть защиты в том, что после передачи управления функции, адреса возврата сохраняются процессором не только в обычном стеке, но и в отдельном «теневом» стеке, который не может быть изменён напрямую. Перед выходом из функции адрес возврата извлекается из теневого стека и сверяется с адресом возврата из основного стека. Несовпадение адресов приводит к генерации исключения, блокирующего ситуации, когда эксплоиту удалось перезаписать адрес в основном стеке. Для включения добавлена сборочная опция «—enable-cet».
  • Добавлен новый заголовочный файл ‹stdbit.h›, определённый в черновике стандарта ISO C2X и включающий функции stdc_leading_zeros, stdc_leading_ones, stdc_trailing_zeros, stdc_trailing_ones, stdc_first_leading_zero, stdc_first_leading_one, stdc_first_trailing_zero, stdc_first_trailing_one, stdc_count_zeros, stdc_count_ones, stdc_has_single_bit, stdc_bit_width, stdc_bit_floor and stdc_bit_ceil в вариантах с типами «unsigned char», «unsigned short», «unsigned int», «unsigned long int» и «unsigned long long int».
  • Для платформы Linux реализованы функции posix_spawnattr_getcgroup_np и posix_spawnattr_setcgroup_np, а также флаг POSIX_SPAWN_SETCGROUP, которые позволяют настроить cgroupv2 в новом процессе при помощи функций posix_spawn и posix_spawnp, исключив возникновение состояния гонки. Функции являются расширениями GNU и для работы требуют наличия ядра Linux с поддержкой системного вызова clone3.
  • Для платформы Linux реализованы функции pidfd_spawn и pidfd_spawp, которые близки по семантике к функции posix_spawn, но возвращают не идентификатор процесса (PID), а файловый дескриптор для использования в функциях, поддерживающих механизм PIDFD, таких как pidfd_send_signal, poll и waitid (PIDFD связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID).
  • Для платформы Linux добавлена функция pidfd_getpid для определения идентификатора процесса (PID) на основе файлового дескриптора процесса (PIDFD), возвращённого функциями pid_spawn, fork_np и pidfd_open.
  • В функции семейства scanf добавлен модификатор размера «wN», применяемый для аргументов с типами intN_t, int_leastN_t, uintN_t и uint_leastN_t. Например, для чтения десятичных значений с типами int32_t и int_least32_t можно указать «%w32d», а шестнадцатеричных — «%w32x». Аналогично добавлен модификатор «wfN» для типов int_fastN_t и uint_fastN_t, представленных в черновом стандарте ISO C2X.
  • Добавлена настройка «glibc.cpu.plt_rewrite», включающая перезапись PLT (Procedure Linkage Table) на системах x86-64 при которой компоновщик заменит косвенные переходы (indirect branch) в PLT на прямые.
  • Добавлена настройка «glibc.mem.decorate_maps» для добавления дополнительной информации о выделении памяти (например, о стеке потоков, созданном функцией pthread_create, или памяти, выделенной через malloc).
  • В структуре «statvfs» обеспечено заполнение поля «f_type» информацией о типе ФС, эквивалентной содержимому поля в структуре «statfs». Ранее в Linux в поле «f_type» всегда записывался 0.
  • Для платформы AArch64 в libmvec и math.h добавлены аннотации, позволяющие при указании при сборке опции «-ffast-math» использовать векторизацию вызовов при сборке в GCC 9 и более новых версиях компилятора. Векторизация включается для математических функций acos, acosf, asin, asinf, atan, atanf, atan2, atan2f, cos, cosf, exp, expf, exp10, exp10f, exp2, exp2f, expm1, expm1f, log, logf, log10, log10f, log1p, log1pf, log2, log2f, sin, sinf, tan и tanf.
  • Из состава удалена библиотека libcrypt и связанный с ней заголовочный файл «‹crypt.h›». Разработчикам приложений рекомендуется перейти на использование альтернативных библиотек, таких как libxcrypt.
  • В утилите ldconfig теперь пропускаются файлы с символом ‘;’ в имени файла или заканчивающиеся на «.dpkg.tmp» и «.dpkg.new», что позволяет не обрабатывать временных файлы пакетных менеджеров rpm и dpkg.
  • Прекращена поддержка архитектуры ia64 (ia64*-*-linux-gnu), применяемой в процессорах Intel Itanium.
  • Устранены уязвимости:
    • CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 — критические уязвимости в функции __vsyslog_internal(), позволяющие через манипуляции с запуском SUID-приложений добиться выполнения своего кода с повышенными привилегиями.
    • CVE-2023-4911 — уязвимость в Glibc ld.so, позволяющая получить права root в системе. Уязвимость вызвана ошибкой в коде разбора строки, указанной в переменной окружения GLIBC_TUNABLES, и может привести к записи разобранного значения за пределы выделенного буфера. Имеются рабочие эксптоиты.
    • CVE-2023-4806 — уязвимость в функции getaddrinfo, вызванная обращением к памяти после её освобождения (use-after-free). Проблема проявляется когда NSS-плагин реализует только call-back-вызовы «_gethostbyname2_r» и «_getcanonname_r», но не поддерживает вызов «_gethostbyname3_r». Для эксплуатации уязвимости DNS-сервер должен вернуть для запрошенного хоста большое число адресов IPv6 и IPv4, что приведёт к краху процесса, вызвавшего функцию getaddrinfo для семейства AF_INET6 при выставлении флагов AI_CANONNAME, AI_ALL и AI_V4MAPPED.
    • CVE-2023-4527 — уязвимость в функции getaddrinfo, позволяющая прочитать данные из области вне границы буфера при обработке DNS-ответа, полученного по TCP, рамером боле 2048 байт. Уязвимость проявляется при использовании опции «no-aaaa» в /etc/resolv.conf.

    Дополнительно можно отметить выпуск набора системных утилит GNU Binutils 2.42, в состав которого входят такие программы, как GNU linker, GNU assembler, nm, objdump, strings, strip.

    В новой версии Binutils:

    • В ассемблер (gas) для систем x86-64 добавлена экспериментальная опция «—scfi=experimental» для синтеза конструкций CFI (Control Flow Integrity) для вручную написанного ассембрерного кода, соответствующего System V AMD64 ABI.
    • В программу readelf добавлена опция «—extra-sym-info» для вывода расширенной информации о символах («—symbols»), такой как имя секции, на которую ссылается индекс st_shndx.
    • В утилите objcopy предоставлена возможность использования в опции «—set-section-flags» значения «large»для выставления секции флага SHF_X86_64_LARGE для ELF-объектов на системах x86-64. В опции «—visualize-jumps» реализована поддержка архитектуры s390.
    • При дизассемблировании инструкций s390 реализована возможность отображения комментариев в описанием инструкций. Для включения описаний в objdump можно указать параметр «-M insndesc», а в gdb — настройку «set disassembler-options insndesc».
    • В компоновщик добавлены опции «-z mark-plt» и «-z nomark-plt» для пометки записей в таблице PLT, используя теги DT_X86_64_PLT, DT_X86_64_PLTSZ и DT_X86_64_PLTENT.
    • В компоновщике добавлена поддержка сортировки в обратном порядке.
    • Добавлены опции «—warn-execstack-objects», «—error-execstack» и «—error-rxw-segments» для вывода предупреждений или ошибок при использовании в объектах исполняемого стека.
    • Реализована поддержка ABI 2.30 архитектуры LoongArch, а также поддержка новых инструкций, определённых в спецификации LoongArch 1.10.
    • Добавлена поддержка набора инструкций KVX, используемых в процессторах Kalray (например, применяются в SoC Coolidge).
    • Для систем на базе архитектуры Intel добавлена поддержка расширений:
      • Intel APX: 32 GPRs, NDD, PUSH2/POP2, PUSHP/POPP.
      • USER_MSR.
      • AVX10.1.
      • PBNDKB.
      • SM4.
      • SM3.
      • SHA512.
      • AVX-VNNI-INT16.
    • В порт для архитектуры RISC-V добавлена поддержка расширений:
      • T-Head (XTheadVector, XTheadZvlsseg и XTheadZvamo).
      • CORE-V (XCVmac, XCValu).
      • SiFive VCIX (XSfVcp).
    • В порт для архитектуры AArch64 добавлена поддержка расширений:
      • SVE2.1 (Scalable Vector Extension 2.1).
      • SME2.1 (Scalable Matrix Extension 2.1).
      • B16B16 (BFloat16 и BFloat16 для SVE2 и SME2).
      • RASv2 (Reliability, Availability and Serviceability v2).
      • LSE128 (128-bit Atomic).
      • GCS (Guarded Control Stac).
      • CHK (Check Feature Status).
      • SPECRES2 (Enhanced Speculation Restriction).
      • LRCPC3 (Load-Acquire RCpc).
      • THE (Translation Hardening).
      • ITE (Instruction Trace).
      • D128 (128-битовые дескрипторы таблицы страниц памяти).
      • XS (атрибут памяти XS).
    • Добавлена поддержка процессоров AArch64 Cortex-A520, Cortex-A720, Cortex-X3 и Cortex-X4.
    • В ассемблер BPF для совместимости с ассемблером clang/LLVM добавлена поддержка отделения комментариев символами «#» и «//», а также использования символа «;» для разделения выражений в строке («;» больше не может использоваться для комментариев).

    Источник: https://www.opennet.ru/opennews/art.shtml?num=60534 Источник.