Пускане на системната библиотека 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 и 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 и свързаният с нея заглавен файл „“. Разработчиците на приложения се препоръчва да преминат към използването на алтернативни библиотеки, като например 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 плъгинът реализира само обратни извиквания „_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 е предоставена възможност за използване на стойността «large» в опцията «—set-section-flags», за да се зададе флага 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-битова атомарна).
      • GCS (Guarded Control Stac).
      • CHK (Check Feature Status).
      • SPECRES2 (Разширена забрана на спекулации).
      • LRCPC3 (Load-Acquire RCpc).
      • THE (Засилване на транслацията).
      • ITE (Проследяване на инструкции).
      • D128 (128-битови дескриптори на таблицата за страници памет).
      • XS (атрибут на паметта XS).
    • Добавена е поддръжка на процесори AArch64 Cortex-A520, Cortex-A720, Cortex-X3 и Cortex-X4.
    • В асемблера BPF за съвместимост с асемблера clang/LLVM е добавена поддръжка за отделяне на коментари с символите «#» и «//», както и за използване на символа «;» за разделяне на изрази в реда («;» вече не може да се използва за коментари).

    Източник: opennet.ru

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster