پس از شش ماه توسعه، کتابخانه سیستمی GNU C Library (glibc) 2.39 منتشر شد که به طور کامل با الزامات استانداردهای ISO C11 و POSIX.1-2017 مطابقت دارد. نسخه جدید شامل اصلاحاتی از 67 توسعه دهنده است.
برخی از بهبودهای اجرا شده در Glibc 2.39 عبارتند از:
- پشتیبانی از پشته سایه معرفی شده در هسته ارائه شده است. Linux ۶.۶، که با بهرهگیری از قابلیتهای سختافزاری پردازندههای اینتل، بسیاری از سوءاستفادهها را مسدود میکند تا در صورت سرریز بافر پشته، از بازنویسی آدرس برگشتی از یک تابع جلوگیری کند. این محافظت با ذخیره آدرسهای برگشتی نه تنها در پشته معمولی، بلکه در یک پشته "سایه" جداگانه نیز عمل میکند که پس از انتقال کنترل به یک تابع، نمیتوان آنها را مستقیماً تغییر داد. قبل از خروج از تابع، آدرس برگشتی از پشته سایه برداشته شده و با آدرس برگشتی از پشته اصلی مقایسه میشود. عدم تطابق در آدرسها باعث ایجاد یک استثنا میشود و موقعیتهایی را که یک سوءاستفاده موفق به بازنویسی آدرسی در پشته اصلی شده است، مسدود میکند. گزینه ساخت "--enable-cet" برای فعال کردن این محافظت اضافه شده است.
- فایل هدر جدید اضافه شد ، تعریف شده در پیش نویس استاندارد ISO C2X و شامل توابع stdc_leading_zeros, stdc_leading_ones, stdc_trailing_zeros, stdc_trailing_ones, stdc_first_leading_zero, stdc_first_leading_one, stdc_ze_first_st ، stdc_count_ones، s_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 برگردانده میشود، اضافه شد.
- یک اصلاح کننده اندازه "wN" به خانواده توابع scanf اضافه شد که برای آرگومان های انواع 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 (جدول پیوند رویه) را در سیستم های x86-64 می دهد، که در آن پیوند دهنده شاخه های غیر مستقیم در PLT را با شاخه های مستقیم جایگزین می کند.
- تنظیمات "glibc.mem.decorate_maps" را برای افزودن اطلاعات تخصیص حافظه اضافی (مانند پشته رشته ایجاد شده توسط pthread_create یا حافظه اختصاص داده شده از طریق malloc) اضافه کرد.
- ساختار "statvfs" اکنون فیلد "f_type" را با اطلاعاتی در مورد نوع سیستم فایل پر میکند، معادل با محتویات فیلد در ساختار "statfs". قبلاً، Linux فیلد "f_type" همیشه حاوی 0 بود.
- برای پلتفرم AArch64، حاشیه نویسی به libmvec و math.h اضافه شده است که به هنگام تعیین گزینه "-fast-math" در هنگام ساخت، امکان استفاده از بردار تماس هنگام ساخت در GCC 9 و نسخه های جدیدتر کامپایلر را می دهد. برداری برای توابع ریاضی acos, acosf, asin, asinf, atan, atanf, atan2, atan2f, cos, cosf, exp, expf, exp10, exp10f, exp2, exp2f, expm1, expm1f, log, logf, log10, logf فعال است. log10p، log1pf، log1، log2f، sin، sinf، tan و tanf.
- کتابخانه libcrypt و فایل هدر مربوطه از بسته حذف شده است. " توسعه دهندگان برنامه تشویق می شوند که به کتابخانه های جایگزین مانند libxcrypt سوئیچ کنند.
- ابزار ldconfig اکنون از فایلهای دارای کاراکتر «;» پرش میکند. در نام فایل یا پایان دادن به ".dpkg.tmp" و ".dpkg.new"، که به شما امکان می دهد از پردازش فایل های موقت مدیران بسته rpm و dpkg خودداری کنید.
- پشتیبانی از معماری ia64 (ia64*-*-linux-gnu)، مورد استفاده در پردازنده های Itanium اینتل، متوقف شده است.
- آسیب پذیری ها رفع شد:
- CVE-2023-6246، CVE-2023-6779، CVE-2023-6780 آسیب پذیری های حیاتی در تابع __vsyslog_internal() هستند که به فرد اجازه می دهد تا کد با امتیازات بالا را از طریق دستکاری با راه اندازی برنامه های SUID اجرا کند.
- CVE-2023-4911 یک آسیب پذیری در Glibc ld.بنابراین است که به شما امکان می دهد امتیازات ریشه را در سیستم به دست آورید. این آسیبپذیری به دلیل یک خطا در کد تجزیه رشته مشخص شده در متغیر محیطی GLIBC_TUNABLES است، که ممکن است باعث شود مقدار تجزیهشده خارج از محدوده در بافر اختصاصیافته نوشته شود. بهره برداری های کاری وجود دارد.
- CVE-2023-4806 یک آسیبپذیری بدون استفاده در تابع getaddrinfo است. مشکل زمانی رخ میدهد که افزونه 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:
- یک گزینه آزمایشی "--scfi=experimental" به اسمبلر (گاز) برای سیستم های x86-64 اضافه شده است تا ساختارهای CFI (Control Flow Integrity) را برای کد مونتاژ دست نویس مربوط به System V AMD64 ABI ترکیب کند.
- گزینه "--extra-sym-info" برای نمایش اطلاعات گسترده در مورد نمادها ("-symbols")، مانند نام بخشی که توسط نمایه st_shndx به آن ارجاع داده شده است، به خواندن اضافه شد.
- ابزار objcopy امکان استفاده از گزینه "--set-section-flags" با مقدار "large" را برای تنظیم بخش پرچم SHF_X86_64_LARGE برای اشیاء ELF در سیستم های x86-64 فراهم می کند. گزینه "--visualize-jumps" از معماری s390 پشتیبانی می کند.
- هنگام جداسازی دستورالعمل های s390، قابلیت نمایش نظرات در توضیحات دستورالعمل ها پیاده سازی شده است. برای فعال کردن توضیحات، میتوانید گزینه «-M insndesc» را در objdump و گزینه «set disassembler-options insndesc» را در gdb تعیین کنید.
- گزینههای "-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 استفاده میشود).
- برای سیستم های مبتنی بر معماری اینتل، پشتیبانی از برنامه های افزودنی اضافه شده است:
- APX اینتل: 32 GPR، 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 (افزونه برداری مقیاس پذیر 2.1).
- SME2.1 (افزونه ماتریس مقیاس پذیر 2.1).
- B16B16 (BFloat16 و BFloat16 برای SVE2 و SME2).
- RASv2 (قابلیت اطمینان، در دسترس بودن و سرویس پذیری نسخه 2).
- LSE128 (128 بیت اتمی).
- GCS (Guarded Control Stac).
- CHK (بررسی وضعیت ویژگی).
- SPECRES2 (محدودیت حدس و گمان تقویت شده).
- LRCPC3 (Load-Acquire RCpc).
- THE (سخت شدن ترجمه).
- ITE (ردیابی دستورالعمل).
- D128 (توصیفگرهای جدول صفحه حافظه 128 بیتی).
- XS (ویژگی حافظه XS).
- پشتیبانی از پردازنده های AArch64 Cortex-A520، Cortex-A720، Cortex-X3 و Cortex-X4 اضافه شده است.
- برای سازگاری با اسمبلر clang/LLVM، اسمبلر BPF پشتیبانی از جداسازی نظرات با نمادهای "#" و "//" و همچنین استفاده از نماد ";" را اضافه کرده است. برای جدا کردن عبارات در یک خط (";" دیگر نمی تواند برای نظرات استفاده شود).
منبع: opennet.ru
