เพิ่งออกข่าวว่า มีการระบุช่องโหว่ (อยู่ในรายการแล้วภายใต้ CVE-2022-31214) ในเครื่องมือแซนด์บ็อกซ์แอป Firejailมีรายละเอียดว่าข้อบกพร่องที่ตรวจพบอาจทำให้ผู้ใช้ในพื้นที่สามารถรูทบนระบบโฮสต์ได้
Firejail ใช้กลไกเนมสเปซ AppArmor และการกรองการเรียกระบบ (seccomp-bpf) ใน Linux สำหรับการแยกออก แต่ต้องการสิทธิ์ขั้นสูงในการกำหนดค่าการวางจำหน่ายแบบแยก ซึ่งได้มาจากการรวมยูทิลิตี้แฟล็ก suid root หรือรันด้วย sudo
ช่องโหว่เกิดจากข้อผิดพลาดในตรรกะของตัวเลือก “–join=” », ออกแบบมาเพื่อเชื่อมต่อกับสภาพแวดล้อมแบบแยกส่วนที่กำลังทำงานอยู่ (คล้ายกับคำสั่งล็อกอินสำหรับสภาพแวดล้อมแบบแซนด์บ็อกซ์) กับสภาพแวดล้อมที่กำหนดโดย ID ของกระบวนการที่ทำงานอยู่ในนั้น ในระยะก่อนการเปิดตัว Firejail จะตรวจจับสิทธิ์ของกระบวนการที่ระบุและนำไปใช้กับกระบวนการใหม่ที่รวมสภาพแวดล้อมด้วยตัวเลือก “–join”
ก่อนเชื่อมต่อ ตรวจสอบว่ากระบวนการที่ระบุกำลังทำงานในสภาพแวดล้อม firejail หรือไม่ การตรวจสอบนี้จะประเมินการมีอยู่ของไฟล์ /run/firejail/mnt/join เพื่อใช้ประโยชน์จากจุดอ่อน ผู้โจมตีสามารถจำลองสภาพแวดล้อม firejail ที่ไม่โดดเดี่ยวที่สมมติขึ้นได้ ใช้เนมสเปซเมานต์แล้วเชื่อมต่อโดยใช้ตัวเลือก “–join”
หากการกำหนดค่าไม่เปิดใช้งานโหมดของการห้ามรับสิทธิ์เพิ่มเติมในกระบวนการใหม่ (prctl NO_NEW_PRIVS) firejail จะเชื่อมต่อผู้ใช้กับสภาพแวดล้อมที่สมมติขึ้นและพยายามใช้การกำหนดค่าเนมสเปซผู้ใช้ของตัวระบุผู้ใช้ (ผู้ใช้เนมสเปซ) ของกระบวนการ init ( พีไอดี 1).
ตรรกะส่วนใหญ่ที่อยู่เบื้องหลังฟังก์ชันการรวมอยู่ในซอร์สโค้ด จากไฟล์ `src/firejail/join.c` ส่วนสำคัญของรหัสถูกเรียกใช้งานด้วย สิทธิ์ระดับสูง (มีผล UID 0) ID ของกระบวนการที่ส่งผ่านเป็นคำสั่ง อาร์กิวเมนต์บรรทัดได้รับการตรวจสอบเพื่อดูว่าเป็น r . หรือไม่ภาชนะและกำหนดคุณสมบัติบางอย่างที่ นอกจากนี้ยังนำไปใช้กับกระบวนการเข้าใหม่
เกณฑ์หลักในการตัดสินใจว่าจะเข้าร่วมกระบวนการเป้าหมายหรือไม่ สำเร็จคือการมีอยู่ของไฟล์ในเนมสเปซเมานต์ของเป้าหมาย พบกระบวนการใน /run/firejail/mnt/join การตรวจสอบนี้เสร็จสิ้นบน fฟังก์ชัน `is_ready_for_join()` ไฟล์ถูกเปิดโดยใช้ lแฟล็ก `O_RDONLY|O_CLOEXEC` และผลลัพธ์การติดตาม `fstat()` ควร ตรงตามข้อกำหนดต่อไปนี้:
– ไฟล์ต้องเป็นไฟล์ปกติ
– ไฟล์จะต้องเป็นเจ้าของโดยรหัสผู้ใช้ 0 (ตามที่เห็นจากผู้ใช้เริ่มต้น
เนมสเปซ)
– ไฟล์ต้องมีขนาด 1 ไบต์
เป็นผลให้ กระบวนการที่เชื่อมต่อผ่าน "firejail --join" จะจบลงในเนมสเปซ ID ผู้ใช้เดิมของผู้ใช้ ด้วยเอกสิทธิ์ไม่เปลี่ยนแปลง แต่อยู่ในพื้นที่จุดเชื่อมต่อที่ต่างกัน ซึ่งผู้โจมตีควบคุมโดยสมบูรณ์
เชลล์ที่ "เข้าร่วม" ที่เป็นผลลัพธ์จะอยู่บนผู้ใช้เริ่มต้น
เนมสเปซยังคงรักษาสิทธิ์ผู้ใช้ปกติเดิมไว้อย่างไรก็ตาม เนมสเปซการเมานท์จะเป็นเนมสเปซที่ถูกควบคุมโดยผู้โจมตี เนื่องจาก
ยังไม่ได้ใช้การกำหนดค่า nonewprivs ผู้โจมตีสามารถทำได้ในขณะนี้
รันโปรแกรม setuid-root ภายในเนมสเปซการเมานต์นี้
โดยเฉพาะอย่างยิ่ง ผู้โจมตีสามารถเรียกใช้โปรแกรม setuid-root ในพื้นที่ของจุดเชื่อมต่อที่สร้างขึ้น ทำให้สามารถเปลี่ยนแปลงการกำหนดค่า /etc/sudoers หรือพารามิเตอร์ PAM ในลำดับชั้นของไฟล์ และได้รับความสามารถในการเรียกใช้คำสั่งในฐานะรูท ใช้ sudo หรือยูทิลิตี้ของมัน
สุดท้าย เป็นเรื่องที่ควรค่าแก่การกล่าวขวัญว่าได้มีการพัฒนาการหาประโยชน์จากการทำงาน ทดสอบกับเวอร์ชันปัจจุบันของ openSUSE, Debian, Arch, Gentoo และ Fedora ด้วยการติดตั้งยูทิลิตี้ firejail
ปัญหาได้รับการแก้ไขใน firejail เวอร์ชัน 0.9.70 เพื่อเป็นการแก้ไขปัญหาด้านความปลอดภัย คุณสามารถตั้งค่าคอนฟิก (/etc/firejail/firejail.config) เป็น "no join" และ "force-nonewprivs yes"
ในที่สุด หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติมคุณสามารถตรวจสอบรายละเอียดได้ในไฟล์ ลิงค์ต่อไปนี้