- ในเดือนมีนาคม 2024 มีการค้นพบแบ็กดอร์ในซอฟต์แวร์
xz ที่ใช้สำหรับแตกไฟล์ source tarball ในลินุกซ์ดิสทริบิวชัน
- แบ็กดอร์นี้ถูกแทรกอย่างลับ ๆ ตลอด 3 ปีโดยผู้ดูแลที่มีเจตนาร้าย Jia Tan
- เหตุการณ์นี้ส่งผลกระทบอย่างมากเพราะเปิดทางให้เกิดการรันโค้ดจากระยะไกลได้ และตรวจจับได้ยากมาก
- Andres Freund นักพัฒนา Postgres ของ Microsoft บังเอิญพบมันระหว่างตรวจสอบปัญหาประสิทธิภาพตกต่ำ จึงช่วยหลีกเลี่ยงหายนะครั้งใหญ่ได้
วิธีการทำงานของการโจมตี
- แบ็กดอร์จะไฮแจ็กโปรแกรม
ssh เพื่อเปิดทางให้เกิดการรันโค้ดจากระยะไกล
- มันแก้ไขฟังก์ชัน
RSA_public_decrypt เพื่อให้ผู้โจมตีสามารถรันคำสั่งใดก็ได้เมื่อมีการล็อกอินด้วยคีย์ RSA ที่กำหนดไว้
- มันประกอบด้วยสององค์ประกอบหลัก:
- สคริปต์ที่ติดตั้งไฟล์อ็อบเจ็กต์อันตรายให้เป็นส่วนหนึ่งของกระบวนการบิลด์
xz
- ขั้นตอนที่ hook ฟังก์ชัน
RSA_public_decrypt
1. สคริปต์ติดตั้งไฟล์อ็อบเจ็กต์อันตราย
- ไฟล์อ็อบเจ็กต์อันตรายถูกซ่อนไว้ในไฟล์ทดสอบของที่เก็บ git ของ
xz
- แบ็กดอร์จะทำงานเฉพาะใน release tarball ที่ผู้ดูแลเป็นผู้จัดเตรียมเท่านั้น
2. ขั้นตอนการ hook ฟังก์ชัน RSA_public_decrypt
- ใช้ความสามารถ ifunc ของ
glibc เพื่อบังคับให้โค้ดที่รันในช่วงเวลา dynamic loading ถูกเรียกใช้งาน
- เมื่อ
ssh ทำงาน libsystemd และ liblzma จะถูกโหลด และในกระบวนการนี้แบ็กดอร์จะรันโค้ดตามอำเภอใจ
วิธีหลีกเลี่ยงหายนะ xz
- ต้องจัดการทั้งปัญหาทางสังคมและปัญหาทางเทคนิคเพื่อเพิ่มความน่าเชื่อถือของซอฟต์แวร์โอเพนซอร์ส
- ควรปรับปรุงกระบวนการความปลอดภัยของซัพพลายเชนซอฟต์แวร์
บิลด์ซอฟต์แวร์จากแหล่งที่เชื่อถือได้
- การโจมตีได้ผลเพราะดิสทริบิวชันจำนวนมากใช้ tarball ที่ผู้ดูแลจัดเตรียมไว้เพื่อบิลด์
xz
- หากเป็นไปได้ ควรบิลด์ซอฟต์แวร์จากแหล่งที่เชื่อถือได้มากที่สุด
เมื่อสถานการณ์เอื้ออำนวย...
- NixOS เป็นดิสทริบิวชันที่อิงกับโมเดลการจัดการแพ็กเกจแบบ functional และแต่ละแพ็กเกจถูกนิยามด้วยภาษาโปรแกรมเชิงฟังก์ชันชื่อ Nix
- NixOS มีวัฒนธรรมการใช้ source archive ที่สร้างอัตโนมัติจาก GitHub
สร้างความเชื่อถือให้ release tarball ที่ไม่น่าเชื่อถือ
- NixOS จำเป็นต้องใช้ tarball ที่ผู้ดูแลจัดเตรียมไว้ในขั้นตอนบูตสแตรป
- ควรมีมาตรการป้องกันบางอย่างเพื่อเสริมความแข็งแกร่งให้ความปลอดภัยของซัพพลายเชนซอฟต์แวร์
1. เปรียบเทียบซอร์ส
- การตรวจสอบว่า source tarball ที่ดิสทริบิวชันใช้นั้นตรงกับของ GitHub หรือไม่เป็นสิ่งสำคัญ
- อย่างไรก็ตาม release tarball มักแตกต่างจากซอร์ส และนั่นไม่ใช่ปัญหา
2. ใช้ประโยชน์จากการทำซ้ำได้ระดับบิต
- Reproducible builds คือคุณสมบัติของโปรเจ็กต์ซอฟต์แวร์ที่เมื่อบิลด์สองครั้งภายใต้เงื่อนไขเดียวกันแล้วจะได้อาร์ติแฟกต์เหมือนกัน
- ความสามารถในการทำซ้ำได้ระดับบิตช่วยสร้างความเชื่อถือให้กับ tarball ที่ผู้ดูแลจัดเตรียมไว้ซึ่งไม่น่าเชื่อถือ
บทสรุป
- เหตุการณ์แบ็กดอร์
xz เป็นเครื่องเตือนถึงความสำคัญของความปลอดภัยในซัพพลายเชนซอฟต์แวร์โอเพนซอร์ส
- ระบบอย่าง NixOS สามารถเสริมความปลอดภัยได้ด้วย reproducible builds.
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
NixOS และ reproducible builds ไม่ได้ตรวจพบ xz backdoor โดย NixOS แจกจ่าย xz build ที่เป็นอันตราย แต่ไม่มีปัญหาเพราะมันไม่ได้มุ่งเป้าไปที่ NixOS
ผู้เขียนดูเหมือนจะโฟกัสเฉพาะเหตุการณ์นี้มากเกินไป กรณีของ Jiatan เป็นเพียงกรณีเดียว และการป้องกันอาจล้มเหลวได้ในสถานการณ์อื่นด้วย
NixOS ไม่ได้เกี่ยวข้องเพราะ xz backdoor มุ่งเป้าไปที่ RedHat และ Debian ที่น่าแดกดันคือ backdoor นี้ถูกค้นพบโดยพนักงาน Microsoft
บทความกล่าวถึงว่าดิสโทรควรดึงซอร์สโค้ดโดยตรงจาก VCS (เช่น Github) แทน tarball สำหรับติดตั้งแบบดั้งเดิม
ถ้าจะโฟกัสที่เหตุการณ์ที่ NixOS อาจป้องกันได้ ควรไปโฟกัสที่เหตุการณ์ CrowdStrike มากกว่า ถ้าบูตด้วยการตั้งค่าของเมื่อวานได้ ปัญหาส่วนใหญ่ก็น่าจะบรรเทาได้
NixOS คอมไพล์ทุกอย่างจากซอร์ส ตรวจสอบทางคริปโตกราฟีว่าซอร์สที่ใช้ไม่ถูกดัดแปลง และมี version dependency ระหว่างแพ็กเกจ ส่วน Debian ก็มี reproducible builds เช่นกัน
คำว่า "ทำได้" หมายความว่ายังไม่ได้พิสูจน์ และในความเป็นจริงพวกเขาก็แจกจ่ายมันออกไป
เป็นการวิเคราะห์เชิงอธิบายที่ยอดเยี่ยม ชื่อเรื่องนั้นผิดและชวนให้เข้าใจผิด อาจ "ถูกต้องในทางเทคนิค" แต่ก็ในความหมายแบบ "มี backdoor" นั่นเอง
หาก PR ของ Jia Tan ได้รับการอนุมัติ อาร์ติแฟกต์ที่เป็นอันตรายก็อาจถูกปล่อยผ่าน Github release ได้ง่ายพอ ๆ กับ tarball จึงยากจะเข้าใจว่า Github release เป็นการบรรเทาด้านความปลอดภัยได้อย่างไร
ประเด็นคือ release tarball แตกต่างจากซอร์ส
git add & commitด้วย ถึงอย่างนั้นก็ยังต้องตรวจประวัติ commit อยู่ดี และเพราะมันดูไม่เป็นอันตรายด้วยตาเปล่า จึงสงสัยว่าจะตรวจสอบได้อย่างไรมันมีปัญหามากกว่าแค่การ push ไฟล์ทดสอบที่มีพิษ แต่ก็ยังยากจะเข้าใจว่า Nix จะป้องกันสิ่งนี้ได้อย่างไร
สงสัยว่าตัวเองเข้าใจบทความผิดไปหรือพลาดอะไรบางอย่างหรือไม่