Cuộc Tấn Công Kênh Rò Rỉ Qua Việc Đo Tốc Độ Bộ Nhớ Đệm
Gần đây, một lỗ hổng bảo mật mới đã được phát hiện trên các bộ vi xử lý Intel. Kiểu tấn công MDS cho phép vượt qua hàng rào bảo mật để truy xuất dữ liệu đang được xử lý bởi các tiến trình (hoặc máy ảo) khác đang chạy trên cùng một nhân CPU. Các chuyên gia an ninh khuyến nghị tạm thời vô hiệu hóa công nghệ Hyper-Threading để ngăn chặn nguy cơ rò rỉ thông tin.
Tôi đặc biệt quan tâm đến lỗ hổng này và đã dành thời gian nghiên cứu kỹ lưỡng để nắm rõ bản chất vấn đề. Thực tế, nguyên lý của cuộc tấn công MDS mới được kế thừa từ phương pháp tấn công Meltdown đã được phát hiện trước đó. Bên cạnh bài báo khoa học gốc, tôi còn tìm thấy một bài viết blog rất rõ ràng và dễ hiểu về cơ chế này.
Nếu bạn không ngại tôi có thể trình bày với góc nhìn mang tính cá nhân, dưới đây là phần giải thích bằng tiếng Việt về nguyên lý hoạt động:
Để tăng tốc độ xử lý, CPU hiện đại chuyển đổi các lệnh phức tạp trong mã nguồn thành những vi lệnh (micro-ops) mịn hơn để thực thi. Những vi lệnh này chủ yếu thực hiện các thao tác như tính toán trên thanh ghi, truy xuất dữ liệu, hoặc điều chỉnh địa chỉ thanh ghi dựa trên kết quả phép toán (tạo ra hiệu ứng rẽ nhánh luồng thực thi). Để tối ưu hiệu năng, CPU thiết kế nhiều đơn vị xử lý chuyên dụng cho từng loại công việc, cho phép xử lý song song.
Trên bề mặt, chương trình của chúng ta dường như được thực thi tuần tự. Tuy nhiên, nhiều vi lệnh thực chất được xử lý song song. Do yêu cầu tăng tốc độ, thứ tự giữa các đơn vị xử lý song song này không thể đảm bảo tuyệt đối. Đây chính là kỹ thuật “thực thi không theo trật tự” (out-of-order execution), nhưng kết quả cuối cùng vẫn được đảm bảo hiển thị đúng logic cho người dùng.
Một số lệnh có tính độc lập hoàn toàn - ví dụ như tăng giá trị thanh ghi A và lưu giá trị thanh ghi B vào bộ nhớ có thể thực hiện đồng thời. Tuy nhiên, các lệnh phụ thuộc dữ liệu như đọc một từ từ bộ nhớ vào thanh ghi A, sau đó sử dụng giá trị đó để truy xuất dữ liệu khác vào thanh ghi B thì cần tuân thủ thứ tự nghiêm ngặt.
CPU hiện đại sử dụng cơ chế dự đoán để xử lý các phụ thuộc này. Nó sẽ thực thi các thao tác dựa trên dự đoán có khả năng xảy ra nhất, nếu phát hiện sai lầm thì hủy bỏ kết quả và quay về trạng thái chính xác. Ví dụ: dự đoán rẽ nhánh, dự đoán kết quả kiểm tra quyền truy cập bộ nhớ, hoặc dự đoán vị trí dữ liệu trong cache.
Trong thời gian dài, chúng ta cho rằng cơ chế này hoàn toàn an toàn vì trạng thái nội bộ của CPU không thể truy cập trực tiếp từ ứng dụng. Dù dữ liệu không mong muốn có thể được tải vào cache, nhưng không có cách nào để đọc chúng. Cho đến khi tấn công Meltdown xuất hiện…
Cuộc tấn công Meltdown cho phép chương trình người dùng đọc dữ liệu được bảo vệ bởi nhân hệ điều hành. Dưới đây là đoạn mã giả minh họa:
|
|
Dù lệnh mov al, byte[rcx]
thất bại do thiếu quyền, hai lệnh tiếp theo vẫn được thực thi theo cơ chế “thực thi không theo trật tự”. CPU sẽ hủy bỏ kết quả khả dụng cho người dùng, nhưng trạng thái cache đã bị ảnh hưởng.
Giá trị al (0-FF) được nhân với 4096 (kích thước trang cache) để truy cập mảng rbx. Quan trọng là CPU đã tải trang bộ nhớ tương ứng vào cache, dù không thể đọc trực tiếp giá trị. Bằng cách đo thời gian truy cập 256 vị trí có thể, kẻ tấn công có thể xác định trang nào đã có sẵn trong cache - tương ứng với dữ liệu bí mật ban đầu.
Tấn công Spectre phức tạp hơn, cho phép lấy dữ liệu từ tiến trình khác. Bài báo về Spectre có giải thích rất dễ hiểu, đi kèm đoạn mã C minh họa:
|
|
CPU sẽ dự đoán và thực thi trước các nhánh có khả năng xảy ra nhất. Dù kết quả sai sẽ bị loại bỏ, trạng thái cache vẫn giữ nguyên. Cơ chế tấn công gồm 4 bước chính:
- Luyện thuật toán dự đoán bằng việc thực thi các trường hợp đúng 5 lần liên tiếp
- Hướng array1[x] đến địa chỉ nhạy cảm trong tiến trình mục tiêu
- Gây ra lỗi kiểm tra điều kiện nhưng CPU vẫn thực thi dự đoán
- Đo thời gian truy cập cache để xác định giá trị đã bị rò rỉ
Cả Meltdown và Spectre đều khai thác cơ chế pipeline của CPU hiện đại, ảnh hưởng đến Intel, AMD và cả chip ARM trên thiết bị di động. Các bản vá phần mềm có thể giảm thiểu rủi ro với một phần hiệu năng bị đánh đổi.
Tuy nhiên, cuộc tấn công MDS mới đây lại nhắm đến một mục tiêu khác: các buffer nội bộ của CPU. Trong kiến trúc Hyper-Threading, các luồng trên cùng một nhân chia sẻ buffer, tạo cơ hội cho tiến trình không đáng tin đọc dữ liệu từ luồng khác. Hiện tại chưa có biện pháp khắc phục phần mềm, nên phương án tối ưu nhất là vô hiệu hóa Hyper-Threading trong môi trường cần bảo mật cao.