ช่องโหว่รันโค้ดตามอำเภอใจที่เจาะแซนด์บ็อกซ์ได้ใน KDE Plasma
(blog.kimiblock.top)- มีการยืนยันผ่าน PoC แล้วว่า เนื่องจากพฤติกรรมการจัดการหน้าต่างของ KDE Plasma แอปที่อยู่ในแซนด์บ็อกซ์สามารถรัน ไบนารีตามอำเภอใจบนโฮสต์ ได้เมื่อผู้ใช้คลิก
- สาเหตุหลักคือ KWin เชื่อถือ app_id ที่แอประบุมา และยังคงมีเส้นทางการเรียกใช้งานที่อิง
/proc/PID/cmdlineโดยไม่มีการจับคู่กับไฟล์.desktopจริง - PoC จำลองลำดับการทำงานที่ทำให้
/usr/bin/kcalcถูกเรียกใช้นอกแซนด์บ็อกซ์ โดยใช้โฮสต์ Arch Linux, แอป Flatpak และ Mesaeglgears_waylandที่ดัดแปลง - เมื่อผู้ใช้เลือก Open New Window จากไอคอนบนแถบงาน หรือคลิกปุ่มกลาง โปรเซสเป้าหมายจะเริ่มทำงานในสภาพที่เปิดเผยอยู่ใน
app.slicecgroup และ host mount namespace - แนวทางบรรเทาคือควรตรวจสอบ app ID จาก security context ของแซนด์บ็อกซ์,
XdpAppInfoและ control groups และต้องบล็อกการเปิดหน้าต่างใหม่สำหรับหน้าต่างที่ไม่ตรงกับไฟล์.desktop
ลำดับการหลุดออกจากแซนด์บ็อกซ์ที่ PoC แสดงให้เห็น
- แอปอันตรายภายในแซนด์บ็อกซ์สามารถปลอมตัวเป็นอีกแอปหนึ่งและรันไบนารีตามอำเภอใจบนโฮสต์ได้ทันทีที่ผู้ใช้เรียก Open New Window
- แม้ PoC นี้จะสาธิตด้วย Flatpak แต่ผู้เขียนสรุปว่าสามารถใช้ได้กับแซนด์บ็อกซ์แบบอื่นเช่นกัน ไม่ว่าระบบนั้นจะรองรับ security context หรือไม่
- ชุดทดสอบประกอบด้วยดังนี้
- โฮสต์ Arch Linux
- dependency สำหรับบิลด์
wget,unzip,meson - แอป Flatpak
io.github.johannesboehler2.BmiCalculatorที่ไม่ได้ให้สิทธิ์เพิ่มเติม - เนื่องจากบิลด์ภายในแซนด์บ็อกซ์ได้ไม่ง่าย จึงส่งเข้า Flatpak เฉพาะพาธของไบนารีอันตราย
- ไบนารีเป้าหมายที่ระบุคือ
/usr/bin/kcalc
- เมื่อรันไบนารีอันตราย แถบงานจะแสดง ไอคอน KCalc
- เมื่อผู้ใช้คลิกขวาแล้วเลือก Open New Window
/usr/bin/kcalcจะเริ่มทำงานนอกแซนด์บ็อกซ์- ตำแหน่งที่รันคือ
app.slicecgroup - mount namespace เป็นฝั่งโฮสต์
- ส่งผลให้รันในสภาพที่ถูกเปิดเผยอย่างสมบูรณ์
- ตำแหน่งที่รันคือ
กระบวนการค้นพบและเบาะแส
- ระหว่างทดสอบ Portable sandbox ของ KDE Plasma บน QEMU virtual machine ผู้วิจัยพบว่าบางหน้าต่างไม่ได้เชื่อมกับไฟล์
.desktopที่เหมาะสม และจึงแสดงเป็น ไอคอน Wayland ทั่วไปบนแถบงาน - ปรากฏการณ์นี้ถูกรายงานไว้ที่ KWin trusts on Apps fully for app_id และนำไปสู่ปัญหาที่แอปสามารถปลอมตัวเป็นแอปอื่นได้
- หลังจากนั้นผู้วิจัยเผลอคลิกปุ่มกลางบนแถบงาน ทำให้ Open New Window ถูกเรียกตามพฤติกรรมค่าเริ่มต้น
- แม้หน้าต่างใหม่จะเปิดขึ้น แต่กลับไม่ใช้ข้อมูลล็อกอินที่บันทึกไว้หรือการตั้งค่าที่ปรับแต่งแล้ว และเมื่อเทียบ PID ใน KWin Debug Console กับข้อมูล control groups และ rootfs จาก procfs ก็พบการหลุดออกจากแซนด์บ็อกซ์
ช่องโหว่นี้ทำงานอย่างไร
- แม้ KWin จะไม่สามารถเชื่อมหน้าต่างกับไฟล์
.desktopจริงได้ ก็ยังคงมีเส้นทางสำหรับค้นหาargv0ที่จะใช้เรียกโปรแกรมอยู่ - ผลการทดลองยืนยันว่าข้อสันนิษฐานที่ว่าอ่านค่าผ่าน
/proc/PID/cmdlineนั้นถูกต้อง - ปัญหานี้ไม่ได้จำกัดอยู่แค่การรันอินสแตนซ์เดิมของแอปพลิเคชันจากนอกแซนด์บ็อกซ์
- ทุกโปรเซส รวมถึงโปรเซสที่ไม่มีสิทธิ์พิเศษ สามารถ เปลี่ยน
argv0ได้- แม้ mount namespace จะเป็นอีกทางเลือกหนึ่ง แต่ผู้เขียนสรุปว่ายืดหยุ่นน้อยกว่า
- เมื่อไม่มีการปกป้อง app_id ที่แอประบุมากับการอ่าน
/proc/PID/cmdlineที่ไม่ปลอดภัย จึงเปิดทางให้เกิดการรันโค้ดตามอำเภอใจบนโฮสต์ได้
เดโมและสถานการณ์โจมตีจริง
- โค้ดเดโมเขียนโดย GalaxySnail และใช้
eglgears-waylandของ Mesa - ขั้นตอนเดโมมีดังนี้
- โคลนรีโพซิทอรี
mesa-demos-argv0 - แก้ไขคำสั่งที่ระบุไว้ในฟังก์ชัน
mainของsrc/egl/opengl/eglgears.cให้เป็นคำสั่งที่ต้องการ - บิลด์ด้วย
meson setup build && meson compile -C build - รัน
./build/src/egl/opengl/eglgears_wayland - คลิกปุ่มกลางที่ไอคอนบนแถบงาน หรือเลือก Open New Window จากเมนูบริบท
- ไบนารีอันตรายที่กำหนดไว้จะเริ่มทำงาน
- โคลนรีโพซิทอรี
- ในการโจมตีจริง สามารถใช้วิธีสร้าง shell script ไว้ใต้
$HOME- โดยทั่วไป
$HOMEมักเป็นพาธเดียวกันบนโฮสต์ด้วย - แอปอันตรายสามารถสร้าง
argv0อย่างเงียบ ๆ หรือแทนที่ด้วยไบนารีที่ดาวน์โหลดมา - หากผู้ใช้คลิก Open New Window หรือเผลอคลิกปุ่มกลางบนไอคอนแอป ผู้โจมตีก็สามารถควบคุมเซสชันได้ทั้งหมด
- โดยทั่วไป
แนวทางแก้ไขที่เสนอ
- หาก KDE Plasma ต้องการป้องกัน exploit นี้ ก็ไม่ควรเชื่อถือ ID ที่แอประบุมาตรง ๆ
- มีข้อเสนอว่าควรดึง app ID จากเส้นทางต่อไปนี้
- security context ของแซนด์บ็อกซ์
XdpAppInfo- control groups
- หากหน้าต่างใดไม่สามารถจับคู่กับไฟล์
.desktopได้ ก็ไม่ควรอนุญาต Open New Window - ผู้รายงานระบุว่ายังไม่ได้รับอัปเดตจากอีเมล KDE Security
ไทม์ไลน์การเปิดเผย
- ในอีเมลฉบับแรกมีการระบุ arbitrary code execution เป็น RCE ผิดพลาด
- ทุกเหตุการณ์ใช้เวลา UTC+8 และรูปแบบ 24 ชั่วโมง
- 1 เมษายน 2026 23:51 ส่งอีเมลฉบับแรกไปที่
security@kde.org - 2 เมษายน 2026 00:15 David Edmundson ตอบกลับเพื่อยืนยันว่าได้รับรายงานแล้ว
- 2 เมษายน 2026 00:24 David Edmundson ตอบว่าเขาเข้าใจว่าฟีเจอร์นี้ใช้
Exec=ในไฟล์.desktopและจึงไม่น่าจะนำไปใช้รันโค้ดตามอำเภอใจได้ - 2 เมษายน 2026 11:59 ยืนยันได้ด้วยความช่วยเหลือจาก GalaxySnail ว่า PoC อีกรูปแบบหนึ่งที่ไม่พึ่งพาไฟล์
.desktopทำงานได้ - 2 เมษายน 2026 18:26 ส่งอีเมลติดตามผลพร้อมไฟล์ exploit และคำอธิบายไปยัง
security@kde.orgแต่ไม่ได้รับคำตอบ - 2 พฤษภาคม 2026 11:59 ยืนยันว่า exploit ยังไม่ได้รับการแพตช์ใน Plasma 6.7 Beta
- 2 กรกฎาคม 2026 18:30 เผยแพร่สู่สาธารณะหลัง exploit ยังใช้งานได้และพ้นช่วงรอ 90 วันแล้ว
- เนื่องจากยังไม่ถูกแพตช์ ไม่ได้รับการตอบกลับติดตาม และเลยช่วงรอ 90 วันตามธรรมเนียมแล้ว ผู้รายงานจึงตัดสินใจเปิดเผยเพื่อสร้างการรับรู้
- ผู้รายงานเสริมว่าไม่ได้มีเจตนาจะวิจารณ์นักพัฒนา KDE และเข้าใจว่าโครงการ OSS ช่วงหลังเผชิญสแปมมากขึ้น อีกทั้งมนุษย์ก็มีขีดจำกัดด้านกำลังการประมวลผลงาน แต่กระบวนการยังปรับปรุงได้
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
สำหรับการทำ sandbox ให้แอปเดสก์ท็อป มันเป็นโมเดลที่ดีกว่าบรรดาวิธีสารพัดแบบที่ Linux ตอนนี้พยายามต่อเติมขึ้นมาเพื่อทำสิ่งเดียวกันมาก โครงสร้างคือ launcher ส่งชุดสิทธิ์เริ่มต้นตาม metadata หรือก็คือ file descriptor ให้แอป และแอปก็เข้าถึงอย่างอื่นไม่ได้ ส่วน powerbox จะให้สิทธิ์เปิด·บันทึกไฟล์อื่น ๆ
โดยทั่วไปมันเหมาะกับสภาพแวดล้อมที่มีโปรเซสระดับเหมือนพระเจ้าคอย orchestrate บริการ เช่นบริการของ Kubernetes แต่ไม่ค่อยเหมาะกับเดสก์ท็อป อยากจะเข้าไปอยู่ใน cgroup/namespace ที่มีสิทธิ์ต่ำกว่าจาก userspace แต่ต้องผ่านพิธีกรรมอย่าง root daemon หรือ setuid สุดท้ายก็เชิญความเสี่ยงเรื่องการยกระดับสิทธิ์เข้ามา
SCM_RIGHTS+ Wayland + D-Bus เป็นองค์ประกอบพื้นฐานและทำงานแบบนี้ถ้าหรี่ตามองก็พอเห็นเค้าโครงของเดสก์ท็อปที่ปลอดภัยอยู่
แต่ implementation จริงโดยรวมแล้วเปิดกว้างเกินไปบ้าง ไม่ยืดหยุ่นบ้าง หรือพังไปครึ่ง ๆ กลาง ๆ ดูเหมือนไม่ค่อยมีใครใส่ใจความปลอดภัยเดสก์ท็อปแบบ end-to-end เท่ากับที่ใส่ใจการดูแลความปลอดภัยของ server workload เลย ดังนั้น gVisor กับ Firecracker จึงทำงานได้ดี แต่ Flatpak กลับรันแอป Gtk+ พื้นฐานสักตัวโดยไม่ทำให้ฟอนต์พังยังยาก และ Wayland compositor ทุกตัวก็ต้อง implement ครึ่งหนึ่งของฐานเดสก์ท็อปที่เชื่อถือได้ขึ้นมาใหม่
ยิ่งคิดว่า Android ทำหน้าที่เป็นดิสโทร Linux ที่ harden พอจะรันโค้ดที่ไม่น่าเชื่อถือได้ค่อนข้างดี และ iOS กับ macOS ก็แสดงให้เห็นว่า sandbox สำหรับแอปที่ผู้ใช้ใช้งานโดยตรงก็สามารถใช้งานได้สะดวกพอ ยิ่งน่าอาย แค่ทำตามที่พวกเขาทำก็พอแล้ว ทำไมบางอย่างใน window manager ถึงกำลังอ่าน
/proc/{pid}/cmdlineอยู่กันแน่นี่ไม่ได้เป็นการวิจารณ์นักวิจัยแต่อย่างใด
ถ้าคุ้นกับโครงสร้างภายในของ KDE หรือ Flatpak มากกว่านี้ คงเข้าใจได้ดีกว่านี้มาก