Skip to content

UEFI Secure Boot và mokutil

Trang này trình bày cơ chế UEFI Secure Boot trên máy x86 chạy Linux, vai trò của shim và MOK (Machine Owner Key), sau đó là công cụ mokutil dùng để kiểm tra trạng thái Secure Boot và quản lý MOK. Thứ tự gồm: các biến key của firmware, chuỗi shim, quy trình đăng ký MOK, rồi các lệnh mokutil thường dùng.

Biến key của UEFI Secure Boot

Firmware UEFI giữ bốn nhóm key trong các biến không bay hơi (non-volatile):

Biến Vai trò
PK (Platform Key) Key của chủ nền tảng. Ai giữ PK thì được phép thay KEK.
KEK (Key Exchange Key) Key được phép cập nhật db và dbx.
db Danh sách key và hash được tin cậy. Firmware chỉ chạy file EFI có chữ ký khớp db.
dbx Danh sách key và hash bị thu hồi.

Khi Secure Boot bật, firmware kiểm tra chữ ký của mỗi file EFI trước khi chạy. Các bản phân phối Linux không thể đưa key của từng hãng vào db của mọi mainboard, nên dùng một bootloader trung gian nhỏ là shim, được Microsoft ký để firmware tin cậy sẵn.

Chuỗi tin cậy với shim

Shim mang theo key của bản phân phối và giữ thêm một danh sách key riêng của máy là MOK. Chuỗi verify như sau:

  1. Firmware verify shim bằng key trong db.
  2. Shim verify GRUB bằng key của bản phân phối hoặc bằng MOK.
  3. GRUB nhờ shim verify kernel.
  4. Kernel verify kernel module nếu bật module signing, key ký module lấy từ key được tin cậy của kernel, trong đó có MOK.

MOK giải quyết trường hợp người dùng tự build kernel hoặc module (ví dụ driver ngoài cây nguồn) mà không cần sửa db của firmware. Khái niệm chain of trust nói chung xem tại Secure boot và TrustZone.

Đăng ký MOK

Việc thêm key vào MOK cần xác nhận trực tiếp tại máy, để phần mềm chạy trong OS không tự thêm key khi người dùng chưa đồng ý. Quy trình điển hình:

  1. Tạo cặp key và chứng chỉ định dạng DER, ký module hoặc kernel bằng private key.
  2. Chạy mokutil --import kèm chứng chỉ. Lệnh yêu cầu đặt một mật khẩu dùng một lần.
  3. Khởi động lại máy. Shim chạy chương trình MokManager trước khi vào OS.
  4. Trong MokManager, chọn đăng ký key (enroll) và nhập lại mật khẩu ở bước 2.
  5. Máy khởi động tiếp, key đã nằm trong MOK.

Công cụ mokutil

mokutil là công cụ dòng lệnh trong dự án shim, đóng gói thành gói mokutil trên các bản phân phối như Ubuntu, Debian và Fedora. Công cụ đọc và ghi các biến UEFI liên quan tới shim, nên cần quyền root và máy phải boot bằng UEFI.

Lệnh Tác dụng
mokutil --sb-state Hiển thị Secure Boot đang bật hay tắt.
mokutil --list-enrolled Liệt kê các key đã đăng ký trong MOK.
mokutil --import key.der Yêu cầu đăng ký key, chờ xác nhận ở lần boot sau.
mokutil --delete key.der Yêu cầu xóa key khỏi MOK, chờ xác nhận ở lần boot sau.
mokutil --test-key key.der Kiểm tra key đã nằm trong MOK hay chưa.
mokutil --revoke-import Hủy yêu cầu đăng ký đang chờ.
mokutil --disable-validation Yêu cầu shim bỏ qua kiểm tra chữ ký của thành phần phía sau. Không tắt Secure Boot của firmware.
mokutil --enable-validation Bật lại kiểm tra chữ ký trong shim.

Ví dụ kiểm tra trạng thái:

mokutil --sb-state

Kết quả SecureBoot enabled nghĩa là firmware đang thực thi Secure Boot. Nếu máy không boot bằng UEFI, lệnh báo biến EFI không khả dụng.

Chưa kiểm chứng

Danh sách lệnh trên dựa trên kiến thức chung về mokutil, chưa đối chiếu với man page mokutil(1) của một phiên bản cụ thể. Tên và hành vi của một số tùy chọn có thể khác giữa các phiên bản (ví dụ --timeout, --reset, --export). Cần đối chiếu với man mokutil trên bản phân phối đang dùng trước khi dựa vào chi tiết.

Liên quan

  • GRUB (Embedded): vai trò của GRUB trong chuỗi shim, GRUB, kernel và cơ chế SBAT.
  • Secure boot và TrustZone: chain of trust trên SoC ARM.
  • CVE: theo dõi lỗ hổng của GRUB và shim.

Tài liệu tham khảo

  1. mokutil(1), man page của gói mokutil, xem bằng man mokutil trên máy Linux.
  2. Unified Extensible Firmware Interface/Secure Boot - ArchWiki - wiki.archlinux.org
  3. shim: UEFI shim loader - github.com/rhboot