Wydanie biblioteki systemowej Glibc 2.39 oraz zestawu narzędzi GNU Binutils 2.42

Po sześciu miesiącach prac wprowadzono wersję systemowej biblioteki GNU C Library (glibc) 2.39, która w pełni spełnia wymogi standardów ISO C11 i POSIX.1-2017. Nowa wersja zawiera poprawki od 67 programistów.

Wśród wprowadzonych w Glibc 2.39 ulepszeń można wymienić:

  • Zapewniono wsparcie dla stosu cieniowego (shadow stack), który pojawił się w jądrze Linux 6.6 i umożliwia blokowanie działania wielu exploitów, wykorzystując możliwości sprzętowe procesorów Intel do ochrony przed zapisywaniem adresu powrotu z funkcji w przypadku przepełnienia bufora na stosie. Istota ochrony polega na tym, że po przekazaniu kontroli do funkcji, adresy powrotu są przechowywane przez procesor nie tylko w zwykłym stosie, ale także w osobnym »cieniowym« stosie, którego nie można zmienić bezpośrednio. Przed zakończeniem działania funkcji adres powrotu jest pobierany ze stosu cieniowego i porównywany z adresem powrotu z głównego stosu. Niezgodność adresów prowadzi do wygenerowania wyjątku, który blokuje sytuacje, w których exploitowi udało się nadpisać adres w głównym stosie. Aby to włączyć, dodano opcję kompilacji «—enable-cet».
  • Dodano nowy plik nagłówkowy , określony w szkicu standardu ISO C2X, który obejmuje funkcje 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 oraz stdc_bit_ceil w wariantach z typami „unsigned char”, „unsigned short”, „unsigned int”, „unsigned long int” i „unsigned long long int”.
  • Dla platformy Linux wprowadzono funkcje posix_spawnattr_getcgroup_np i posix_spawnattr_setcgroup_np, a także flagę POSIX_SPAWN_SETCGROUP, które umożliwiają konfigurację cgroupv2 w nowym procesie za pomocą funkcji posix_spawn i posix_spawnp, eliminując możliwość wystąpienia warunków wyścigu. Funkcje te są rozszerzeniami GNU i do działania wymagają jądra Linux z obsługą wywołania systemowego clone3.
  • Dla platformy Linux wprowadzono funkcje pidfd_spawn i pidfd_spawp, które są semantycznie podobne do funkcji posix_spawn, ale zwracają nie identyfikator procesu (PID), a deskryptor pliku do użycia w funkcjach wspierających mechanizm PIDFD, takich jak pidfd_send_signal, poll i waitid (PIDFD jest powiązany z konkretnym procesem i nie zmienia się, podczas gdy PID może być powiązany z innym procesem po zakończeniu bieżącego procesu, z którym jest związany ten PID).
  • Na platformie Linux dodano funkcję pidfd_getpid, która umożliwia określenie identyfikatora procesu (PID) na podstawie deskryptora pliku procesu (PIDFD) zwróconego przez funkcje pid_spawn, fork_np i pidfd_open.
  • Do funkcji z rodziny scanf dodano modyfikator rozmiaru «wN», stosowany do argumentów typów intN_t, int_leastN_t, uintN_t i uint_leastN_t. Na przykład, aby odczytać wartości dziesiętne typów int32_t i int_least32_t, można użyć «%w32d», a dla szesnastkowych — «%w32x». Podobnie dodano modyfikator «wfN» dla typów int_fastN_t i uint_fastN_t, przedstawionych w wstępnym standardzie ISO C2X.
  • Dodano opcję «glibc.cpu.plt_rewrite», która wdraża przepisywanie PLT (Procedure Linkage Table) na systemach x86-64, w której linker zastępuje pośrednie skoki (indirect branch) w PLT bezpośrednimi.
  • Dodano opcję «glibc.mem.decorate_maps» w celu dodania dodatkowych informacji o alokacji pamięci (np. o stosie wątków utworzonym przez funkcję pthread_create lub pamięci przydzielonej przez malloc).
  • W strukturze «statvfs» wypełniono pole «f_type» informacjami o typie systemu plików, równoważnymi zawartości pola w strukturze «statfs». Wcześniej w systemie Linux w polu «f_type» zawsze zapisywano 0.
  • Na platformę AArch64 w libmvec i math.h dodano adnotacje, które pozwalają na użycie wektoryzacji wywołań przy kompilacji z opcją «-ffast-math» w GCC 9 i nowszych wersjach kompilatora. Wektoryzacja włączana jest dla funkcji matematycznych 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 i tanf.
  • Z zestawu usunięto bibliotekę libcrypt oraz związany z nią plik nagłówkowy «». Programistom aplikacji zaleca się przejście na użycie alternatywnych bibliotek, takich jak libxcrypt.
  • W narzędziu ldconfig pominęto pliki z symbolem ‘;’ w nazwie pliku lub kończące się na «.dpkg.tmp» i «.dpkg.new», co umożliwia pomijanie tymczasowych plików menedżerów pakietów rpm i dpkg.
  • Zaprzestano wsparcia dla architektury ia64 (ia64*-*-linux-gnu), stosowanej w procesorach Intel Itanium.
  • Usunięto luki bezpieczeństwa:
    • CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 — krytyczne luki w funkcji __vsyslog_internal(), które umożliwiają poprzez manipulowanie uruchamianiem aplikacji SUID wykonanie własnego kodu z podwyższonymi uprawnieniami.
    • CVE-2023-4911 — luka w Glibc ld.so, która umożliwia uzyskanie uprawnień roota w systemie. Luka została spowodowana błędem w kodzie analizy łańcucha, określonym w zmiennej środowiskowej GLIBC_TUNABLES, co może prowadzić do zapisu przetworzonej wartości poza przydzielonym buforem. Istnieją działające exploity.
    • CVE-2023-4806 — luka w funkcji getaddrinfo, spowodowana odwołaniem do pamięci po jej zwolnieniu (use-after-free). Problem ujawnia się, gdy wtyczka NSS implementuje tylko wywołania zwrotne „_gethostbyname2_r” i „_getcanonname_r”, a nie wspiera wywołania „_gethostbyname3_r”. Aby luka mogła być wykorzystana, serwer DNS musi zwrócić dla żądanego hosta dużą liczbę adresów IPv6 i IPv4, co spowoduje awarię procesu, który wywołał funkcję getaddrinfo dla rodziny AF_INET6 z ustawionymi flagami AI_CANONNAME, AI_ALL i AI_V4MAPPED.
    • CVE-2023-4527 — luka w funkcji getaddrinfo, która pozwala na odczyt danych z obszaru poza granicą bufora podczas przetwarzania odpowiedzi DNS, otrzymanej przez TCP, o rozmiarze przekraczającym 2048 bajtów. Luka ujawnia się przy użyciu opcji „no-aaaa” w /etc/resolv.conf.

    Dodatkowo można zauważyć wydanie zestawu narzędzi systemowych GNU Binutils 2.42, w skład którego wchodzą takie programy, jak GNU linker, GNU assembler, nm, objdump, strings, strip.

    W nowej wersji Binutils:

    • Do asemblera (gas) dla systemów x86-64 dodano eksperymentalną opcję „—scfi=experimental” do syntezy konstrukcji CFI (Control Flow Integrity) dla ręcznie napisanych kodów asemblerowych zgodnych z System V AMD64 ABI.
    • Do programu readelf dodano opcję „—extra-sym-info” do wyświetlania rozszerzonych informacji o symbolach („—symbols”), takich jak nazwa sekcji, na którą wskazuje indeks st_shndx.
    • W narzędziu objcopy dodano możliwość użycia w opcji „—set-section-flags” wartości „large” do ustawienia sekcji flagi SHF_X86_64_LARGE dla obiektów ELF w systemach x86-64. W opcji „—visualize-jumps” wprowadzono wsparcie dla architektury s390.
    • Podczas disassemblacji instrukcji s390 wprowadzono możliwość wyświetlania komentarzy z opisem instrukcji. Aby włączyć opisy w objdump, można użyć parametru „-M insndesc”, a w gdb — ustawienia „set disassembler-options insndesc”.
    • Do linkera dodano opcje „-z mark-plt” i „-z nomark-plt” do oznaczania wpisów w tabeli PLT, korzystając z tagów DT_X86_64_PLT, DT_X86_64_PLTSZ i DT_X86_64_PLTENT.
    • W linkerze dodano wsparcie dla sortowania w odwrotnej kolejności.
    • Dodano opcje „—warn-execstack-objects”, „—error-execstack” i „—error-rxw-segments” do wyświetlania ostrzeżeń lub błędów podczas korzystania z obiektów stosu wykonawczego.
    • Zrealizowano wsparcie ABI 2.30 architektury LoongArch, a także wsparcie nowych instrukcji określonych w specyfikacji LoongArch 1.10.
    • Dodano wsparcie dla zestawu instrukcji KVX, używanego w procesorach Kalray (na przykład stosowanego w SoC Coolidge).
    • Dla systemów opartych na architekturze Intel dodano wsparcie dla rozszerzeń:
      • Intel APX: 32 GPR, NDD, PUSH2/POP2, PUSHP/POPP.
      • USER_MSR.
      • AVX10.1.
      • PBNDKB.
      • SM4.
      • SM3.
      • SHA512.
      • AVX-VNNI-INT16.
    • Do portu dla architektury RISC-V dodano wsparcie dla rozszerzeń:
      • T-Head (XTheadVector, XTheadZvlsseg i XTheadZvamo).
      • CORE-V (XCVmac, XCValu).
      • SiFive VCIX (XSfVcp).
    • Do portu dla architektury AArch64 dodano wsparcie dla rozszerzeń:
      • SVE2.1 (Scalable Vector Extension 2.1).
      • SME2.1 (Scalable Matrix Extension 2.1).
      • B16B16 (BFloat16 i BFloat16 dla SVE2 i SME2).
      • RASv2 (Reliability, Availability and Serviceability v2).
      • LSE128 (128-bit Atomic).
      • GCS (Guarded Control Stack).
      • CHK (Check Feature Status).
      • SPECRES2 (Enhanced Speculation Restriction).
      • LRCPC3 (Load-Acquire RCpc).
      • THE (Translation Hardening).
      • ITE (Instruction Trace).
      • D128 (128-bitowe deskryptory tabeli stron pamięci).
      • XS (atrybut pamięci XS).
    • Dodano wsparcie dla procesorów AArch64 Cortex-A520, Cortex-A720, Cortex-X3 i Cortex-X4.
    • W asemblerze BPF, dla zgodności z asemblerem clang/LLVM, dodano wsparcie dla oddzielania komentarzy znakami „#” i „//”, a także używania znaku „;” do oddzielania wyrażeń w linii („;” nie może być już używane do komentarzy).

    Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster