โพรงกระต่ายของแบ็กดอร์ xz sshd ลึกกว่าที่คาดไว้มาก
(twitter.com/bl4sty)- แบ็กดอร์ sshd ของ xz ไม่ได้หยุดแค่ฮุก
RSA_public_decryptที่เปิดเผยในตอนแรก แต่ยังมี เส้นทางโค้ดเพิ่มเติม ที่เข้าถึงได้ยากกว่าถูกทริกเกอร์แล้วบางส่วน - ลำดับการโจมตีคือใช้คำสั่งที่ถูกดัดแปลงเพื่อติดตั้งฮุก
mm_answer_keyallowedจากนั้นประกอบบัฟเฟอร์คำสั่งด้วย กุญแจสาธารณะ ssh-rsa ปลอม หลายตัว - “magic buffer” นี้บรรจุคำสั่งแบ็กดอร์เพิ่มเติมและ ลายเซ็น ed448 2 ชุด โดยลายเซ็นสะท้อนทั้งค่าไดเจสต์ SHA256 ของ host key และ
session_idของ KEX - PoC ปัจจุบันใช้ไลบรารีไคลเอนต์ SSH paramiko ที่ถูกแก้ไขอย่างหนัก และคำสั่ง
0x03ทำให้สามารถทำ RCE แบบอาศัยsystem()และตั้งค่า uid/gid ได้ - ยืนยันแล้วว่าสามารถข้ามการยืนยันตัวตนได้ โดย
mm_keyallowed_backdoor cmd 1สามารถเขียนทับการตอบกลับของmm_answer_authpasswordทำให้ล็อกอินได้ด้วย รหัสผ่านใดก็ได้
เส้นทางแบ็กดอร์ที่เชื่อมลึกกว่าเดิม
- แบ็กดอร์ xz sshd มีความสามารถที่ลึกกว่าพฤติกรรมที่เคยทราบในตอนแรก และบางส่วนถูกทริกเกอร์ได้โดยตรงแล้ว
- จุดเข้าหลักคือฮุก
RSA_public_decrypt- เมื่อส่งคำสั่งที่สร้างมาอย่างถูกต้อง จะมีการติดตั้งฮุกอีกตัวในฟังก์ชัน
mm_answer_keyallowedของsshd - หลังจากนั้นจะส่งกุญแจสาธารณะ
ssh-rsaปลอมหลายตัวเพื่อแยกและประกอบ “magic buffer” เข้าด้วยกัน
- เมื่อส่งคำสั่งที่สร้างมาอย่างถูกต้อง จะมีการติดตั้งฮุกอีกตัวในฟังก์ชัน
- “magic buffer” คือบัฟเฟอร์ที่เก็บคำสั่งแบ็กดอร์เพิ่มเติม
- ภายในยังมี ลายเซ็น ed448 2 ชุด
- ลายเซ็นเหล่านี้ถูกทำ salt ด้วยค่าไดเจสต์ SHA256 ของ host key เช่นเดียวกับลายเซ็นแบ็กดอร์ฝั่ง
RSA_public_decrypt - ลายเซ็นสุดท้ายยังสะท้อน
session_idขนาด 0x20 ไบต์ที่ได้มาจากการแลกเปลี่ยนกุญแจเริ่มต้นของ SSH (KEX)
PoC และการข้ามการยืนยันตัวตน
- PoC ปัจจุบันถูกสร้างด้วยไลบรารีไคลเอนต์ SSH paramiko ที่ถูกแก้ไขอย่างหนัก
- คำสั่งที่ถูกทริกเกอร์ในตอนนี้คือ
0x03ของเส้นทางโค้ดนี้- ทำให้ RCE พื้นฐานผ่าน
system()กลับมาใช้งานได้อีกครั้ง - รองรับการตั้งค่า uid/gid ด้วย
- ทำให้ RCE พื้นฐานผ่าน
- ยังมีโค้ดอีกส่วนที่ต้องทำความเข้าใจเพิ่มเติม และเนื่องจากหนึ่งในคำสั่งแบ็กดอร์ของ
mm_answer_keyallowedจะไปฮุกmm_answer_keyverifyในท้ายที่สุด จึงดูเหมือนว่าสามารถ ข้ามการยืนยันตัวตนทั้งหมด ของเซสชันแบบโต้ตอบได้ - หลังจากนั้นก็มีการยืนยันการข้ามการยืนยันตัวตนแล้ว
mm_keyallowed_backdoor cmd 1สามารถเขียนทับการตอบกลับของmm_answer_authpasswordให้เป็นค่าที่กำหนดเองได้- หากตั้งค่าการตอบกลับเป็น
{ u32(9), u8(13), u32(1), u32(0) }ก็จะล็อกอินได้ด้วยรหัสผ่านใดก็ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
https://threadreaderapp.com/thread/1776691497506623562.html
เหตุการณ์นี้ในบางแง่ก็ดูเป็นงานระดับมืออาชีพมาก แต่ในอีกแง่ก็เหมือนมือสมัครเล่นพอสมควรจนน่าแปลก
พวกเขาสร้างตัวตนที่น่าเชื่อถือมานานพอจนได้เป็นผู้ดูแลแพ็กเกจสำคัญ ดำเนินการโจมตีแบบ social engineering ที่เหมือนมีหลายคนเกี่ยวข้อง ไม่เปิดเผยตัวจริงหรือที่มาของการโจมตี และยังทำ obfuscation ได้อย่างแนบเนียน
แต่ในขณะเดียวกัน การปล่อยให้บั๊กและ performance regression หลุดเข้าไปในเวอร์ชัน production ก็ดูหละหลวม ถ้าเป็นองค์กรที่มีรัฐหนุนหลังและเก่งกาจจริง ก็น่าจะทดสอบกันอย่างหนักแบบปิดก่อนส่งเข้าโปรเจ็กต์สาธารณะ เพื่อกำจัดอาการช้าลงที่อาจทำให้คนสงสัย
เหตุการณ์ “อาจเป็น backdoor” ล่าสุดของ iOS ก็ชี้เหมือนกันว่า องค์กรที่สะสมช่องโหว่ไว้เยอะไม่ได้ใส่ใจเสมอไปว่าบางส่วนจะถูกเผาทิ้ง
เป้าหมายคือเซิร์ฟเวอร์และ appliance แล้วจะมีเซิร์ฟเวอร์หรือ appliance กี่ตัวกันที่รัน Valgrind บน image ตั้งต้น พอย้อนคิดก็ดูเหมือน “ทำไมถึงไม่คิดแบบนั้นนะ” แต่มีโอกาสสูงว่าพวกเขาทดสอบกับ system image ที่เป็นเป้าหมาย ไม่ใช่กับ image ปรับแต่งเองของนักพัฒนาทั่วไป
Kevin Beaumont คาดว่า “Jia Tan” เห็นสิ่งนี้แล้วเข้าใจทันทีว่า backdoor อาจถูกทำให้ใช้การไม่ได้ จึงรีบเร่งเพื่อไม่ให้งานมหาศาลที่ใส่ลงไปใน exploit นี้สูญเปล่า [1] และฟังดูน่าจะใช่
แรงกดดันจาก เดดไลน์ นั้นน่าจะเป็นสาเหตุให้เกิด crash ใน 5.6.0 และทำให้ไม่มีเวลาพอจะเก็บงานเพื่อลดหรือกำจัด performance regression ซึ่งเป็นสาเหตุหลักที่ทำให้เรื่องนี้ถูกจับได้
[0]: https://github.com/systemd/systemd/pull/31550
[1]: https://doublepulsar.com/inside-the-failed-attempt-to-backdo...
อย่างที่ Patrick McKenzie พูดไว้ที่อื่น องค์กรอาชญากรรมก็ขับเคลื่อนด้วยคณะกรรมการและฉันทามติเหมือนองค์กรที่ไม่ใช่อาชญากรรม มองแบบนั้นแล้ว เรือจะจมเพราะ performance แย่ลงจาก feature bloat ก็ฟังดูสมเหตุสมผล บริษัทที่ฉันเคยทำงานด้วยยังเคยพลาดแบบสมัครเล่นกว่านี้อีก
หรือบางที backdoor ตัวอื่นหรือช่องทางสำรองที่ใช้อยู่ก่อนอาจถูกปิดไปแล้ว เลยต้องการเส้นทางใหม่อย่างเร่งด่วน
[1] https://en.wikipedia.org/wiki/Poisoning_of_Alexander_Litvine...
ความซับซ้อนของเรื่องนี้น่าสนใจมาก เพราะสุดท้ายกลับถูกจับได้จาก performance regression ที่ค่อนข้างสะดุดตา
มันทำให้นึกถึงคำพูดจากรายการอาชญากรรมจริงประโยคหนึ่งว่า “มีเป็นล้านวิธีที่จะถูกจับได้หลังจากฆ่าคน และถ้าคุณนึกออกได้สักครึ่งหนึ่งก็ถือว่าเป็นอัจฉริยะแล้ว”
และอาจมีอีกคนคอยดูแล บัญชีปลอม ต่าง ๆ และโต้ตอบในคอมเมนต์กับ PR
ไม่รู้ว่าครั้งนี้แค่โชคร้ายเลยโดนจับได้ หรือจริง ๆ แล้วการทำให้การโจมตีแบบนี้สำเร็จนั้นยากเกินไป หวังว่าอย่างหลังจะจริง แต่เราก็ไม่มีทางรู้
ฉันค่อนข้างมั่นใจว่าแพตช์ libsystemd ของ @teknoraver ทำให้ เส้นตาย ของพวกเขาเปลี่ยนไป
เมื่อมีบทความเชิงเทคนิคที่เจาะรายละเอียดลึก ๆ เกี่ยวกับเหตุการณ์แบบนี้ออกมาเยอะ มักจะสงสัยอยู่บ่อย ๆ ว่าทำไมทุกคนถึงพูดว่า “นี่ต้องมีรัฐหนุนหลังแน่ ๆ”, “ดู timestamp สิ นี่คือหลักฐานที่โต้แย้งไม่ได้”
เหตุการณ์ xz เป็นการโจมตีที่แนบเนียนและใช้เวลาวางแผนนานก็จริง แต่จำเป็นจริงหรือที่จะต้องมีอะไรบางอย่างที่เกินกว่า บุคคลที่มีความสามารถเพียงคนเดียว? การที่คนทั่วไปบนอินเทอร์เน็ตสามารถวิเคราะห์และทำความเข้าใจมันได้ ก็แปลได้เหมือนกันว่ามันอยู่ในขอบเขตที่คนคนหนึ่งจะเข้าใจได้
ทำไมความเป็นไปได้ที่เป็นเพียงคนฉลาดแต่ไม่พอใจคนหนึ่งลงมือเพียงลำพังถึงเป็นไปไม่ได้
แผนเพื่อผลกำไรในลักษณะนี้ไม่สมเหตุสมผล ผมไม่ได้ตัดความเป็นไปได้ว่าจะเป็นผู้กระทำที่ไม่มีเหตุผลหรือเป็นบุคคลที่มีแรงจูงใจที่ไม่ใช่เงิน แต่ก็ทำให้ผู้กระทำระดับรัฐดูเป็นผู้ต้องสงสัยที่น่าเชื่อที่สุด
ถ้าสำเร็จ มูลค่าที่ขายได้คงมหาศาล แต่โอกาสที่จะฝัง exploit ไว้ในโครงสร้างพื้นฐานสำคัญแล้วไม่ถูกจับได้อยู่นานพอจนมีลูกค้ายอมซื้อไปใช้นั้นต่ำมาก รัฐรับความเสี่ยงแบบ moonshot ได้ แต่ถ้าเป็นบุคคลธรรมดาก็น่าจะมองหาเป้าหมายที่มี expected value สูงกว่า
แน่นอนว่านั่นก็ไม่ได้หมายความว่าต้องเป็นผู้กระทำระดับรัฐที่เก่งมากหรือมีการจัดสรรทรัพยากรจำนวนมาก
แต่สิ่งนั้นก็ใช้กับ นักพัฒนาโอเพนซอร์ส จำนวนไม่น้อยไม่ใช่หรือ แรงจูงใจก็ชัดเจน exploit นี้น่าจะมีมูลค่าหลายล้านดอลลาร์ในตลาดมืด
ผมเห็นการคาดเดาจากคนที่รู้เรื่องดีอยู่เยอะ แต่ไม่เคยเห็นถ้อยคำแบบนั้น
มีบทความไหนสรุป การทำ obfuscation ของตัว backdoor เองไหม? หมายถึง backdoor ตัวจริง ไม่ใช่ build script สำหรับติดตั้ง
ผมเอาไบนารีไปใส่ใน Ghidra แล้วไล่ดูฟังก์ชันที่หาเจอ แต่ไม่คุ้นกับกลไก ifunc ที่ใช้ดักการทำงาน เลยยอมแพ้และปล่อยให้คนอื่นจัดการต่อ
เพราะมีฟังก์ชันป้องกันการดีบัก ผมเลยคิดว่าโค้ดก็น่าจะถูก obfuscate ด้วย และเพราะมันถูกแจกจ่ายเป็นไบนารีทึบแสง ผมคิดว่าอย่างน้อยบางส่วนของโค้ดน่าจะถูกเข้ารหัสด้วยคีย์ที่เราไม่มี คล้ายกับบางส่วนของ payload ใน STUXNET
การมีฟังก์ชันป้องกันการดีบักไม่ได้แปลว่าโค้ดต้องถูก obfuscate เสมอไป อย่างที่บอกไปข้างบน มันเกิดขึ้นตั้งแต่ตอน build แล้ว เหมือนติดกับดักไว้ในบ้านตัวเองเรียบร้อยแล้ว
เหตุการณ์นี้แสดงให้เห็นถึงปัญหาที่เกิดขึ้นเมื่อผู้ดูแลแพ็กเกจไม่นำ ซอร์สจากแหล่งที่มาที่ถูกต้อง มาใช้
ผมไม่ได้ตามเรื่องนี้แบบละเอียดมาก แต่แปลกมากที่แทบไม่ได้ยินการพูดถึง ผู้ก่อเหตุ ของการแฮ็กเลย
https://rheaeve.substack.com/p/xz-backdoor-times-damned-time...
ถ้าดูว่ามีความต่างด้านสำนวนเกิดขึ้นตามเวลาหรือไม่ ก็อาจพอมองได้ว่ามีหลายคนใช้เพอร์โซนาเดียวกันหรือเปล่า อีกทั้งยังมีโค้ดที่ถูก commit ไว้พอสมควร ก็น่าลองดูความต่างของสไตล์โค้ดเพื่อประเมินว่ามีมากกว่าหนึ่งคนเกี่ยวข้องหรือไม่
โชคดีมากที่มันถูกค้นพบก่อนจะแพร่หลาย
ไม่ใช่แค่เพราะเหตุผลตรงไปตรงมาว่าเราไม่อยากให้ผู้กระทำที่ไม่รู้ว่าเป็นใครมี remote code execution อยู่ในโครงสร้างพื้นฐานของเรา ถ้าคนยังขุดคุ้ยกันต่อไป ในที่สุดก็อาจมีคนสร้าง payload ที่ทำให้ใคร ๆ ก็ใช้ backdoor นี้ได้
การมีผู้กระทำเพียงรายเดียวที่เข้าถึงได้ก็แย่อยู่แล้ว แต่การที่ใครก็เข้าถึงได้ยิ่งแย่กว่า
ลิงก์ที่ดูได้แทน thereaderapp.com:
https://nitter.poast.org/bl4sty/status/1776691497506623562
น่าประหลาดใจที่ผ่านไปหลายวันแล้วแต่ก็ยังคลี่คลายไม่หมด
ทั้งที่คนทั่วโลกกำลังจับตาดูอยู่ และชิ้นส่วนสำคัญก็น่าจะเปิดเผยต่อสาธารณะตามทฤษฎีแล้ว การที่มันยังทนได้ขนาดนี้แปลว่า การทำ obfuscation น่าจะทำมาได้ดีมาก
สิ่งที่น่ากังวลในเหตุการณ์นี้คือความเป็น เกมระยะยาว
อย่างแรก พวกเขารอจังหวะอยู่นานเพื่อสร้าง “โครงสร้างพื้นฐาน” สำหรับทำ backdoor อย่างที่สอง หลังจาก exploit แพร่เข้าไปถึงโปรดักชันจริงแล้ว ก็น่าจะมีการเตรียมเกมระยะยาวอีกชั้นไว้แล้ว วิธีที่ถูกต้องในการใช้เงินรางวัลลอตเตอรี่ก็คือการเอาไปลงทุน
อย่างที่สาม มันทำให้สงสัยว่าตอนนี้ยังมีเกมแบบนี้กำลังดำเนินอยู่หรือเปล่า น่ากลัวมาก