- D-Bus คือบัสสำหรับการสื่อสารระหว่างแอปพลิเคชัน ซึ่งแนวคิดนั้นมีประโยชน์ แต่การติดตั้งใช้งานแย่มากและไม่เป็นมาตรฐาน
- เอกสารมาตรฐานนั้นไม่สมบูรณ์และไม่สอดคล้องกัน และตัวติดตั้งใช้งานจริงก็ไม่ได้ปฏิบัติตาม จนเกิดการพังทลายของความเข้ากันได้
- ช่องโหว่ด้านความปลอดภัยก็ร้ายแรงเช่นกัน โดยแอปสามารถอ่านข้อมูลลับของแอปอื่นได้เมื่ออยู่ในสถานะปลดล็อก
- เพื่อตอบสนองต่อปัญหานี้ ผู้เขียนกำลังพัฒนาระบบบัสใหม่
hyprtavern และโปรโตคอล hyprwire
hyprtavern พยายามแก้ปัญหาเชิงโครงสร้างของ D-Bus ด้วยการตรวจสอบชนิดข้อมูลอย่างเข้มงวด การจัดการสิทธิ์ที่มีมาในตัว และคลังเก็บความลับแบบปลอดภัย (kv) เป็นต้น
แนวคิดและข้อจำกัดของ D-Bus
- D-Bus เป็นระบบที่ทำให้แอปพลิเคชันและบริการสามารถเปิดเผยเมธอดและพร็อพเพอร์ตี รวมถึงเรียกใช้งานกันผ่านบัส (bus) ที่ใช้ร่วมกันได้
- ตัวอย่างเช่น หากแอปที่ให้บริการข้อมูลสภาพอากาศลงทะเบียน API ไว้บนบัส แอปอื่นก็สามารถค้นหาและใช้งานได้
- แต่ D-Bus มีการออกแบบที่ผ่อนปรนเกินไปและขาดโครงสร้าง ทำให้สามารถลงทะเบียนหรือเรียกใช้ออบเจ็กต์ใด ๆ พร้อมเมธอดตามอำเภอใจได้
- จึงเกิดปรากฏการณ์ “Garbage in, garbage out”
ความสับสนของเอกสารมาตรฐานและการติดตั้งใช้งาน
- เอกสารมาตรฐานของ D-Bus กระจัดกระจายอยู่หลายแห่ง และอยู่ในสภาพที่ยังไม่สมบูรณ์และเข้าใจยาก
- ตัวติดตั้งใช้งานจริงจำนวนมากไม่ปฏิบัติตาม หรือเลือกใช้ข้อกำหนดที่แตกต่างกันไปตามอำเภอใจ
- ผู้เขียนอธิบายว่า ระหว่างพัฒนา xdg-desktop-portal-hyprland เขาได้ติดตั้งใช้งานสเปก
restore_token แต่
ทุกแอปกลับใช้ฟิลด์ restore_data ที่ไม่เป็นทางการ จึงทำให้ใช้งานร่วมกันไม่ได้
- ชนิด
variant (a{sv}) ของ D-Bus อนุญาตให้ส่งข้อมูลแบบใดก็ได้ จึงถูกชี้ว่าเป็นสาเหตุหลักที่ทำลายความสม่ำเสมอของโปรโตคอล
ข้อบกพร่องของโครงสร้างด้านความปลอดภัย
- D-Bus ไม่มีการจัดการสิทธิ์แบบรวมศูนย์หรือกลไกการปฏิเสธ
- ทุกแอปสามารถเห็นการเรียกใช้งานของแอปอื่นได้ และหากไม่มีมาตรการความปลอดภัยที่ชัดเจน ก็สามารถเข้าถึงได้อย่างไม่จำกัด
- คลังเก็บความลับอย่าง gnome-keyring, kwallet ก็เปราะบางในเชิงโครงสร้างเช่นกัน
- เมื่อคลังถูกปลดล็อก ทุกแอปจะเข้าถึงข้อมูลลับทั้งหมดได้
- ผู้เขียนเรียกสิ่งนี้ว่า “อยู่ในระดับมุกตลกด้านความปลอดภัย”
ทางเลือกใหม่: hyprwire และ hyprtavern
- ผู้เขียนกำลังพัฒนาระบบบัสใหม่
hyprtavern เพื่อแก้ปัญหาของ D-Bus
hyprwire คือโปรโตคอล wire ที่กระชับและสม่ำเสมอ ซึ่งได้แรงบันดาลใจจากการออกแบบของ Wayland
- มีจุดเด่นคือการบังคับชนิดข้อมูล การเชื่อมต่อที่รวดเร็ว และโครงสร้างที่เรียบง่าย
hyprtavern ใช้โครงสร้างที่ให้แอปลงทะเบียนออบเจ็กต์ตามโปรโตคอลและค้นหากันและกันได้
- มีทั้งระบบสิทธิ์ในตัว การปฏิบัติตามโปรโตคอลอย่างเข้มงวด API ที่เรียบง่ายขึ้น และค่าปริยายที่ปลอดภัย
hyprtavern-kv (คลังเก็บคีย์-ค่าแบบปลอดภัย)
- เป็นโปรโตคอลหลัก (core) ที่ใช้แทน Secrets API ของ D-Bus
- ความลับที่แอปลงทะเบียนไว้จะอ่านได้เฉพาะโดยแอปนั้นเท่านั้น และไม่สามารถไล่ดูรายการทั้งหมด (enumeration) ได้
- ยังมีแผนเพิ่มการควบคุมการเข้าถึงตาม ID สำหรับแอป Flatpak, Snap และ AppImage
- ข้อมูลจะถูกเก็บแบบเข้ารหัสเสมอ และหากตั้งรหัสผ่านไว้ก็สามารถรับประกันความปลอดภัยที่ใช้งานได้จริง
- ทุกแอปจะสามารถใช้ความสามารถของคลังเก็บความลับที่ปลอดภัยได้เป็นค่าปริยาย
สถานะการพัฒนาและแผนในอนาคต
hyprtavern ยังอยู่ในระยะเริ่มต้นของการพัฒนา และมีแผนจะถูกนำไปใช้ภายในใน Hyprland เวอร์ชัน 0.54
- คาดว่าการนำไปใช้ในช่วงแรกจะยังจำกัด แต่สามารถเปลี่ยนผ่านแบบค่อยเป็นค่อยไปได้
- ต่างจาก D-Bus ตรงที่สามารถรันเซสชันบัสหลายตัวคู่ขนานกันได้ จึงสามารถเขียนพร็อกซีเพื่อความเข้ากันได้เช่นกัน
- เขียนด้วย C++ และยังสามารถทำ binding สำหรับ Rust, Go และ Python ได้ไม่ยาก
- ผู้เขียนย้ำว่า “D-Bus นั้นแก้ไขจากรากฐานไม่ได้ และต้องออกแบบใหม่ทั้งหมด”
สรุป FAQ
- ต่อคำวิจารณ์ว่าเป็นการ “ประดิษฐ์ล้อขึ้นมาใหม่” ผู้เขียนระบุว่า การออกแบบพื้นฐานของ D-Bus พังตั้งแต่ต้น จึงเลี่ยงการออกแบบใหม่ไม่ได้
- เอกสารในตอนนี้ยังอยู่ในสถานะ WIP (อยู่ระหว่างดำเนินการ) และจะเปิดเผยเมื่อเสร็จสมบูรณ์
- เหตุผลที่ไม่ใช้ Wayland คือไม่เหมาะกับการใช้เป็น IPC ทั่วไป
- สามารถเขียน D-Bus compatibility proxy (
hyprtavern-dbus-notification-proxy) ได้
- เหตุผลที่ใช้ C++ แทน Rust คือภาษา主ที่ผู้พัฒนาใช้คือ C++
- ในแง่ความปลอดภัย การโจมตีแบบ
LD_PRELOAD อาจกันได้ไม่สมบูรณ์ แต่เป็นโครงสร้างที่เพิ่มความยากในการโจมตีและโอกาสในการตรวจจับ
บทสรุป
- D-Bus ถูกชี้ว่าเป็นคอขวดของระบบนิเวศเดสก์ท็อปลินุกซ์ เนื่องจากมีลักษณะไม่เป็นมาตรฐาน ไม่ปลอดภัย และไม่สม่ำเสมอ
hyprtavern กำลังถูกพัฒนาให้เป็นบัส IPC ที่ทันสมัยและปลอดภัยเพื่อมาแทนที่สิ่งนี้ และ
คาดว่าจะมีการนำไปใช้แบบค่อยเป็นค่อยไปโดยมีระบบนิเวศของ Hyprland เป็นศูนย์กลาง
- เป้าหมายคือ “ทำให้ userspace น่าใช้งานยิ่งขึ้น”
1 ความคิดเห็น
ความเห็นบน Hacker News
พอเห็นประเด็นถกเถียงเรื่อง ช่องโหว่การเข้าถึงที่เก็บข้อมูลลับ ของ GNOME ก็อดขำไม่ได้ที่ทีม GNOME ปฏิเสธปัญหาโดยอ้างโมเดลความปลอดภัยว่า “แอปที่ไม่เชื่อถือไม่สามารถสื่อสารกับบริการเก็บความลับได้”
รู้สึกว่า GNOME เป็นโครงการที่บริหารโดยพวก ตัวตลก จริงๆ
มีคนบอกว่าจะ “ทำ bus ตัวใหม่ขึ้นมาเอง” ผมเลยเสนอว่าเอา Binder ที่ถูกแจกจ่ายไปแล้วบนอุปกรณ์นับพันล้านเครื่องมาใช้ซ้ำดีไหม
Binder คือ IPC แกนหลักของแอนดรอยด์ และมีทั้งนักพัฒนามากกว่าและโค้ดที่ผ่านการพิสูจน์มาแล้วมากกว่ามาก
บทความที่เกี่ยวข้อง: LWN, Rust-for-Linux mailing list
ผมเคยคาดหวังกับ Hyprwire และ Hyprtavern แต่แทบไม่มีเอกสารหรือการทดสอบเลย
น่าเสียดาย เพราะโปรเจ็กต์พวกนี้น่าจะเป็นจุดเริ่มต้นที่ดีได้
นักพัฒนา OpenWrt ทำทางเลือกชื่อ ubus ไว้นานมากแล้ว
อ้างอิง: เอกสาร ubus, เปรียบเทียบ ubus vs dbus
แต่โมเดลความปลอดภัยแทบไม่มีเลย ซึ่งก็มีเหตุผลตามลักษณะของ OpenWrt
ปัญหาอย่างหนึ่งของ D-Bus คือ ส่วนขยายเบราว์เซอร์ ที่คุยกับ GNOME/KDE แล้วก่อให้เกิดช่องโหว่
แค่เข้าเว็บไซต์ก็อาจยิง D-Bus API จนเดสก์ท็อปค้างได้แล้ว
ถ้าเป็นนักวิจัยด้านความปลอดภัย D-Bus เป็นพื้นที่ที่น่าสำรวจมากจริงๆ
D-Bus คือสิ่งที่ใกล้เคียงกับ XPC, COM, Android IPC มากที่สุดบนลินุกซ์เดสก์ท็อป
แต่เพราะ ความแตกกระจายของเดสก์ท็อป เลยสร้างสแตกพัฒนาที่รวมศูนย์ได้ยาก
ของที่ทำให้ GNOME ใช้ได้อาจไม่มีประโยชน์บน KDE และ XFCE หรือ Sway ก็ไปคนละทางอีก
เพิ่งรู้เป็นครั้งแรกว่าที่เก็บข้อมูลลับอย่าง KWallet หรือ GNOME Keyring นั้น ถ้าอยู่ในสถานะปลดล็อกแล้ว แอปไหนๆ ก็เข้าถึงได้แทบทั้งหมด
พอลองดูผ่าน GUI ของ
seahorseก็เห็นว่าส่วนใหญ่เป็น คีย์ที่เกี่ยวกับ Chromium หรือโทเค็นบัญชี JetBrainsไม่มีรหัสผ่านแบบข้อความล้วน แต่ก็อดคิดไม่ได้ว่าถ้าเป็นแอปอันตรายไปคุ้ยข้อมูล Chromium ต่อ ก็คงเจออะไรเพิ่มได้อีก
ถ้าระบบไม่แจ้งเตือนเวลามีการเข้าถึง ต่อให้ซอฟต์แวร์ไหนเป็นคนจัดการก็แทบไม่ต่างกันมาก
มีคำถามว่า “ทำไมต้องมี โปรโตคอล bus แบบใช้งานทั่วไป ด้วย?”
แค่ใช้ HTTP หรือโปรโตคอล JSON ง่ายๆ บน Unix domain socket ก็น่าจะพอแล้ว
ทั้งการจัดการสิทธิ์, SSH forwarding, การ mount แบบคอนเทนเนอร์ ก็รองรับได้หมด
D-Bus มีทั้ง service, interface, path, method และโครงสร้างที่ซับซ้อน แต่การระบุข้อความกลับยังไม่สมบูรณ์ และยังต้องรู้รายละเอียดโปรโตคอลของแต่ละแอปด้วย
สุดท้ายเลย ทำ proxy ได้ยาก และเป็นระบบที่ซับซ้อนเกินจำเป็น
การออกแบบของ D-Bus ดูเหมือนเป็นตัวอย่างของ กฎแห่งความสุ่ม ที่ว่า “ทางออกที่ดีที่สุดไม่ได้ถูกเลือกเสมอไป”
เหมือนกับที่มีเฟรมเวิร์กจำนวนมากดีกว่า React แต่ไม่เป็นที่รู้จักจนหายไป
การที่ GNOME โต้แย้งรายงานช่องโหว่พร้อมยกข้อจำกัดการเข้าถึง sandbox ของ Flatpak ขึ้นมา ทำให้นึกถึง บล็อกโพสต์เก่าของ Microsoft
แถมยังเอาคำพูดที่อ้างอิงมาแปะเป็น ภาพหน้าจอ อย่างเดียวจนคัดลอกไม่ได้อีก เข้าใจไม่ได้จริงๆ