Cách ly bảng trang kernel

Bách khoa toàn thư mở Wikipedia
Một tập hợp bảng trang để dùng trong chế độ kernel thì bao gồm cả hai không gian kernel và không gian người dùng. Tập hợp bảng trang thứ hai để dùng trong chế độ người dùng thì bao gồm một bản sao của không gian người dùng và một tập hợp tối thiểu của không gian kernel có xử trí các system call và ngắt.

Cách ly bảng trang kernel (tiếng Anh: Kernel page-table isolation, viết tắt là KPTI hoặc PTI,[1] trước đây được gọi là KAISER)[2][3] là một tính năng của Linux kernel để giảm nhẹ lỗ hổng (en) bảo mật (chủ yếu ảnh hưởng đến các CPU x86 của Intel)[4] và cải thiện độ cứng cáp của kernel chống lại những mưu toan qua mặt cơ chế xếp ngẫu nhiên bố cục không gian địa chỉ kernel (kernel address space layout randomization – KASLR). Cách nó hoạt động là cách ly bộ nhớ không gian người dùng và không gian kernel cho tốt hơn.[5][6] KPTI đã được hợp nhất vào Linux kernel từ phiên bản 4.15,[7] và được port ngược (en) về các Linux kernel phiên bản 4.14.11, 4.9.75, và 4.4.110.[8][9][10] Windows[11]macOS[12] cũng đã phát hành các bản cập nhật tương tự. KPTI không hề giải quyết lỗ hổng Spectre có liên quan.[13]

Bối cảnh về KAISER[sửa | sửa mã nguồn]

Các bản vá KPTI thì có được dựa trên KAISER (viết tắt cho Kernel Address Isolation to have Side-channels Efficiently Removed – Cách ly Địa chỉ Kernel để Loại bỏ Kênh bên Một cách Có hiệu quả)[6] – là kỹ thuật được thai nghén vào năm 2016[14] và được xuất bản vào tháng 6 năm 2017 từ hồi khi Meltdown còn chưa được biết đến. KAISER khiến cho việc đánh bại KASLR trở nên khó khăn hơn (KASLR là một cơ chế giảm nhẹ hồi năm 2014 cho một vấn đề bớt trầm trọng hơn nhiều).

Vào năm 2014, Linux kernel đã thông qua cơ chế xếp ngẫu nhiên bố cục không gian địa chỉ kernel (KASLR),[15] việc này khiến chuyện khai thác các lỗ hổng kernel khác trở nên khó nhằn hơn[16] (các lỗ hổng đấy đều nhờ cậy vào các phép ánh xạ địa chỉ kernel mà vẫn còn bị ẩn giấu khỏi không gian người dùng).[17] Nhưng bất chấp việc ngăn cấm truy cập đến các phép ánh xạ kernel đấy, hóa ra lại có vài cách tấn công kênh bên trong các bộ xử lý hiện đại có thể làm rò rỉ địa điểm của bộ nhớ này, khiến việc đi vòng qua KASLR trở nên khả thi.[6][18][19][20]

KAISER đã giải quyết các vấn đề đấy trong KASLR bằng cách loại trừ một số nguồn rò rỉ địa chỉ.[6] Trong khi KASLR chỉ ngăn ngừa các phép ánh xạ địa chỉ khỏi chuyện rò rỉ thôi, thì KAISER còn ngăn ngừa chính dữ liệu khỏi bị rò rỉ nữa, do đó bao được trường hợp Meldown.[21]

KPTI thì được dựa trên KAISER. Khi không bật dùng KPTI, thì bất kỳ khi nào đang thực thi mã ở không gian người dùng (các ứng dụng), Linux cũng sẽ giữ cả bộ nhớ kernel của nó được ánh xạ trong các bảng trang (page table) mặc dù bộ nhớ đó được bảo vệ khỏi truy cập. Cái lợi thế là khi ứng dụng làm lời gọi hệ thống (system call) vào kernel hoặc khi nhận được lệnh ngắt (interrupt), thì các bảng trang kernel luôn luôn hiện diện, cho nên có thể tránh khỏi hầu hết các hao phí có liên quan đến phép hoán chuyển ngữ cảnh (context-switching) như TLB flush (en), tráo đổi bảng trang (page-table swapping), v.v.[5]

Lỗ hổng Meltdown và KPTI[sửa | sửa mã nguồn]

Vào tháng 1 năm 2018, tài liệu về lỗ hổng Meltdown được xuất bản, được biết là ảnh hướng đến các CPU x86 của Intel (en)ARM Cortex-A75.[4][13] Đó là một lỗ hổng trầm trọng hơn cái lỗ hổng qua mặt KASLR mà KAISER vốn có ý định sửa: Người ta phát hiện rằng các nội dung của bộ nhớ kernel cũng có thể bị rò rỉ, chứ không chỉ mỗi các địa điểm của phép ánh xạ bộ nhớ như trước đây vẫn lầm tưởng.

