2 คะแนน โดย GN⁺ 2024-04-13 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ลำดับเหตุการณ์:

    • 2024.01.19: เว็บไซต์ XZ ถูกย้ายไปยัง GitHub Pages โดยผู้ดูแลคนใหม่ (jiaT75)
    • 2024.02.15: เพิ่ม build-to-host.m4 ลงใน .gitignore
    • 2024.02.23: มีการเพิ่ม "ไฟล์ทดสอบ" สองไฟล์ที่บรรจุสเตจของสคริปต์อันตราย
    • 2024.02.24: ออก XZ 5.6.0
    • 2024.02.26: มีคอมมิตใน CMakeLists.txt ที่บ่อนทำลายฟีเจอร์ความปลอดภัย Landlock
    • 2024.03.04: แบ็กดอร์ก่อให้เกิดปัญหากับ Valgrind
    • 2024.03.09: อัปเดต "ไฟล์ทดสอบ" สองไฟล์, แก้ไขฟังก์ชัน CRC, และ "แก้" ปัญหา Valgrind
    • 2024.03.09: ออก XZ 5.6.1
    • 2024.03.28: พบบั๊ก, แจ้ง Debian และ RedHat, Debian ย้อนกลับ XZ
    • 2024.03.29: เผยแพร่อีเมลบน OSS-security mailing list, RedHat ยืนยันว่ามีการส่งมอบ XZ ที่ถูกฝังแบ็กดอร์
    • 2024.03.30: Debian หยุดการบิลด์และเริ่มกระบวนการสร้างใหม่
    • 2024.04.02: นักพัฒนาหลักของ XZ รับรู้เหตุการณ์แบ็กดอร์
  • ค่าแฮชของดิสทริบิวชัน XZ ที่มีแบ็กดอร์อันตรายรวมอยู่:

    • xz-5.6.0: มีค่าแฮช MD5, SHA1, SHA256 ให้
    • xz-5.6.1: มีค่าแฮช MD5, SHA1, SHA256 ให้

การวิเคราะห์การติดเชื้อเบื้องต้น

  • Stage 1 - สคริปต์ build-to-host ที่ถูกดัดแปลง:

    • ไฟล์ซอร์สสำหรับรีลีสในตอนแรกไม่มีพิษภัย แต่เมื่อดาวน์โหลดจาก URL ที่แฮ็กเกอร์ควบคุม จะมีไฟล์ build-to-host.m4 ที่รันโค้ดอันตรายรวมอยู่ด้วย
    • ไฟล์ .m4 นี้จะถูกรันระหว่างการบิลด์ เพื่อแก้ไขและคลายการบีบอัดไฟล์แรกที่ถูกเพิ่มไว้ในโฟลเดอร์ทดสอบ
  • Stage 2 - เชลล์สคริปต์ที่ถูกฉีดเข้าไป:

    • สคริปต์อันตรายที่ถูกฉีดผ่านไฟล์ .m4 จะตรวจสอบว่ากำลังรันอยู่ภายในกระบวนการบิลด์ที่ตั้งใจไว้บน Linux หรือไม่
    • ใช้ไฟล์ good-large_compressed.lzma เพื่อรันสเตจถัดไป โดยไฟล์นี้ถูกบีบอัดอย่างถูกต้อง แต่ภายในข้อมูลที่คลายแล้วมีข้อมูลขยะปะปนอยู่
    • ดึงข้อมูล 33,492 ไบต์ด้วยคำสั่ง head/tail และใช้คำสั่ง tr เพื่อแทนที่ค่าพื้นฐานและถอดการทำให้อ่านยาก
  • Stage 3 - การดึงแบ็กดอร์ออกมา:

    • เชลล์สคริปต์ในขั้นสุดท้ายจะทำการตรวจสอบหลายอย่างว่าโปรแกรมกำลังรันอยู่ในสภาพแวดล้อมที่คาดไว้หรือไม่
    • ดึงโค้ดไบนารีของแบ็กดอร์ที่ซ่อนอยู่ในออฟเซ็ตอื่นของไฟล์ good-large_compressed.lzma เดียวกันออกมา
    • ใช้เครื่องมือ XZ ดึงไฟล์และใช้การเรียก head ต่อเนื่องหลายครั้งเพื่อถอดรหัสข้อมูลไบนารีด้วยอัลกอริทึมคล้าย RC4
    • คลายไฟล์ที่บีบอัดด้วย XZ ลบไบต์ช่วงต้นออกโดยเริ่มจากค่า predefined แล้วบันทึกเป็น liblzma_la-crc64-fast.o
    • แก้ไขฟังก์ชัน is_arch_extension_supported ของ crc_x86_clmul.h เพื่อเปลี่ยนการเรียก __get_cpuid เป็น _get_cpuid

