- Landlock ทำให้แอปพลิเคชันประกาศทรัพยากรที่สามารถเข้าถึงได้อย่างชัดเจน เพื่อให้สามารถทำ self-sandboxing ได้ที่ระดับเคอร์เนล
- เรียบง่ายกว่า SELinux และ AppArmor และสามารถสร้างและใช้นโยบายที่ runtime โดยไม่ต้องใช้สิทธิ์ผู้พัฒนา
- นโยบายกำหนดเป็น allowlist ชัดแจ้งสำหรับไฟล์·ไดเรกทอรี·พอร์ตที่สามารถเข้าถึงได้ และการจำกัดแบบลำดับชั้นช่วยเสริมความปลอดภัยได้แบบค่อยเป็นค่อยไป
- มี bindings สำหรับ Rust, Go, Haskell และสามารถใช้งานกับแอป GUI, เซิร์ฟเวอร์, โปรเซสเดสก์ท็อป ฯลฯ เพื่อทำการควบคุมการเข้าถึงแบบละเอียดได้
- ในระบบนิเวศความปลอดภัยของ Linux เป็นเครื่องมือ sandboxing โดยไม่ใช้สิทธิ์พิเศษที่เรียบง่ายและใช้งานได้จริง และกำลังเป็นองค์ประกอบสำคัญในการเสริมความปลอดภัยด้านเดสก์ท็อปในอนาคต
ภาพรวมของ Landlock
- Landlock คือ API ที่ทำให้แอปพลิเคชัน Linux ต้องประกาศทรัพยากรที่สามารถเข้าถึงได้
- คล้ายแนวคิด
unveil() และ pledge() ของ OpenBSD และใช้หลักการ “อนุญาตเฉพาะทรัพยากรที่จำเป็น”
- ให้เลเยอร์ป้องกันที่เป็นมิตรกับนักพัฒนา โดยเข้าใจและผสานง่ายกว่าเมคานิซึมความปลอดภัยของ Linux เดิม
- จุดมุ่งหมายคือการสนับสนุนการใช้ Landlock ไปพร้อมกับแนวทางประกาศทรัพยากรที่เข้าถึงได้อย่างชัดเจน
วิธีการทำงาน
- ใช้รูปแบบ Linux Security Module (LSM) และพร้อมใช้งานตั้งแต่ Linux 5.13
- ต่างจาก SELinux และ AppArmor ตรงที่เป็น การจำกัดชั่วคราวระดับกระบวนการ (transient restriction)
- นโยบายถูกสร้างใน runtime และใช้กับเธรดปัจจุบันและกระบวนการลูกเท่านั้น เมื่อกระบวนการจบลงจะหายไป
- องค์ประกอบของนโยบาย
- Handled accesses: ประเภทงานที่จำกัด (เช่น การอ่าน/เขียนในระบบไฟล์)
- Access grants: รายการวัตถุที่อนุญาตอย่างชัดเจน
- ตัวอย่างนโยบาย
- อ่านอย่างเดียวที่
/home/user
- อ่าน/เขียนที่
/tmp
- อนุญาตให้ bind พอร์ต
2222
- เมื่อเรียก
landlock_restrict_self() เธรดดังกล่าวและกระบวนการลูกจะเข้าสู่โหมดจำกัดถาวร
- ข้อจำกัดไม่สามารถยกเลิกได้ และซ้อนชั้นได้สูงสุด 16 ชั้น
- ชั้นล่างสามารถลดการเข้าถึงเพิ่มเติมได้ แต่สิทธิ์ที่เอาออกจากชั้นบนสุดจะไม่สามารถคืนกลับได้
- ทำงานแบบ ไม่ต้องมีสิทธิ์สูง (unprivileged) ดังนั้นแอปพลิเคชันทั่วไปก็สามารถ sandboxing ตัวเองได้
- ผ่านการจัดการเวอร์ชัน ABI ทำให้ทำงานได้เท่าที่เป็นไปได้บนเคอร์เนลรุ่นเก่า
- เป็น Stackable LSM จึงใช้ร่วมกับ SELinux หรือ AppArmor ได้
เหตุผลที่ควรใช้
- เหมาะกับแอปพลิเคชันที่มีรูปแบบการเข้าถึงไฟล์คาดเดาได้
- ตัวอย่าง: จำกัดเว็บเซิร์ฟเวอร์ให้เข้าถึงเพียง
/var/www/html และ /tmp
- ไม่ต้องพึ่งการแทรกแซงของผู้ดูแลระบบหรือการตั้งค่าระบบระดับทั้งเครื่อง และกำหนดนโยบายได้โดยตรงในโค้ด
- ใช้งานได้โดยไม่ต้องเพิ่มสิทธิ์และสามารถผสานเข้ากับโปรแกรมส่วนใหญ่ได้ง่าย
- มี bindings สำหรับ Rust, Go, Haskell และมีโปรเจกต์ wrapper แบบ
unveil หลายตัว
- ยังไม่มีไลบรารี C อย่างเป็นทางการ แต่สามารถใช้การใช้งานแบบไม่เป็นทางการหลายรายการได้
- ในโค้ดตัวอย่างของ Rust จะตั้งค่า
/usr, /etc, /dev ให้เข้าถึงแบบอ่านอย่างเดียว และ /home, /tmp ให้เข้าถึงแบบอ่าน/เขียนได้
สถานการณ์และความจำเป็นของการ sandboxing บน Linux
- การใช้งาน Linux เพิ่มขึ้นควบคู่ไปกับมัลแวร์เป้าหมายเดสก์ท็อปที่เพิ่มขึ้น
- ความปลอดภัยเชิงสัมพันธ์ของ Linux มาจาก ส่วนแบ่งตลาดและอุปสรรคเชิงเทคนิค มากกว่าความปลอดภัยเชิงโครงสร้าง
- ปัญหาของดิสโทรทั่วไป
- สามารถรันไบนารีที่ไม่เชื่อถือได้
- สามารถรันสคริปต์โดยตรงจากอินเทอร์เน็ต
- ใช้
sudo โดยไม่ต้องมีรหัสผ่าน
- แอปทั่วไปสามารถเข้าถึงไฟล์สำคัญใน
$HOME
- สามารถสอดแนมการกดแป้นในสภาพแวดล้อม X11
- สามารถ bind พอร์ตใดก็ได้
ข้อจำกัดของเครื่องมือความปลอดภัยเดิม
- Containerization (Docker, Podman): เหมาะกับการแยกบริการ แต่ไม่เหมาะกับแอปเดสก์ท็อป และมีกรณีที่ option
--privileged ทำให้การแยกตัวถูกหลีกเลี่ยงได้
- Flatpak / Snap: เหมาะกับแอป GUI แต่มีขอบเขตสิทธิ์กว้างเกินไป และไม่เหมาะกับเครื่องมือ CLI
- Firejail: ต้องมีโปรไฟล์เฉพาะแอป และต้องเรียกใช้อย่างชัดเจนทุกครั้งที่รัน
มุมมองนักพัฒนาจากกลไกเดิม
- seccomp: แม้ทรงพลังแต่การตั้งค่าค่อนข้างซับซ้อน และแนวทาง blacklist มีจุดอ่อน
- SELinux: แม้ทรงพลังแต่ซับซ้อน ต้องการนโยบายจากผู้ดูแลระบบ และดิสโทรหลายตัวปิดใช้งานเป็นค่าเริ่มต้น
- AppArmor: ง่ายกว่า SELinux แต่ยังคงต้องใช้โปรไฟล์จากผู้ดูแลระบบ และบางดิสโทรปิดใช้งาน
สรุปข้อดีของ Landlock
- ไม่ต้องมีสิทธิ์สูง, เน้นที่แอปพลิเคชัน, ผสานได้ง่าย, default deny
- ได้รับการสนับสนุนอย่างแพร่หลาย หลัง Linux 5.13 และคงความเข้ากันได้ทั้งเวอร์ชันเก่าและใหม่
- แม้ไม่สมบูรณ์แบบ แต่เป็นเครื่องมือ sandboxing แบบไม่ใช้สิทธิ์สูงที่เป็นอิสระและใช้งานได้จริง ช่วยเติมเต็มช่องว่าง
ความเป็นไปได้ในการนำ Landlock ไปใช้
- สำหรับกระบวนการเดมอนที่มีสิทธิ์สูงในโหมดทำงานยาวนาน สามารถจำกัดขอบเขตการเข้าถึงด้วย Landlock ได้
- โปรแกรมอ่าน PDF, โปรแกรมดูภาพ, เว็บเบราว์เซอร์, โปรแกรมประมวลผลคำ และอื่น ๆ สามารถจำกัดให้อ่านไฟล์ที่เปิดอยู่เท่านั้น
- FTP/HTTP server สามารถกำหนดให้เข้าถึงเฉพาะไฟล์ที่จำเป็น
- ตัวอย่าง: แม้ nginx จะรันด้วยสิทธิ์ root ผู้โจมตีที่ยึด shell ได้ก็ไม่สามารถเข้าถึงไฟล์นอกนโยบายได้
- หากมีการนำแนวคิด Supervisor เข้ามาใช้ ก็อาจทำให้ระบบสิทธิ์แบบ Android เกิดขึ้นบน Linux desktop
- เมื่อผสานกับระบบสิทธิ์และระบบจัดเก็บสิทธิ์แบบ GUI ก็สามารถสร้างประสบการณ์ผู้ใช้ที่ปลอดภัยมากขึ้นได้
ฟีเจอร์ที่กำลังพัฒนาใน Landlock
- Supervise Mode: ตัดสินใจอนุญาต/ปฏิเสธการเข้าถึงแบบโต้ตอบในพื้นที่ผู้ใช้ คล้ายพรอมต์ขออนุญาตแบบ Android
- Socket Restrictions: ควบคุมชนิดของซ็อกเก็ตและพอร์ตที่กระบวนการสามารถใช้ได้อย่างละเอียด
- LANDLOCK_RESTRICT_SELF_TSYNC: กระจายข้อจำกัดไปยังเธรดทั้งหมดภายในกระบวนการเดียวกัน
- LANDLOCK_ADD_RULE_QUIET: ระงับข้อความบันทึก audit สำหรับวัตถุบางรายการ
- LANDLOCK_ADD_RULE_NO_INHERIT: ป้องกันไม่ให้สิทธิ์จากไดเรกทอรีระดับบนสืบทอดลงไดเรกทอรีย่อย ช่วยควบคุมระบบไฟล์ได้ละเอียดขึ้น
สรุป
- Landlock คือกลไก sandboxing แบบ default deny ที่เรียบง่ายและอาศัยการทำงานแบบไม่ใช้สิทธิ์สูง
- เข้าใจและผสานใช้งานได้ง่าย และมีศักยภาพสูงในการยกระดับความปลอดภัยของ Linux desktop และแอปพลิเคชัน
- นักพัฒนาสามารถนำ Landlock ไปใช้กับแอปพลิเคชันของตนเองได้โดยตรงเพื่อ เพิ่มระดับความปลอดภัย
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
เขียนโปรแกรมง่าย ๆ ด้วย C ให้รับฟังเพียงพอร์ตเดียว และบล็อกการเชื่อมต่อเครือข่ายอื่นทั้งหมด
อ้างอิงจาก
sandboxer.cตัวอย่าง และควบคุมเฉพาะเครือข่ายโดยไม่แตะข้อจำกัดการเข้าถึงไฟล์ใน
dmesgจะเห็นการเชื่อมต่อที่ถูกบล็อก ซึ่งน่าจะเป็นเพราะ ความสามารถด้าน auditเครื่องมือนี้ทำงานในโหมด ผู้ใช้ที่ไม่มีสิทธิพิเศษ และทำงานได้ดีแม้อยู่ในคอนเทนเนอร์โดยไม่ต้องตั้งค่าไฟร์วอลล์
แต่ฉันคิดว่ามันไม่เหมาะสำหรับใช้ป้องกันโปรแกรมที่เป็นอันตรายแบบสมบูรณ์
จาก issue #28 และเมลเธรดที่เกี่ยวข้อง มีปัญหาว่ากฎ sandbox ไม่สามารถอ้างอิง ไดเรกทอรีที่ยังไม่มีอยู่ ได้
ตัวอย่างเช่น ถ้าเพิ่มกฎตอนที่
~/.sshยังไม่มีอยู่ ต่อให้สร้างไดเรกทอรีนั้นภายหลังก็จะไม่ถูกบล็อกการเข้าถึงกล่าวคืออาจเกิดช่องโหว่ด้านความปลอดภัยได้
การรันด้วยสิทธิ์น้อยที่สุดค่อนข้างยุ่งยาก
“Microlandia” รันไม่ได้ แต่เกม Unity อื่น ๆ ใช้งานได้ดี
หวังว่าจะมีเครื่องมือที่อิง Landlock มากขึ้นเพื่อให้งานแบบนี้ง่ายขึ้น
ดูเหมือนว่า CRI ต่าง ๆ พยายามนิยามอินเทอร์เฟซของตัวเอง แต่ก็คงตามหลังการรองรับในเคอร์เนลเสมอ
ไม่น่ามีผู้ดูแลโครงสร้างพื้นฐานจำนวนมากที่จะคอยดูแลนโยบาย sandbox แยกตามแอป
ฉันคิดว่าการให้แอปพลิเคชันใช้ Landlock เองน่าจะเป็นทางเลือกที่เป็นจริงมากกว่า
ถ้ารันไทม์แค่ปล่อย system call ผ่านไป ก็จะเกิดปัญหาที่ต้อง เชื่อใจ ให้แอปล็อกตัวเอง
ภายในเราก็ใช้ API คล้ายกันเพื่อ จัดการโปรเซสสำคัญ
งานวิจัยแบบนี้จะช่วยอุตสาหกรรมที่มีข้อกำกับดูแลอย่างมาก
ถ้าเป็นความสามารถของเคอร์เนล ก็น่าจะมี C API ก่อนอยู่แล้ว เลยสงสัยว่าทำไมถึงไม่มี
libc เป็นเพียงชั้นที่วางอยู่ด้านบน และยังมี syscall จำนวนมากที่ไม่มี wrapper ใน libc มาจนถึงตอนนี้
จะสร้าง header เองแล้วเรียกผ่านแมโคร
_syscallNโดยตรงก็ได้ใช้ wrapper ง่าย ๆ อย่าง landbox ได้
และ Rust หรือ Go ก็เปิด C FFI ได้เช่นกัน
แค่อ้างอิง ตัวอย่าง sandboxer.c ของเคอร์เนล ก็เพียงพอแล้ว
แม้จะต่างจาก Landlock แต่ก็ใช้เสริมกันได้
/sysน่าจะเป็นเพราะ หลักการไม่ใช้สิทธิพิเศษ
แล้วก็สงสัยว่าสามารถบล็อก Landlock syscall ด้วย seccomp ได้ไหม
ถ้านโยบาย seccomp เก่าไม่มีหมายเลข Landlock อยู่ อาจทำให้เกิด SIGSYS ได้หรือเปล่า?
API แบบระบบไฟล์มี footgun เยอะ และการควบคุมการเข้าถึงแบบอิง dirfd ก็เหมาะกับ syscall มากกว่า
seccomp filter ที่เขียนมาดีจะคืนค่า -ENOSYS ทำให้ดูเหมือนแค่ว่า “ไม่รองรับ”
เพราะ Landlock มีไว้เพื่อลดสิทธิ์ที่มีอยู่เท่านั้น ไม่ได้มอบสิทธิ์ใหม่
กำลังเตรียมย้ายออกจาก Mac มาลินุกซ์เต็มตัว และอยากรู้ว่า Landlock จะช่วยเรื่อง การป้องกันมัลแวร์ ได้มากแค่ไหน
เช่น อยากสร้างสภาพแวดล้อมที่ปฏิเสธการเข้าถึง
~/.sshโดยอัตโนมัติและอยากรู้ด้วยว่าสามารถใช้ทำ แอป launcher ได้หรือไม่
ใช้สำหรับให้แอปจำกัดสิทธิ์ที่ไม่จำเป็นของตัวเอง เพื่อไม่ให้ผู้โจมตียึดระบบได้
~/.sshต้องใช้โมเดล MAC อย่าง AppArmor หรือ SELinuxLandlock มีประโยชน์เมื่อแอปจำกัดตัวเองหรือโปรเซสลูกของตัวเอง
เช่น npm จำกัด post-install script ให้เข้าถึงได้แค่ไดเรกทอรี build
เป็น API ที่นักพัฒนาแอปใช้งานโดยตรง คล้าย pledge ของ OpenBSD
แต่ Linux มีระบบนิเวศที่กระจัดกระจายจึงน่าจะปรับใช้ช้า
ระหว่างนี้การใช้ในรูปแบบ wrapper หรือ launcher น่าจะเป็นทางเลือกที่เป็นจริงมากกว่า
สุดท้ายแล้วมันจะได้ผลก็ต่อเมื่อ โปรแกรมรู้สิทธิ์ของตัวเอง
แอประบุรายการทรัพยากรที่ต้องใช้แบบ whitelist ตั้งแต่ต้นการรัน แล้วบล็อกที่เหลือทั้งหมด
ไม่ได้มีไว้ป้องกันโปรแกรมอันตราย แต่เป็น การปกป้องโปรเซสของตัวเอง
ใน standard library ก็มี syscall อยู่แล้ว จะต้องมีไลบรารีแยกอีกทำไม?
เอกสาร man7 ก็มีอยู่แล้ว
เลยสงสัยว่าหมายถึงแค่อยากได้ ชั้น abstraction หรือไม่
ดังนั้นที่ glibc ยังไม่ให้ Landlock interface มาก็น่าแปลกใจอยู่
น่าจะเป็นเพราะปัญหาเรื่อง ความเข้ากันได้กับระบบที่ไม่ใช่ลินุกซ์