KPTI (về khái niệm là dựa trên KAISER) ngăn ngừa Meltdown bằng cách ngăn ngừa hầu hết 'các địa điểm có bảo vệ' khỏi bị ánh xạ tới không gian người dùng.

Các bộ xử lý x86 AMD hiện chưa được biết là có bị Meltdown ảnh hưởng và không cần có KPTI để giảm nhẹ chúng.[13][22] Tuy nhiên, các bộ xử lý AMD vẫn dễ bị mắc lỗ hổng qua mặt KASLR khi tắt dùng KPTI.[20]

Thực hiện[sửa | sửa mã nguồn]

KPTI sửa những rò rỉ này bằng cách tách rời các bảng trang không gian người dùng và không gian kernel một cách hoàn toàn. Một tập hợp các bảng trang thì bao gồm cả hai địa chỉ không gian kernel và không gian người dùng giống như trước, nhưng nó chỉ được dùng khi hệ thống đang chạy trong chế độ kernel. Tập hợp các bảng trang thứ hai để dùng trong chế độ người dùng thì bao gồm một bản sao của không gian người dùng và một tập hợp tối thiểu của các phép ánh xạ không gian kernel có cung cấp thông tin cần để đi vào hoặc thoát ra khỏi lời gọi hệ thống, ngắt và ngoại lệ.[5]

Trên các bộ xử lý mà có hỗ trợ các bộ nhận dạng ngữ cảnh xử lý (process-context identifiers – PCID), thì có thể tránh được chuyện xả translation lookaside buffer (en) (TLB),[5] nhưng ngay cả thế thì điều đó vẫn đi kèm một chi phí hiệu suất đáng kể, đặc biệt trong các lượng công việc nặng về system call (en) và nặng về interrupt.[23]

Hao phí được đo lường là 0.28% dựa theo các tác giả gốc của KAISER;[6] một phát triển viên Linux đã đo lường nó là khoảng 5% cho hầu hết lượng công việc và đến 30% trong một số trường hợp, ngay cả với cơ chế tối ưu hóa PCID;[5] đối với engine cơ sở dữ liệu PostgreSQL thì tác động lên các bài kiểm tra 'chỉ đọc (read-only)' trên bộ xử lý Intel Skylake (en) là 7–17% (hoặc 16–23% khi không có PCID),[24] còn kiểm chuẩn toàn phần thì mất mát 13–19% (Coffee Lake (en) đấu với Broadwell-E (en)).[25] Nhiều bài kiểm chuẩn đã được thực hiện bằng Phoronix (en),[1][26][27] Redis bị chậm đi cỡ 6–7%.[25] Sự biên dịch kernel Linux bị chậm xuống cỡ 5% trên Haswell.[28]

KPTI có thể được tắt dùng một phần bằng tùy chọn boot kernel là "nopti". Ngoài ra các dự liệu cũng đã được tạo ra để tắt dùng KPTI nếu các bộ xử lý sau này sửa được các rò rỉ thông tin.[2]

Liên kết ngoài[sửa | sửa mã nguồn]