การวิเคราะห์แบ็กดอร์ระดับไบนารี

  • สถานการณ์การโหลดแบบซ่อนตัว:

    • XZ ใช้ฟังก์ชัน lzma_crc32, lzma_crc64 สำหรับคำนวณ CRC และถูกเก็บในตาราง ELF symbol ด้วยชนิด IFUNC
    • มีการใช้ IFUNC เพื่อเลือกแบบเวอร์ชันที่เหมาะสมที่สุดแบบไดนามิก
    • แบ็กดอร์ถูกเก็บเป็นไฟล์อ็อบเจ็กต์ และเป้าหมายหลักคือให้ถูกลิงก์เข้ากับไฟล์ปฏิบัติการ main ระหว่างคอมไพล์
    • ไฟล์อ็อบเจ็กต์มี symbol _get_cpuid อยู่ และด้วยการลบขีดล่างหนึ่งตัวออกจากซอร์สต้นฉบับ เมื่อโค้ดเรียก _get_cpuid จริง ๆ แล้วจะไปเรียกเวอร์ชันของแบ็กดอร์แทน
  • การวิเคราะห์โค้ดแบ็กดอร์:

    • โค้ดแบ็กดอร์เริ่มต้นถูกเรียก 2 ครั้ง และพฤติกรรมอันตรายจริงจะเริ่มเมื่อ lzma_crc64 IFUNC เรียก _get_cpuid
    • ค้นหาที่อยู่ GOT เพื่อหาตำแหน่งของพอยน์เตอร์ cpuid แล้วแทนที่ด้วยพอยน์เตอร์ของฟังก์ชันอันตรายหลัก
    • เป้าหมายสำคัญคือการ hook ฟังก์ชันบางตัวเพื่อให้สามารถเฝ้าดูการเชื่อมต่อทั้งหมดไปยังระบบที่ติดเชื้อได้
  • การทำงานหลัก:

    • กำหนดเป้าหมาย hook ไปที่ฟังก์ชัน RSA_public_decrypt, EVP_PKEY_set1_RSA, RSA_get0_key ของ libcrypto
    • ตรวจสอบว่ากระบวนการปัจจุบันตรงตามเกณฑ์การทำงานหรือไม่ และตรวจสอบการมีอยู่ของ kill switch
    • ใช้โครงสร้าง Trie ในการดำเนินการกับสตริง
    • ใช้ symbol resolver routine มากกว่า 3 แบบเพื่อค้นหาตำแหน่งของโครงสร้าง ELF Symbol
    • ใช้ประโยชน์จากฟีเจอร์ rtdl-audit ในทางที่ผิดเพื่อ hijack symbol resolving routine และทำให้เกิดการ hook ฟังก์ชัน

