- พบช่องโหว่ความปลอดภัยร้ายแรงใน GNU Screen 5.0.0 และการติดตั้งแบบ setuid-root
- ประเด็นหลักได้แก่ การยกระดับสิทธิ์เป็น root จากเครื่องภายใน, การจี้ TTY, การสร้าง PTY ที่เขียนได้โดยทุกคน
- ดิสทริบิวชัน Linux และ UNIX จำนวนมากได้รับผลกระทบบางส่วนหรือทั้งหมด
- มีการจัดทำ แพตช์ชั่วคราว และหลายดิสทริบิวชันจำเป็นต้องเร่งดำเนินการก่อน
- ตัวการออกแบบ setuid-root ของ Screen เองมี ความเสี่ยงด้านความปลอดภัยเชิงโครงสร้าง
1. บทนำ
- ในเดือนกรกฎาคม 2024 ผู้ดูแล upstream ของ Screen ได้ ขอให้ช่วยรีวิวโค้ด ทำให้เริ่มมีการตรวจสอบด้านความปลอดภัย
- ก่อนหน้านี้ไม่พบปัญหาเด่นชัด แต่ครั้งนี้พบช่องโหว่ยกระดับสิทธิ์เป็น root ที่ร้ายแรงใน Screen 5.0.0 เมื่อกำหนดค่าแบบ setuid-root
- นอกจากนี้ยังยืนยันได้ว่ามีช่องโหว่ด้านความปลอดภัยระดับเบาหลายรายการที่กระทบ เวอร์ชันก่อนหน้า (เช่น 4.9.1) เช่นกัน
- ในรายงานมีการแนบ ชุดแพตช์ตามเวอร์ชัน (4.9.1, 5.0.0)
- เนื้อหารวมถึงการตั้งค่าและเวอร์ชันของ Screen แยกตามดิสทริบิวชัน, ช่องโหว่หลัก, ความเสี่ยงในการพัฒนาที่เกี่ยวข้องกับ setuid-root, คำแนะนำเพื่อเสริมความปลอดภัย, ปัญหาในกระบวนการประสานการเปิดเผยข้อมูล, และเมทริกซ์ผลกระทบ
2. ภาพรวมการตั้งค่าและเวอร์ชันของ Screen
- เดือนสิงหาคม 2024 มีการออก Screen 5.0.0 และถูกรวมใน Arch Linux, Fedora 42, NetBSD 10.1
- 5.0.0 มีการ refactoring จำนวนมาก และบางส่วนเป็นโค้ดที่มีอยู่มานานกว่า 10 ปี
- ช่องโหว่บางรายการเพิ่งถูกนำเข้ามาใน 5.0.0 ขณะที่บางรายการมีอยู่แล้วใน เวอร์ชันก่อนหน้า (เช่น 4.9.1)
- ดิสทริบิวชันส่วนใหญ่ยังคงใช้ 4.9.1
- โหมดหลายผู้ใช้ของ Screen ใช้งานได้เฉพาะเมื่อติดตั้งแบบ setuid-root เท่านั้น และด้วยความซับซ้อนของโค้ดทำให้พื้นผิวการโจมตีเพิ่มขึ้นมาก
- ในบรรดาดิสทริบิวชันหลัก Arch Linux, FreeBSD, NetBSD ติดตั้ง Screen แบบ setuid-root; ส่วน Gentoo สามารถติดตั้งแบบ setuid-root ได้เฉพาะเมื่อใช้แฟลก USE “multiuser”
3. รายละเอียดประเด็นความปลอดภัย
3.a) การได้สิทธิ์ root ภายในเครื่องผ่าน logfile_reopen() (CVE-2025-23395)
- เมื่อรัน Screen 5.0.0 แบบ setuid-root ฟังก์ชัน logfile_reopen() จะสร้างไฟล์จากพาธที่ผู้ใช้ป้อนโดยไม่ลดสิทธิ์ก่อน
- ผู้โจมตีสามารถสร้างไฟล์ใดก็ได้ที่เป็นของ root เพื่อบันทึกข้อมูลจากเทอร์มินัลและนำไปใช้โจมตีต่อ
- ไฟล์ที่มีอยู่แล้วก็สามารถถูกนำไปใช้โจมตีได้ เช่น การแทรกโค้ดลงใน privileged shell script
- Arch Linux, NetBSD 5.0.0 เปราะบางเต็มรูปแบบ ขณะที่ Fedora และบางสภาพแวดล้อมของ Gentoo ได้รับผลกระทบบางส่วน
- แพตช์แก้ไขทำโดยกู้คืนการจัดการไฟล์แบบปลอดภัย และมีรายละเอียดผลกระทบแยกตามดิสทริบิวชัน
3.b) การจี้ TTY ระหว่างการเชื่อมต่อเซสชันหลายผู้ใช้ (CVE-2025-46802)
- ในฟังก์ชัน Attach() เมื่อเปิดใช้แฟลก multiattach จะมีการเปลี่ยน สิทธิ์ของ TTY เป็น 0666 ชั่วคราว
- ระหว่างกระบวนการนี้มี race condition ที่ทำให้ ผู้ใช้รายที่สามสามารถอ่าน/เขียน TTY ดังกล่าวได้
- มีความเสี่ยงทั้งการดักฟังข้อมูลขาเข้า, การแก้ไขข้อมูล, และการขโมยรหัสผ่าน
- ยังมีเส้นทางโค้ดที่ทำให้สิทธิ์ของ TTY ไม่ถูกคืนกลับสู่ค่าเดิม
- แพตช์แก้โดยตัดการทำ
chmod 666 ออก; แม้อาจทำให้ use case การเชื่อมต่อซ้ำบางแบบใช้งานไม่ได้ แต่เดิมก็ทำงานไม่ได้อยู่แล้ว
3.c) ช่องโหว่จากสิทธิ์เริ่มต้นของ PTY (CVE-2025-46803)
- ใน 5.0.0 สิทธิ์เริ่มต้นของ PTY ถูกเปลี่ยนจาก 0620 → 0622 (เขียนได้โดยทุกคน)
- ความเสี่ยงด้านความปลอดภัยจึงเพิ่มขึ้น โดยเฉพาะเพราะผู้ใช้ทุกคนสามารถเขียนไปยัง PTY ของผู้อื่นได้
- การเปลี่ยนแปลงนี้ดูเหมือนเกิดจากความผิดพลาด และแพตช์แก้ไขโดยคืนค่าเริ่มต้นที่ปลอดภัยตอนคอมไพล์ (0620)
- Arch Linux, NetBSD เป็นกลุ่มที่ได้รับผลกระทบหลัก
3.d) การรั่วไหลของข้อมูลการมีอยู่ของไฟล์ผ่านข้อความผิดพลาดของซ็อกเก็ต (CVE-2025-46804)
- ใช้ตัวแปรแวดล้อม SCREENDIR และข้อความ Error เพื่อ ตรวจสอบได้ว่ามีไฟล์/ไดเรกทอรีจริงอยู่หรือไม่ด้วยสิทธิ์ root
- เป็นการรั่วไหลของข้อมูลระดับเล็กน้อย แต่มีความเสี่ยงในทุกสภาพแวดล้อมที่ติดตั้งแบบ setuid-root
3.e) race condition แบบ TOCTOU ในการส่งสัญญาณ (CVE-2025-46805)
- จากช่วงเวลาระหว่างฟังก์ชัน CheckPid() และ Kill() ทำให้มีความเสี่ยงที่จะส่งสัญญาณด้วยสิทธิ์ root ไปยัง PID ที่ไม่ใช่เป้าหมาย
- โดยหลักแล้วอนุญาตเฉพาะ SIGCONT, SIGHUP เป็นต้น จึงจำกัดผลกระทบไว้บ้าง แต่ยังอาจก่อให้เกิดการปฏิเสธการให้บริการ (DoS) หรือความเสียหายด้านความถูกต้องเล็กน้อย
3.f) overflow ระหว่างส่งคำสั่งจากการใช้ strncpy() ผิดวิธี
- ใน 5.0.0 เกิด buffer overflow และโปรแกรมแครชจากการใช้
strncpy() อย่างไม่ถูกต้อง
- หากไม่แพตช์อย่างถูกต้อง เมื่อมีการส่งคำสั่งจะเกิดการเขียนทับหน่วยความจำหลัง MAXPATHLEN และนำไปสู่ภาวะบริการใช้งานไม่ได้
- แม้ไม่ใช่ปัญหาด้านความปลอดภัย แต่จำเป็นต้องแก้ไขอย่างรวดเร็วเพื่อความเสถียร
4. ความเสี่ยงเพิ่มเติมที่เกี่ยวข้องกับการทำงานแบบ setuid-root
- พบว่าในโหมดหลายผู้ใช้มี ตรรกะการจัดการ UID ของผู้ใช้หลายรายที่ไม่รัดกุม
- ตรรกะการ drop privilege ในสถานะ setuid-root ยังไม่สมบูรณ์
- ในเซสชันที่ root สร้างขึ้น การลดสิทธิ์อย่างมีประสิทธิภาพไม่เกิดขึ้นจริง ทำให้มีความเสี่ยงโดยรวมสูง
5. คำแนะนำทั่วไปเพื่อเสริมความปลอดภัย
- พบว่าในกระบวนการ refactoring โค้ดขนาดใหญ่ ตรรกะความปลอดภัยเดิมพังลง
- ด้วยธรรมชาติของไบนารีแบบ setuid-root จึงจำเป็นต้องมีชุดทดสอบด้านความปลอดภัย และออกแบบการจัดการไฟล์ซิสเต็ม/ตัวแปรแวดล้อมทั้งหมดอย่างระมัดระวัง
- โดยเฉพาะอย่างยิ่งไม่แนะนำให้รันทั้งโปรแกรมแบบ setuid-root และควรจำกัดฟีเจอร์ multi-user ไว้เฉพาะรูปแบบ opt-in สำหรับกลุ่มที่เชื่อถือได้เท่านั้น
- ตัวแปรแวดล้อม (เช่น PAH) ต้องถูกบังคับให้ระบุได้เฉพาะพาธที่เชื่อถือได้เท่านั้น
6. ปัญหาในกระบวนการประสานการประกาศช่องโหว่
- กระบวนการ ประสานงานกับ upstream ดำเนินไปอย่างไม่มีประสิทธิภาพ ทำให้การพัฒนาแพตช์และการเปิดเผยข้อมูลล่าช้า
- เนื่องจาก upstream ขาดความเข้าใจโค้ดและศักยภาพที่เพียงพอ จึงตอบสนองอย่างใกล้ชิดได้ยาก
- สุดท้ายฝ่ายดิสทริบิวชันเป็นผู้ขับเคลื่อนการพัฒนาแพตช์ และมีการเผยแพร่รายงานตามกำหนดการที่ประสานกันแล้ว
- ยังพบด้วยว่าโครงการ Screen เองมี ข้อจำกัดด้านศักยภาพในการดูแลและบำรุงรักษา
7. เมทริกซ์ผลกระทบ
- Arch Linux (5.0.0, setuid-root): ได้รับผลกระทบจาก 3.a, 3.b, 3.c, 3.d, 3.e, 3.f ทั้งหมด
- Debian/Ubuntu และดิสทริบิวชันอีกหลายรายการ: 3.b (ได้รับผลกระทบบางส่วน)
- Fedora 42 (5.0.0, setgid-screen): 3.b (ได้รับผลกระทบบางส่วน), 3.f
- Gentoo (4.9.1, setgid-utmp): 3.b (ได้รับผลกระทบบางส่วน), และหากเป็น unstable ebuild + USE flag multiuser จะได้รับผลเหมือน 5.0.0
- FreeBSD 14.2 (4.9.1, setuid-root): 3.b, 3.d, 3.e
- NetBSD 10.1 (5.0.0, setuid-root): 3.a, 3.b, 3.c, 3.d, 3.e, 3.f
- OpenBSD 7.7 (4.9.1): 3.b (ได้รับผลกระทบบางส่วน)
- openSUSE TW: 3.b (ได้รับผลกระทบบางส่วน)
8. กำหนดการ
- 2024-07-01: ได้รับคำขอรีวิวโค้ดจาก upstream
- 2025-01-08: เริ่มการรีวิว
- 2025-02-07: รายงานช่องโหว่ให้ upstream แบบไม่เปิดเผยต่อสาธารณะ พร้อมขอเปิดเผยแบบประสานงาน
- 2025-02~04: มีการหารือเรื่องแพตช์ และกำหนดการถูกปรับใหม่จากประเด็นช่วง embargo
- 2025-05-12: เผยแพร่รายงานฉบับนี้และประกาศอย่างเป็นทางการ
9. ลิงก์อ้างอิง
- GNU Savannah [หน้าของโครงการ Screen]
- openSUSE Bugzilla, แพตช์ที่เกี่ยวข้อง, CVE อ้างอิง, รายงานบั๊ก และลิงก์เอกสาร
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
screen -x <หน้าต่างของผู้ใช้ที่กำหนด>เพื่อให้นักเรียนใช้ได้เฉพาะหน้าต่างที่ได้รับอนุญาตใน ACL ของ screen นั้น ฉันใช้โปรเจ็กเตอร์เปิดดูหน้าจอของนักเรียนทีละคนให้ทุกคนเห็น แต่ก็ไม่น่าแปลกใจที่มันเต็มไปด้วยช่องโหว่ความปลอดภัยscreen -xchmod u+sกับ screen ความรู้สึกตอนต้องทำแบบนั้นมันแปลกมาก แต่ภายหลังถึงรู้ว่า screen มีฟีเจอร์ที่พึ่งพา setuid และบางระบบก็แจกจ่ายมาแบบนั้นเป็นค่าเริ่มต้น และเมื่อให้ u+s แล้ว screen ก็ไปอ่าน~/.screenrcของ root แทนของฉันเอง (ก็ยอมรับเป็นวิธีแก้ชั่วคราว) คิดว่าในแต่ละ build ของ screen อาจรองรับ setuid ไม่เหมือนกัน