Tham khảo[sửa | sửa mã nguồn]

  1. ^ a b Larabel, Michael (ngày 3 tháng 1 năm 2018). “Further Analyzing The Intel CPU "x86 PTI Issue" On More Systems”. Phoronix (bằng tiếng Anh).
  2. ^ a b Corbet, Jonathan (ngày 20 tháng 12 năm 2017). “The current state of kernel page-table isolation”. LWN.net.
  3. ^ Cimpanu, Catalin (ngày 3 tháng 1 năm 2018). “OS Makers Preparing Patches for Secret Intel CPU Security Bug”. Bleeping Computer (bằng tiếng Anh).
  4. ^ a b “Spectre, Meltdown: Critical CPU Security Flaws Explained – ExtremeTech”. ExtremeTech (bằng tiếng Anh). ngày 4 tháng 1 năm 2018. Truy cập ngày 5 tháng 1 năm 2018.
  5. ^ a b c d e Corbet, Jonathan (ngày 15 tháng 11 năm 2017). “KAISER: hiding the kernel from user space”. LWN.net.
  6. ^ a b c d e Gruss, Daniel; Lipp, Moritz; Schwarz, Michael; Fellner, Richard; Maurice, Clémentine; Mangard, Stefan (ngày 24 tháng 6 năm 2017). KASLR is Dead: Long Live KASLR (PDF). Engineering Secure Software and Systems 2017.
  7. ^ Corbet, Jonathan (ngày 20 tháng 12 năm 2017). “Kernel page-table isolation merged”. LWN.net.
  8. ^ Kroah-Hartman, Greg (ngày 2 tháng 1 năm 2018). “Linux 4.14.11 Changelog”. kernel.org.
  9. ^ Kroah-Hartman, Greg (ngày 5 tháng 1 năm 2018). “Linux 4.9.75 Changelog”. kernel.org.
  10. ^ Kroah-Hartman, Greg (ngày 5 tháng 1 năm 2018). “Linux 4.4.110 Changelog”.
  11. ^ @aionescu (ngày 14 tháng 11 năm 2017). “Windows 17035 Kernel ASLR/VA Isolation In Practice” (Tweet) – qua Twitter.
  12. ^ “Apple has already partially implemented fix in macOS for 'KPTI' Intel CPU security flaw”. AppleInsider (bằng tiếng Anh). Truy cập ngày 3 tháng 1 năm 2018.
  13. ^ a b c Coldewey, Devin (ngày 4 tháng 1 năm 2018). “Kernel panic! What are Meltdown and Spectre, the bugs affecting nearly every computer and device?”. TechCrunch (bằng tiếng Anh).
  14. ^ Gruss, Daniel (ngày 3 tháng 1 năm 2018). “#FunFact: We submitted #KAISER to #bhusa17 and got it rejected”. Bản gốc lưu trữ ngày 8 tháng 1 năm 2018. Truy cập ngày 8 tháng 1 năm 2018 – qua Twitter.
  15. ^ “Linux kernel 3.14, Section 1.7. Kernel address space randomization”. kernelnewbies.org. ngày 30 tháng 3 năm 2014. Truy cập ngày 2 tháng 4 năm 2014.
  16. ^ Bhattacharjee, Abhishek; Lustig, Daniel (ngày 29 tháng 9 năm 2017). Architectural and Operating System Support for Virtual Memory (bằng tiếng Anh). Morgan & Claypool Publishers. tr. 56. ISBN 978-1-62705-933-6.
  17. ^ Kerner, Sean Michael (ngày 3 tháng 1 năm 2018). “KPTI Intel Chip Flaw Exposes Security Risks”. eWEEK (bằng tiếng Anh).
  18. ^ Jang, Yeongjin; Lee, Sangho; Kim, Taesoo (2016). “Breaking Kernel Address Space Layout Randomization with Intel TSX” (PDF). 2016 ACM SIGSAC Conference on Computer and Communications Security. CCS '16. New York, NY, USA: ACM: 380–392. doi:10.1145/2976749.2978321. ISBN 978-1-4503-4139-4.
  19. ^ Gruss, Daniel; Maurice, Clémentine; Fogh, Anders; Lipp, Moritz; Mangard, Stefan (2016). “Prefetch Side-Channel Attacks: Bypassing SMAP and Kernel ASLR” (PDF). 2016 ACM SIGSAC Conference on Computer and Communications Security. CCS '16. New York, NY, USA: ACM: 368–379. doi:10.1145/2976749.2978356. ISBN 978-1-4503-4139-4.
  20. ^ a b Hund, R.; Willems, C.; Holz, T. (tháng 5 năm 2013). “Practical Timing Side Channel Attacks against Kernel Space ASLR” (PDF). 2013 IEEE Symposium on Security and Privacy: 191–205. doi:10.1109/sp.2013.23.
  21. ^ “Meltdown” (PDF).
  22. ^ “An Update on AMD Processor Security”. AMD. ngày 4 tháng 1 năm 2018.
  23. ^ Leyden, John; Williams, Chris (ngày 2 tháng 1 năm 2018). “Kernel-memory-leaking Intel processor design flaw forces Linux, Windows redesign”. The Register.
  24. ^ Freund, Andres (ngày 2 tháng 1 năm 2018). “heads up: Fix for intel hardware bug will lead to performance regressions”. PostgreSQL development mailing list (pgsql-hackers).
  25. ^ a b Larabel, Michael (ngày 2 tháng 1 năm 2018). “Initial Benchmarks Of The Performance Impact Resulting From Linux's x86 Security Changes”. Phoronix.
  26. ^ Larabel, Michael (ngày 2 tháng 1 năm 2018). “Linux Gaming Performance Doesn't Appear Affected By The x86 PTI Work”. Phoronix (bằng tiếng Anh).
  27. ^ Larabel, Michael (ngày 3 tháng 1 năm 2018). “VM Performance Showing Mixed Impact With Linux 4.15 KPTI Patches – Phoronix”. Phoronix (bằng tiếng Anh).
  28. ^ Velvindron, Loganaden (ngày 4 tháng 1 năm 2018). “Linux KPTI performance hit on real workloads”. Loganaden Velvindron. Truy cập ngày 5 tháng 1 năm 2018.