TL; DR. ในบทความนี้ เราจะมาสำรวจแผนการเสริมความแข็งแกร่งที่ทำงานนอกกรอบบน Linux ห้ารุ่นยอดนิยม เราใช้การกำหนดค่าเคอร์เนลเริ่มต้น โหลดแพ็คเกจทั้งหมด และวิเคราะห์รูปแบบการรักษาความปลอดภัยในไบนารีที่แนบมา การแจกแจงที่พิจารณาคือ OpenSUSE 12.4, Debian 9, CentOS, RHEL 6.10 และ 7 รวมถึง Ubuntu 14.04, 12.04 และ 18.04 LTS
ผลลัพธ์ยืนยันว่าแม้แต่รูปแบบพื้นฐาน เช่น การซ้อนนกคีรีบูนและรหัสที่ไม่ขึ้นกับตำแหน่งก็ยังไม่มีใครนำมาใช้ สถานการณ์เลวร้ายยิ่งขึ้นสำหรับคอมไพเลอร์เมื่อต้องป้องกันช่องโหว่เช่น stack clash ซึ่งกลายเป็นที่สนใจในเดือนมกราคมหลังจากการเผยแพร่
การตรวจสอบแสดงให้เห็นว่ามีการใช้วิธีการป้องกันจำนวนมากที่สุดใน Ubuntu 18.04 ที่ระบบปฏิบัติการและระดับแอปพลิเคชัน ตามมาด้วย Debian 9 ในทางกลับกัน OpenSUSE 12.4, CentOS 7 และ RHEL 7 ยังใช้แผนการป้องกันพื้นฐาน และการป้องกันการชนกันของสแต็ก ถูกใช้อย่างกว้างขวางยิ่งขึ้นด้วยชุดแพ็คเกจเริ่มต้นที่หนาแน่นกว่ามาก
การแนะนำ
เป็นการยากที่จะรับรองซอฟต์แวร์คุณภาพสูง แม้จะมีเครื่องมือขั้นสูงมากมายสำหรับการวิเคราะห์โค้ดแบบสแตติกและการวิเคราะห์รันไทม์แบบไดนามิก รวมถึงความก้าวหน้าที่สำคัญในการพัฒนาคอมไพเลอร์และภาษาการเขียนโปรแกรม แต่ซอฟต์แวร์สมัยใหม่ยังคงประสบปัญหาจากช่องโหว่ที่ผู้โจมตีมักถูกโจมตีอย่างต่อเนื่อง สถานการณ์เลวร้ายยิ่งขึ้นในระบบนิเวศที่มีรหัสเดิม ในกรณีเช่นนี้ เราไม่เพียงแต่ต้องเผชิญกับปัญหาชั่วนิรันดร์ในการค้นหาข้อผิดพลาดที่สามารถใช้ประโยชน์ได้เท่านั้น แต่เรายังถูกจำกัดด้วยเฟรมเวิร์กความเข้ากันได้แบบย้อนหลังที่เข้มงวด ซึ่งมักจะกำหนดให้เราต้องรักษาโค้ดที่มีข้อจำกัด หรือแย่กว่านั้น มีช่องโหว่หรือมีข้อผิดพลาด
นี่คือที่มาของวิธีการปกป้องหรือทำให้โปรแกรมแข็งแกร่งขึ้น เราไม่สามารถป้องกันข้อผิดพลาดบางประเภทได้ แต่เราสามารถทำให้ชีวิตของผู้โจมตียากขึ้นและแก้ไขปัญหาได้บางส่วนด้วยการป้องกันหรือป้องกัน การเอารัดเอาเปรียบ ข้อผิดพลาดเหล่านี้ การป้องกันดังกล่าวใช้ในระบบปฏิบัติการสมัยใหม่ทั้งหมด แต่วิธีการแตกต่างกันอย่างมากในด้านความซับซ้อน ประสิทธิภาพ และประสิทธิภาพ: จากนกคีรีบูนแบบสแต็กและ
CVE และความปลอดภัย
เราเคยเห็นบทความที่มีชื่อว่า "แอปพลิเคชันที่มีช่องโหว่มากที่สุดแห่งปี" หรือ "ระบบปฏิบัติการที่มีช่องโหว่มากที่สุด" โดยปกติแล้วพวกเขาจะจัดทำสถิติเกี่ยวกับจำนวนบันทึกทั้งหมดเกี่ยวกับช่องโหว่เช่น
ตามตัวอย่าง ให้พิจารณาจำนวน CVE ทั้งหมดในช่วงสี่ปีที่ผ่านมาสำหรับเคอร์เนล Linux และเซิร์ฟเวอร์ที่ได้รับความนิยมสูงสุดห้ารายการ ได้แก่ Ubuntu, Debian, Red Hat Enterprise Linux และ OpenSUSE
มะเดื่อ 1
กราฟนี้บอกอะไรเรา? จำนวน CVE ที่สูงกว่าหมายความว่าการแจกจ่ายแบบหนึ่งมีความเสี่ยงมากกว่าอีกแบบหนึ่งหรือไม่? ไม่มีคำตอบ. ตัวอย่างเช่น ในบทความนี้ คุณจะเห็นว่า Debian มีกลไกความปลอดภัยที่แข็งแกร่งกว่าเมื่อเทียบกับ OpenSUSE หรือ RedHat Linux แต่ Debian มี CVE มากกว่า อย่างไรก็ตาม ไม่ได้หมายความว่าการรักษาความปลอดภัยจะอ่อนแอลงเสมอไป แม้แต่การมี CVE ก็ไม่ได้บ่งชี้ว่ามีช่องโหว่หรือไม่ ถูกเอารัดเอาเปรียบ. คะแนนความรุนแรงเป็นตัวบ่งชี้ว่าทำอย่างไร อาจ การแสวงหาผลประโยชน์จากช่องโหว่ แต่ท้ายที่สุดแล้ว ความสามารถในการแสวงหาผลประโยชน์นั้นขึ้นอยู่กับการป้องกันที่มีอยู่ในระบบที่ได้รับผลกระทบ ตลอดจนทรัพยากรและความสามารถของผู้โจมตี ยิ่งไปกว่านั้น การไม่มีรายงานของ CVE ไม่ได้บ่งบอกอะไรเกี่ยวกับรายงานอื่นๆ เลย ไม่ได้ลงทะเบียนหรือไม่ทราบ ช่องโหว่ ความแตกต่างใน CVE อาจเนื่องมาจากปัจจัยอื่นนอกเหนือจากคุณภาพของซอฟต์แวร์ รวมถึงทรัพยากรที่จัดสรรให้กับการทดสอบหรือขนาดของฐานผู้ใช้ ในตัวอย่างของเรา จำนวน CVE ที่สูงกว่าของ Debian อาจบ่งชี้ว่า Debian จัดส่งแพ็คเกจซอฟต์แวร์มากขึ้น
แน่นอนว่าระบบ CVE ให้ข้อมูลที่เป็นประโยชน์ซึ่งช่วยให้คุณสามารถสร้างการป้องกันที่เหมาะสมได้ ยิ่งเราเข้าใจสาเหตุของความล้มเหลวของโปรแกรมได้ดีเพียงใด การระบุวิธีการใช้ประโยชน์และพัฒนากลไกที่เหมาะสมก็จะยิ่งง่ายขึ้นเท่านั้น การตรวจจับและการตอบสนอง. ในรูป 2 แสดงหมวดหมู่ของช่องโหว่สำหรับการแจกแจงทั้งหมดในช่วงสี่ปีที่ผ่านมา (
มะเดื่อ 2
งาน
ในบทความนี้เราตั้งใจที่จะตอบคำถามต่อไปนี้:
- ความปลอดภัยของลีนุกซ์รุ่นต่างๆ คืออะไร? กลไกการป้องกันที่มีอยู่ในเคอร์เนลและแอปพลิเคชันพื้นที่ผู้ใช้มีอะไรบ้าง
- การนำกลไกการรักษาความปลอดภัยไปใช้มีการเปลี่ยนแปลงอย่างไรเมื่อเวลาผ่านไปในการกระจาย?
- การพึ่งพาโดยเฉลี่ยของแพ็คเกจและไลบรารีสำหรับการแจกจ่ายแต่ละครั้งคือเท่าใด
- มีการป้องกันอะไรบ้างสำหรับแต่ละไบนารี?
การเลือกการกระจาย
ปรากฎว่าเป็นการยากที่จะค้นหาสถิติที่แม่นยำเกี่ยวกับการติดตั้งการแจกจ่ายเนื่องจากในกรณีส่วนใหญ่จำนวนการดาวน์โหลดไม่ได้ระบุจำนวนการติดตั้งจริง อย่างไรก็ตาม ตัวแปร Unix ประกอบขึ้นเป็นระบบเซิร์ฟเวอร์ส่วนใหญ่ (บนเว็บเซิร์ฟเวอร์ 69,2% โดย
การจำหน่าย/เวอร์ชัน
แกนกลาง
สร้าง
OpenSUSE 12.4
4.12.14-95.3-ค่าเริ่มต้น
#1 SMP วันพุธที่ 5 ธันวาคม 06:00:48 UTC 2018 (63a8d29)
เดเบียน 9 (ยืด)
4.9.0-8-amd64
#1 SMP เดเบียน 4.9.130-2 (2018-10-27)
6.10 CentOS
2.6.32-754.10.1.el6.x86_64
#1 SMP วันอังคารที่ 15 ม.ค. 17:07:28 UTC 2019
7 CentOS
3.10.0-957.5.1.el7.x86_64
#1 SMP วันศุกร์ที่ 1 กุมภาพันธ์ เวลา 14:54:57 UTC 2019
Red Hat Enterprise Linux Server 6.10 (ซันติอาโก)
2.6.32-754.9.1.el6.x86_64
#1 SMP วันพุธที่ 21 พ.ย. 15:08:21 น. EST 2018
Red Hat Enterprise Linux Server 7.6 (ไมโป)
3.10.0-957.1.3.el7.x86_64
#1 SMP พฤ. 15 พ.ย. 17:36:42 UTC 2018
Ubuntu 14.04 (Trusty Tahr)
4.4.0–140-ทั่วไป
#166~14.04.1-Ubuntu SMP วันเสาร์ที่ 17 พฤศจิกายน 01:52:43 UTC 20…
อูบุนตู 16.04 (Xenial Xerus)
4.15.0–1026-gcp
#27~16.04.1-Ubuntu SMP วันศุกร์ที่ 7 ธันวาคม 09:59:47 UTC 2018
Ubuntu 18.04 (ไบโอนิคบีเวอร์)
4.15.0–1026-gcp
#27-Ubuntu SMP พฤหัสบดีที่ 6 ธันวาคม 18:27:01 UTC 2018
1 ตาราง
การวิเคราะห์
มาศึกษาการกำหนดค่าเคอร์เนลเริ่มต้นตลอดจนคุณสมบัติของแพ็คเกจที่มีให้ผ่านตัวจัดการแพ็คเกจของการแจกจ่ายแต่ละครั้งแบบแกะกล่อง ดังนั้นเราจึงพิจารณาเฉพาะแพ็คเกจจากมิเรอร์เริ่มต้นของการแจกจ่ายแต่ละครั้ง โดยไม่สนใจแพ็คเกจจากที่เก็บข้อมูลที่ไม่เสถียร (เช่น มิเรอร์ 'การทดสอบ' ของ Debian) และแพ็คเกจของบุคคลที่สาม (เช่น แพ็คเกจ Nvidia จากมิเรอร์มาตรฐาน) นอกจากนี้ เราไม่พิจารณาการคอมไพล์เคอร์เนลแบบกำหนดเองหรือการกำหนดค่าที่เสริมความปลอดภัย
การวิเคราะห์การกำหนดค่าเคอร์เนล
เราใช้สคริปต์การวิเคราะห์ตาม
โดยทั่วไปแล้ว เมล็ดพืชใหม่จะมีการตั้งค่าที่เข้มงวดมากขึ้นตั้งแต่แกะกล่อง ตัวอย่างเช่น CentOS 6.10 และ RHEL 6.10 บนเคอร์เนล 2.6.32 ขาดคุณสมบัติที่สำคัญส่วนใหญ่ที่ใช้ในเคอร์เนลรุ่นใหม่ เช่น
อีกประเด็นที่ควรพิจารณาเมื่อตีความผลลัพธ์: การกำหนดค่าเคอร์เนลบางอย่างที่เพิ่มพื้นผิวการโจมตีสามารถใช้เพื่อรักษาความปลอดภัยได้เช่นกัน ตัวอย่างดังกล่าว ได้แก่ uprobes และ kprobes โมดูลเคอร์เนล และ BPF/eBPF คำแนะนำของเราคือการใช้กลไกข้างต้นเพื่อให้การป้องกันที่แท้จริง เนื่องจากกลไกเหล่านี้ใช้งานได้อย่างง่ายดาย และการแสวงหาประโยชน์จากกลไกเหล่านี้ถือว่าผู้ไม่ประสงค์ดีได้ตั้งหลักในระบบแล้ว แต่หากเปิดใช้งานตัวเลือกเหล่านี้ ผู้ดูแลระบบจะต้องตรวจสอบการละเมิดอย่างจริงจัง
เมื่อดูเพิ่มเติมที่รายการในตารางที่ 2 เราพบว่าเคอร์เนลสมัยใหม่มีตัวเลือกมากมายสำหรับการป้องกันการหาประโยชน์จากช่องโหว่ เช่น ข้อมูลรั่วไหล และสแต็ก/ฮีปล้น อย่างไรก็ตาม เราสังเกตเห็นว่าแม้แต่การกระจายที่ได้รับความนิยมล่าสุดก็ยังไม่ได้ใช้การป้องกันที่ซับซ้อนกว่านี้ (เช่น ด้วยแพตช์
การวิเคราะห์แอปพลิเคชัน
ไม่น่าแปลกใจเลยที่การแจกแจงที่แตกต่างกันจะมีลักษณะแพ็คเกจ ตัวเลือกการคอมไพล์ การพึ่งพาไลบรารี ฯลฯ ที่แตกต่างกัน มีความแตกต่างอยู่แม้กระทั่งสำหรับ
การกระจาย
โดยรวมแล้ว เราดาวน์โหลดแพ็คเกจ 361 แพ็คเกจสำหรับการแจกจ่ายทั้งหมด โดยแยกเฉพาะแพ็คเกจจากมิเรอร์เริ่มต้นเท่านั้น เราละเว้นแพ็คเกจที่ไม่มีโปรแกรมปฏิบัติการของ ELF เช่น แหล่งที่มา แบบอักษร ฯลฯ หลังจากการกรอง เหลือแพ็คเกจ 556 แพ็คเกจ ซึ่งมีไบนารีทั้งหมด 129 รายการ การกระจายแพ็คเกจและไฟล์ระหว่างการแจกแจงจะแสดงในรูป 569.
มะเดื่อ 3
คุณอาจสังเกตเห็นว่ายิ่งการกระจายมีความทันสมัยมากขึ้นเท่าใด แพ็คเกจและไบนารีก็ยิ่งมีมากขึ้นเท่านั้น ซึ่งก็สมเหตุสมผล อย่างไรก็ตาม แพ็คเกจ Ubuntu และ Debian มีไบนารีจำนวนมาก (ทั้งไฟล์ปฏิบัติการและโมดูลไดนามิกและไลบรารี) มากกว่า CentOS, SUSE และ RHEL ซึ่งอาจส่งผลกระทบต่อพื้นผิวการโจมตีของ Ubuntu และ Debian (ควรสังเกตว่าตัวเลขสะท้อนถึงไบนารีทั้งหมดของทุกเวอร์ชัน package นั่นคือไฟล์บางไฟล์จะถูกวิเคราะห์หลายครั้ง) นี่เป็นสิ่งสำคัญอย่างยิ่งเมื่อคุณพิจารณาถึงการขึ้นต่อกันระหว่างแพ็คเกจ ดังนั้น ช่องโหว่ในไบนารี่แพ็คเกจเดียวอาจส่งผลกระทบต่อหลายส่วนของระบบนิเวศ เช่นเดียวกับไลบรารีที่มีช่องโหว่สามารถส่งผลกระทบต่อไบนารีทั้งหมดที่นำเข้ามัน สำหรับจุดเริ่มต้น มาดูการกระจายจำนวนการขึ้นต่อกันระหว่างแพ็คเกจในระบบปฏิบัติการที่แตกต่างกัน:
ในการแจกแจงเกือบทั้งหมด 60% ของแพ็คเกจมีการขึ้นต่อกันอย่างน้อย 10 รายการ นอกจากนี้ บางแพ็คเกจยังมีจำนวนการขึ้นต่อกันที่มากกว่าอย่างเห็นได้ชัด (มากกว่า 100) เช่นเดียวกับการขึ้นต่อกันของแพ็คเกจแบบย้อนกลับ: ตามที่คาดไว้ แพ็คเกจบางส่วนจะถูกใช้โดยแพ็คเกจอื่น ๆ จำนวนมากในการแจกจ่าย ดังนั้นช่องโหว่ในแพ็คเกจบางตัวที่เลือกจึงมีความเสี่ยงสูง ตามตัวอย่าง ตารางต่อไปนี้แสดงรายการแพ็คเกจ 20 รายการที่มีจำนวนการขึ้นต่อกันแบบย้อนกลับสูงสุดใน SLES, Centos 7, Debian 9 และ Ubuntu 18.04 (แต่ละเซลล์ระบุแพ็คเกจและจำนวนการขึ้นต่อกันแบบย้อนกลับ)
3 ตาราง
ความจริงที่น่าสนใจ. แม้ว่าระบบปฏิบัติการทั้งหมดที่วิเคราะห์จะถูกสร้างขึ้นสำหรับสถาปัตยกรรม x86_64 และแพ็คเกจส่วนใหญ่มีสถาปัตยกรรมที่กำหนดเป็น x86_64 และ x86 แต่แพ็คเกจมักจะมีไบนารีสำหรับสถาปัตยกรรมอื่นๆ ดังแสดงในรูปที่ 5 XNUMX.
มะเดื่อ 5
ในส่วนถัดไป เราจะเจาะลึกถึงลักษณะของไบนารีที่วิเคราะห์
สถิติการป้องกันไฟล์ไบนารี
อย่างน้อยที่สุด คุณจะต้องสำรวจชุดตัวเลือกความปลอดภัยขั้นพื้นฐานสำหรับไบนารีที่มีอยู่ของคุณ Linux หลายรุ่นมาพร้อมกับสคริปต์ที่ทำการตรวจสอบดังกล่าว ตัวอย่างเช่น Debian/Ubuntu มีสคริปต์ดังกล่าว นี่คือตัวอย่างผลงานของเขา:
$ hardening-check $(which docker)
/usr/bin/docker:
Position Independent Executable: yes
Stack protected: yes
Fortify Source functions: no, only unprotected functions found!
Read-only relocations: yes
Immediate binding: yes
สคริปต์ตรวจสอบห้า
- Position Independent Executable (PIE): ระบุว่าส่วนข้อความของโปรแกรมสามารถย้ายไปยังหน่วยความจำเพื่อให้เกิดการสุ่มได้หรือไม่ หากเปิดใช้งาน ASLR ในเคอร์เนล
- Stack Protected: เปิดใช้งาน Stack Canaries เพื่อป้องกันการโจมตีจากการชนกันของ Stack หรือไม่
- Fortify Source: ฟังก์ชันที่ไม่ปลอดภัย (เช่น strcpy) จะถูกแทนที่ด้วยฟังก์ชันที่มีความปลอดภัยมากกว่าหรือไม่ และการเรียกที่ตรวจสอบขณะรันไทม์จะถูกแทนที่ด้วยฟังก์ชันที่ยังไม่ได้ตรวจสอบ (เช่น memcpy แทนที่จะเป็น __memcpy_chk)
- การย้ายตำแหน่งแบบอ่านอย่างเดียว (RELRO): ไม่ว่ารายการตารางการย้ายตำแหน่งจะถูกทำเครื่องหมายเป็นแบบอ่านอย่างเดียวหรือไม่ หากรายการเหล่านั้นถูกทริกเกอร์ก่อนที่การดำเนินการจะเริ่มขึ้น
- การเชื่อมโยงทันที: ไม่ว่ารันไทม์ลิงเกอร์จะอนุญาตการเคลื่อนไหวทั้งหมดก่อนที่โปรแกรมจะเริ่มต้นหรือไม่ (ซึ่งเทียบเท่ากับ RELRO แบบเต็ม)
กลไกข้างต้นเพียงพอหรือไม่? น่าเสียดายที่ไม่มี มีหลายวิธีที่ทราบกันดีว่าสามารถเลี่ยงการป้องกันข้างต้นทั้งหมดได้ แต่ยิ่งการป้องกันมีความแข็งแกร่งเท่าใด ผู้โจมตีก็จะยิ่งมีเกณฑ์สูงตามไปด้วย ตัวอย่างเช่น,
เราต้องการศึกษาว่าไฟล์ไบนารีจำนวนเท่าใดในการแจกแจงที่เป็นปัญหาได้รับการปกป้องโดยวิธีเหล่านี้และวิธีอื่นอีกสามวิธี:
- บิตที่ไม่สามารถใช้งานได้ (
NX ) ป้องกันการดำเนินการในภูมิภาคใดๆ ที่ไม่ควรเรียกใช้งาน เช่น สแต็กฮีป เป็นต้น ราพาธ/รันพาธ หมายถึงเส้นทางการดำเนินการที่ใช้โดยตัวโหลดแบบไดนามิกเพื่อค้นหาไลบรารีที่ตรงกัน อันแรกก็คือ ภาคบังคับ สำหรับระบบสมัยใหม่: การไม่มีระบบทำให้ผู้โจมตีสามารถเขียนเพย์โหลดลงในหน่วยความจำโดยพลการและดำเนินการตามที่เป็นอยู่ ประการที่สอง การกำหนดค่าพาธการดำเนินการที่ไม่ถูกต้องจะช่วยในการแนะนำโค้ดที่ไม่น่าเชื่อถือ ซึ่งอาจนำไปสู่ปัญหาหลายประการ (เช่นการเพิ่มสิทธิพิเศษ และปัญหาอื่นๆ ).- การป้องกันการชนกันของสแต็กให้การป้องกันการโจมตีที่ทำให้สแต็กซ้อนทับพื้นที่หน่วยความจำอื่นๆ (เช่น ฮีป) เมื่อพิจารณาถึงการละเมิดการหาประโยชน์ล่าสุด
ช่องโหว่การชนกันของฮีป systemd เรารู้สึกว่าเป็นการเหมาะสมที่จะรวมกลไกนี้ไว้ในชุดข้อมูลของเรา
เอาล่ะ เพื่อเป็นการไม่ให้เสียเวลา มาดูตัวเลขกันดีกว่า ตารางที่ 4 และ 5 ประกอบด้วยบทสรุปการวิเคราะห์ไฟล์ปฏิบัติการและไลบรารีของการแจกแจงต่างๆ ตามลำดับ
- อย่างที่คุณเห็น การป้องกัน NX นั้นมีการใช้งานทุกที่ โดยมีข้อยกเว้นที่หายาก โดยเฉพาะอย่างยิ่ง เราสามารถสังเกตการใช้งานที่ลดลงเล็กน้อยใน Ubuntu และ Debian เมื่อเทียบกับ CentOS, RHEL และ OpenSUSE
- นกคีรีบูนกองขาดหายไปในหลายแห่ง โดยเฉพาะอย่างยิ่งการกระจายพันธุ์ที่มีเมล็ดเก่า ความคืบหน้าบางอย่างปรากฏให้เห็นในการกระจายล่าสุดของ Centos, RHEL, Debian และ Ubuntu
- ยกเว้น Debian และ Ubuntu 18.04 การแจกแจงส่วนใหญ่มีการรองรับ PIE ที่ไม่ดี
- การป้องกันการชนกันของสแต็กนั้นอ่อนแอใน OpenSUSE, Centos 7 และ RHEL 7 และแทบไม่มีในผู้อื่น
- การแจกแจงทั้งหมดที่มีเคอร์เนลสมัยใหม่รองรับ RELRO บ้าง โดยที่ Ubuntu 18.04 เป็นผู้นำและ Debian มาเป็นอันดับสอง
ดังที่ได้กล่าวไปแล้ว หน่วยเมตริกในตารางนี้เป็นค่าเฉลี่ยสำหรับไฟล์ไบนารีทุกเวอร์ชัน หากคุณดูเฉพาะไฟล์เวอร์ชันล่าสุด ตัวเลขจะแตกต่างออกไป (เช่น ดูที่
ตารางที่ 4. คุณลักษณะด้านความปลอดภัยสำหรับไฟล์ปฏิบัติการที่แสดงในรูปที่ 3 XNUMX (การใช้งานฟังก์ชันที่เกี่ยวข้องเป็นเปอร์เซ็นต์ของจำนวนไฟล์ปฏิบัติการทั้งหมด)
ตารางที่ 5. คุณลักษณะด้านความปลอดภัยสำหรับไลบรารีที่แสดงในรูปที่ 3 XNUMX (การใช้งานฟังก์ชันที่เกี่ยวข้องเป็นเปอร์เซ็นต์ของจำนวนห้องสมุดทั้งหมด)
แล้วมีความคืบหน้ามั้ย? มีแน่นอน: สิ่งนี้สามารถเห็นได้จากสถิติของการแจกแจงรายบุคคล (เช่น
น่าเสียดายที่ไฟล์ปฏิบัติการจำนวนหนึ่งในการแจกจ่ายที่แตกต่างกันยังไม่มีการป้องกันใดๆ ข้างต้น ตัวอย่างเช่น เมื่อดูที่ Ubuntu 18.04 คุณจะสังเกตเห็นไบนารี ngetty (การแทนที่แบบ getty) เช่นเดียวกับ mksh และ lksh เชลล์ ตัวแปล picolisp แพ็คเกจ nvidia-cuda-toolkit (แพ็คเกจยอดนิยมสำหรับแอปพลิเคชันที่เร่งด้วย GPU เช่น กรอบงานการเรียนรู้ของเครื่อง) และ klibc -utils ในทำนองเดียวกัน ไบนารี mandos-client (เครื่องมือการดูแลระบบที่อนุญาตให้คุณรีบูตเครื่องโดยอัตโนมัติด้วยระบบไฟล์ที่เข้ารหัส) เช่นเดียวกับ rsh-redone-client (การนำ rsh และ rlogin ไปใช้ใหม่) จัดส่งโดยไม่มีการป้องกัน NX แม้ว่าพวกเขาจะมีสิทธิ์ SUID : (นอกจากนี้ ไบนารี suid จำนวนมากยังขาดการป้องกันขั้นพื้นฐาน เช่น นกคีรีบูนแบบสแต็ก (เช่น ไบนารี Xorg.wrap จากแพ็คเกจ Xorg)
สรุปและข้อสังเกตสรุป
ในบทความนี้ เราได้เน้นย้ำถึงคุณลักษณะด้านความปลอดภัยหลายประการของลีนุกซ์รุ่นใหม่ การวิเคราะห์แสดงให้เห็นว่าการกระจาย Ubuntu LTS ล่าสุด (18.04) ใช้งานโดยเฉลี่ยแล้ว ระบบปฏิบัติการและการป้องกันระดับแอปพลิเคชันที่แข็งแกร่งที่สุดระหว่างการกระจายที่มีเคอร์เนลที่ค่อนข้างใหม่ เช่น Ubuntu 14.04, 12.04 และ Debian 9 อย่างไรก็ตาม การกระจายที่ตรวจสอบ CentOS, RHEL และ OpenSUSE ในชุดของเราตามค่าเริ่มต้นจะสร้างชุดแพ็คเกจที่หนาแน่นขึ้น และในเวอร์ชันล่าสุด (CentOS และ RHEL) จะมีเปอร์เซ็นต์การป้องกันการชนกันของสแต็กที่สูงกว่าเมื่อเปรียบเทียบกับคู่แข่งที่ใช้ Debian (Debian และ Ubuntu) เมื่อเปรียบเทียบเวอร์ชัน CentOS และ RedHat เราสังเกตเห็นการปรับปรุงครั้งใหญ่ในการใช้งาน stack canaries และ RELRO จากเวอร์ชัน 6 ถึง 7 แต่โดยเฉลี่ยแล้ว CentOS มีฟีเจอร์ที่ใช้งานมากกว่า RHEL โดยทั่วไปแล้ว การแจกแจงทั้งหมดควรให้ความสนใจเป็นพิเศษกับการป้องกัน PIE ซึ่งยกเว้น Debian 9 และ Ubuntu 18.04 นั้นถูกนำไปใช้น้อยกว่า 10% ของไบนารีในชุดข้อมูลของเรา
สุดท้ายนี้ ควรสังเกตว่าแม้ว่าเราจะดำเนินการวิจัยด้วยตนเอง แต่ก็มีเครื่องมือรักษาความปลอดภัยมากมาย (เช่น
ที่มา: will.com