Cách ly bảng trang kernel

Cách ly bảng trang kernel (tiếng Anh: Kernel page-table isolation, viết tắt là KPTI hoặc PTI, trước đây được gọi là KAISER) là một tính năng của Linux kernel để giảm nhẹ bảo mật (chủ yếu ảnh hưởng đến các CPU x86 của Intel) 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ớ và không gian kernel cho tốt hơn. KPTI đã được hợp nhất vào Linux kernel từ phiên bản 4.15, và được về các Linux kernel phiên bản 4.14.11, 4.9.75, và 4.4.110. Windows và macOS 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.

== Bối cảnh về KAISER ==
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ả) – là kỹ thuật được thai nghén vào năm 2016 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), 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 (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). 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.

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ỉ. 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.

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ư , tráo đổi bảng trang (page-table swapping), v.v.

== Lỗ hổng Meltdown và KPTI ==
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 và ARM Cortex-A75. Đó 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. 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.

== Thực hiệ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ệ.

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ả (TLB), 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ề và nặng về interrupt.

Hao phí được đo lường là 0.28% dựa theo các tác giả gốc của KAISER; 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; đố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 là 7–17% (hoặc 16–23% khi không có PCID), còn kiểm chuẩn toàn phần thì mất mát 13–19% ( đấu với ). Nhiều bài kiểm chuẩn đã được thực hiện bằng , bị chậm đi cỡ 6–7%. Sự biên dịch kernel Linux bị chậm xuống cỡ 5% trên .

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.

== Liên kết ngoài ==
- Bản vá tài liệu KPTI