Glibc 2.35 System Library Release

หลังจากหกเดือนของการพัฒนา มีการเผยแพร่ GNU C Library (glibc) 2.35 ซึ่งเป็นไปตามข้อกำหนดของมาตรฐาน ISO C11 และ POSIX.1-2017 อย่างสมบูรณ์ รุ่นใหม่ประกอบด้วยการแก้ไขจากนักพัฒนา 66 ราย

การปรับปรุงที่ใช้ใน Glibc 2.35 ได้แก่:

  • เพิ่มการรองรับภาษา "C.UTF-8" ซึ่งรวมการเรียงรหัส Unicode ทั้งหมด แต่จำกัดการใช้ช่วง ASCII ในฟังก์ชัน fnmatch, regexec และ regcomp เพื่อประหยัดพื้นที่ โลแคลมีขนาดประมาณ 400 KB ซึ่ง 346 KB เป็นข้อมูล Unicode LC_CTYPE และจำเป็นต้องติดตั้งแยกต่างหาก (ไม่ได้ติดตั้งไว้ใน Glibc)
  • ข้อมูลการเข้ารหัส ข้อมูลประเภทอักขระ และตารางการทับศัพท์ได้รับการอัปเดตเพื่อรองรับข้อกำหนด Unicode 14.0.0
  • ใน และ มีการใช้ฟังก์ชันและมาโครที่ปัดเศษผลลัพธ์เป็นประเภทที่แคบลง: fsqrt, fsqrtl, dsqrtl, ffma, ffmal, dfmal, fMsqrtfN, fMsqrtfNx, fMxsqrtfN, fMxsqrtfNx, fMfmafN, fMfmafNx, fMxfmafN และ fMxfmafNx ฟังก์ชันต่างๆ ได้อธิบายไว้ในข้อกำหนด TS 18661-1:2014, TS 18661-3:2015 และเพิ่มลงในร่างมาตรฐาน ISO C2X C ในอนาคต
  • ใน และ นำฟังก์ชันและมาโครมาใช้เพื่อค้นหาค่าต่ำสุดและสูงสุดของจำนวนจุดลอยตัวที่มีประเภท float, long double, _FloatN และ _FloatNx ซึ่งอธิบายไว้ในข้อกำหนด IEEE 754-2019 และเพิ่มลงในร่างมาตรฐาน ISO C2X C ในอนาคต: fmaximum, fmaximum_num, fmaximum_mag, fmaximum_mag_num, fminimum, fminimum_num, fminimum_mag, fminimum_mag _ หมายเลข
  • ใน เพิ่มค่าคงที่สำหรับตัวเลขทศนิยมที่มีความแม่นยำเดียว: M_Ef, M_LOG2Ef, M_LOG10Ef, M_LN2f, M_LN10f, M_PIif, M_PI_2f, M_PI_4f, M_1_PIif, M_2_PIif, M_2_SQRTPIf, M_SQRT2f และ M_SQRT1_2f
  • สำหรับฟังก์ชัน exp10 ในไฟล์ส่วนหัว เพิ่มมาโครที่เกี่ยวข้องซึ่งไม่ได้เชื่อมโยงกับประเภทใดประเภทหนึ่ง
  • ใน เพิ่มมาโคร _PRINTF_NAN_LEN_MAX ที่เสนอในร่างมาตรฐาน ISO C2X
  • ตัวระบุรูปแบบ "%b" และ "%B" ถูกเพิ่มในฟังก์ชันตระกูล printf เพื่อพิมพ์จำนวนเต็มในการแทนเลขฐานสอง
  • ระบบการเชื่อมโยงแบบไดนามิกใช้อัลกอริทึมการเรียงลำดับ DSO ใหม่ที่ใช้การค้นหาเชิงลึกก่อน (DFS) เพื่อแก้ไขปัญหาด้านประสิทธิภาพเมื่อจัดการการขึ้นต่อกันแบบวนซ้ำ หากต้องการเลือกอัลกอริทึมการเรียงลำดับ DSO จะมีการเสนอพารามิเตอร์ glibc.rtld.dynamic_sort ซึ่งสามารถกำหนดค่า "1" เพื่อย้อนกลับเป็นอัลกอริทึมเก่าได้
  • เพิ่มการรองรับฟังก์ชัน '__memcmpeq' ใหม่ลงใน ABI ซึ่งใช้โดยคอมไพเลอร์เพื่อเพิ่มประสิทธิภาพการใช้ 'memcmp' เมื่อค่าส่งคืนของฟังก์ชันนี้ใช้เพื่อตรวจสอบสถานะความสมบูรณ์ของการดำเนินการเท่านั้น
  • เพิ่มการรองรับสำหรับการลงทะเบียนเธรดโดยอัตโนมัติโดยใช้การเรียกระบบ rseq (ลำดับที่รีสตาร์ทได้) ที่มีให้ตั้งแต่เคอร์เนล Linux 4.18 การเรียกระบบ rseq ช่วยให้คุณสามารถจัดระเบียบการดำเนินการอย่างต่อเนื่องของกลุ่มคำสั่งที่ไม่ถูกขัดจังหวะ และยืนยันผลลัพธ์ด้วยคำสั่งสุดท้ายในกลุ่ม โดยพื้นฐานแล้วมันให้สิ่งอำนวยความสะดวกสำหรับการดำเนินการปรมาณูที่รวดเร็วมากซึ่งหากขัดจังหวะโดยเธรดอื่นจะถูกล้างข้อมูลและลองใหม่
  • เพิ่มลิงก์สัญลักษณ์ /usr/bin/ld.so
  • มีแอสเซมบลีตามค่าเริ่มต้นของไฟล์เรียกทำงานทั้งหมดของโปรแกรมในตัวและชุดทดสอบในโหมด PIE (ไฟล์ปฏิบัติการที่ไม่ขึ้นกับตำแหน่ง) หากต้องการปิดใช้งานลักษณะการทำงานนี้ จะมีตัวเลือก "--disable-default-pie" ไว้ให้
  • สำหรับ Linux มีการเพิ่มการตั้งค่า glibc.malloc.hugetlb เพื่อสลับการใช้งาน malloc เพื่อใช้การเรียกระบบ madvise ด้วยแฟล็ก MADV_HUGEPAGE สำหรับ mmap และ sbrk หรือใช้เพจหน่วยความจำขนาดใหญ่โดยตรงโดยระบุแฟล็ก MAP_HUGETLB ในการเรียก mmap ในกรณีแรก คุณสามารถเพิ่มประสิทธิภาพได้หากใช้ Transparent Huge Pages ในโหมด madvise และในกรณีที่สอง คุณสามารถใช้เพจขนาดใหญ่ที่ระบบสงวนไว้ (Huge Pages)
  • มีการเพิ่มฟังก์ชัน _dl_find_object ซึ่งสามารถใช้เพื่อเพิ่มข้อมูลเกี่ยวกับการคลาย call stack
  • เพิ่มการรองรับสถาปัตยกรรม OpenRISC (or1k-linux-gnu) ในโหมดการประมวลผลทศนิยม (soft-float) พอร์ตต้องใช้ binutils 2.35, GCC 11 และเคอร์เนล Linux 5.4
  • เพิ่มแฟล็กการสร้าง "--with-rtld-early-cflags" เพื่อระบุแฟล็กการรวบรวมเพิ่มเติมเพื่อใช้เมื่อสร้างโค้ดเริ่มต้นสำหรับการเชื่อมโยงแบบไดนามิก
  • สำหรับแพลตฟอร์ม Linux มีการเพิ่มฟังก์ชัน epoll_pwait2 ซึ่งแตกต่างจาก epoll_wait โดยระบุการหมดเวลาด้วยความแม่นยำระดับนาโนวินาที
  • เพิ่มฟังก์ชัน posix_spawn_file_actions_addtcsetpgrp_np เพื่อหลีกเลี่ยงสภาวะการแข่งขันเมื่อตั้งค่าเทอร์มินัลควบคุมสำหรับกระบวนการใหม่
  • สำหรับแอปพลิเคชันที่คอมไพล์ด้วย Glibc และ GCC 12+ จะใช้โหมดการป้องกัน "_FORTIFY_SOURCE=3" ซึ่งตรวจพบว่าอาจมีบัฟเฟอร์ล้นเมื่อเรียกใช้ฟังก์ชันสตริงที่กำหนดไว้ในไฟล์ส่วนหัวของ string.h ความแตกต่างจากโหมด "_FORTIFY_SOURCE=2" อยู่ที่การตรวจสอบเพิ่มเติมที่อาจนำไปสู่การลดประสิทธิภาพ
  • การสนับสนุนส่วนขยาย Intel MPX (Memory Protection Extensions) ซึ่งใช้เพื่อตรวจสอบตัวชี้ว่าสอดคล้องกับขอบเขตของพื้นที่หน่วยความจำได้ถูกยกเลิกแล้ว (เทคโนโลยีที่ระบุไม่ได้ถูกใช้อย่างแพร่หลายและถูกลบออกจาก GCC และ LLVM แล้ว)
  • เลิกใช้งานและจะถูกลบออกในอนาคต กลไกการเชื่อมโยงล่วงหน้าและตัวแปรสภาพแวดล้อมที่เกี่ยวข้อง LD_TRACE_PRELINKING และ LD_USE_LOAD_BIAS

    แก้ไขช่องโหว่:

    • CVE-2022-23218, CVE-2022-23219 - บัฟเฟอร์ล้นในฟังก์ชัน svcunix_create และ clnt_create ซึ่งเกิดจากการคัดลอกเนื้อหาของพารามิเตอร์ชื่อไฟล์ไปยังสแต็กโดยไม่ตรวจสอบขนาดของข้อมูลที่คัดลอก สำหรับแอปพลิเคชันที่สร้างขึ้นโดยไม่มีการป้องกันสแตกและใช้โปรโตคอล "ยูนิกซ์" ช่องโหว่นี้อาจนำไปสู่การเรียกใช้โค้ดที่เป็นอันตรายเมื่อประมวลผลชื่อไฟล์ที่ยาวมาก
    • CVE-2021-3998 เป็นช่องโหว่ในฟังก์ชัน realpath() ที่เกิดจากการส่งคืนค่าที่ไม่ถูกต้องภายใต้เงื่อนไขบางประการที่มีข้อมูลตกค้างที่ไม่สะอาดจากสแต็ก สำหรับโปรแกรม SUID-root fusermount สามารถใช้ช่องโหว่เพื่อรับข้อมูลที่ละเอียดอ่อนจากหน่วยความจำของกระบวนการ เช่น เพื่อรับข้อมูลเกี่ยวกับพอยน์เตอร์
    • CVE-2021-3999 - บัฟเฟอร์ไบต์เดียวล้นในฟังก์ชัน getcwd() ปัญหาเกิดจากข้อบกพร่องที่มีอยู่ตั้งแต่ปี 1995 ในการเรียกโอเวอร์โฟลว์ ในเนมสเปซจุดต่อเชื่อมที่แยกต่างหาก การเรียก chdir () สำหรับไดเร็กทอรี "/" ก็เพียงพอแล้ว

    ที่มา: opennet.ru

เพิ่มความคิดเห็น