ความเห็นของ GN⁺

  • บทความนี้แสดงให้เห็นกรณีการโจมตีที่ซับซ้อนอย่างมาก ซึ่งมีการฉีดมัลแวร์เข้าไปในซอฟต์แวร์โอเพนซอร์ส และเป็นบทเรียนว่าจุดแข็งของโอเพนซอร์สก็อาจถูกนำไปใช้ในทางกลับกันได้

  • การโจมตีทางไซเบอร์และแบ็กดอร์ที่มุ่งเป้าไปยังระบบ Linux กำลังซับซ้อนขึ้นเรื่อย ๆ โดยเฉพาะการโจมตีผ่านเซิร์ฟเวอร์ SSH ที่อาจเป็นภัยคุกคามด้านความปลอดภัยร้ายแรง

  • อีกด้านหนึ่ง เหตุการณ์นี้ก็แสดงให้เห็นถึงความสามารถในการชำระตัวเองของระบบนิเวศโอเพนซอร์ส สุดท้ายแบ็กดอร์ก็ถูกค้นพบโดยชุมชนและมีการตอบสนองอย่างรวดเร็ว ความโปร่งใสคือหัวใจสำคัญ

  • การใช้เทคนิคอย่างโครงสร้างข้อมูล Trie ขั้นสูง, Symbol Resolver, และการ hook ผ่าน dl_audit แสดงให้เห็นถึงวิวัฒนาการทางเทคนิคของมัลแวร์บน Linux และย้ำว่าจำเป็นต้องระมัดระวังเรื่องความปลอดภัยของระบบ Linux เป็นพิเศษ

  • เมื่อองค์กรนำซอฟต์แวร์โอเพนซอร์สมาใช้ ไม่ใช่แค่เรื่องไลเซนส์เท่านั้นที่ต้องตรวจสอบ แต่การตรวจสอบด้านความปลอดภัยก็เป็นสิ่งจำเป็นด้วย ควรพิจารณาให้แน่ใจว่าเป็นแหล่งแจกจ่ายที่เชื่อถือได้หรือไม่ และมีการเฝ้าติดตามโค้ดอย่างต่อเนื่องหรือไม่

1 ความคิดเห็น

 
GN⁺ 2024-04-13
ความเห็นจาก Hacker News

สรุป:

  • เมื่อพิจารณาว่าผู้โจมตีทุ่มเทอย่างมากกับสคริปต์และโค้ดเพื่อหลบเลี่ยงการตรวจจับ โปรเจกต์ทั้งหมดนี้ก็อาจทำหน้าที่เป็นทางเลือกแทนการเปลี่ยนผ่านหรือความพยายามหลายอย่างที่ดำเนินไปพร้อมกันได้
  • ควรคำนึงด้วยว่าการมุ่งความสนใจไปที่ SSHD อาจส่งผลกระทบต่อส่วนอื่นของทั้งระบบ หรือมิติทางเทคนิคและสังคม
  • การให้ไลบรารีลิงก์แบบไดนามิกแต่ละตัวมี GOT ของตัวเอง และทำเครื่องหมายตารางเป็นอ่านอย่างเดียวเมื่อการลิงก์แบบไดนามิกเสร็จสิ้น อาจเป็นขั้นตอนการเสริมความแข็งแกร่งที่มีประโยชน์
  • ซอร์สโค้ดดูเหมือนถูกสร้างขึ้นด้วยวิธีการรัน disassembler ทำความเข้าใจว่าโค้ดทำอะไร แล้วเปลี่ยนชื่อทุกอย่างให้เป็นชื่อที่อธิบายความหมายได้
  • ความหน่วงและความช้าของ SSH ที่เกิดจากบั๊กของแบ็กดอร์ในที่สุดก็ทำให้มันถูกเปิดโปง และชวนสงสัยว่าได้มีการวิเคราะห์ประเด็นนี้หรือไม่
  • รีโพซิทอรี xz กลับมาปรากฏบน GitHub อีกครั้งแล้ว และผู้ดูแลกำลังทำความสะอาด เช่น เอา ifunc support ออก และคอมมิตโค้ดที่สร้างไฟล์ทดสอบ
  • ทำให้นึกภาพได้ว่าคงยังมีแบ็กดอร์อีกมากที่ผู้คนยังไม่ค้นพบ พร้อมกับหวังว่าจะไม่มีอะไรที่แอบแนบเนียนแบบนี้อีก