Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Chúng tôi đề xuất hạ xuống mức thấp một lần nữa và nói về tính bảo mật của phần sụn dành cho nền tảng máy tính tương thích x86. Lần này, thành phần chính của nghiên cứu là Intel Boot Guard (đừng nhầm với Intel BIOS Guard!) - một công nghệ khởi động BIOS đáng tin cậy được phần cứng hỗ trợ mà nhà cung cấp hệ thống máy tính có thể bật hoặc tắt vĩnh viễn ở giai đoạn sản xuất. Chà, công thức nghiên cứu đã quen thuộc với chúng ta: chia nhỏ việc triển khai công nghệ này bằng kỹ thuật đảo ngược, mô tả kiến ​​​​trúc của nó, lấp đầy nó bằng các chi tiết không có giấy tờ, thêm vào đó các vectơ tấn công để nếm thử và trộn lẫn. Hãy đổ thêm dầu vào câu chuyện về việc một lỗi đã được sao chép trong nhiều năm do một số nhà cung cấp sản xuất lại cho phép kẻ tấn công tiềm năng sử dụng công nghệ này để tạo ra một rootkit ẩn trong hệ thống mà không thể gỡ bỏ được (ngay cả với một lập trình viên).

Nhân tiện, bài viết này dựa trên các báo cáo “Bảo vệ Rootkit: Intel BootGuard” từ hội nghị ZeroNights 2016 và cuộc họp lần thứ 29 DefCon Nga (cả hai bài thuyết trình đây).

Phần sụn cho nền tảng máy tính có kiến ​​trúc Intel 64

Trước tiên, hãy trả lời câu hỏi: phần sụn của nền tảng máy tính hiện đại có kiến ​​trúc Intel 64 là gì? Tất nhiên là UEFI BIOS. Nhưng câu trả lời như vậy sẽ không chính xác. Chúng ta hãy xem hình ảnh hiển thị phiên bản máy tính để bàn (máy tính xách tay) của kiến ​​trúc này.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Cơ sở là liên kết:

  • Bộ xử lý (CPU, Bộ xử lý trung tâm), ngoài các lõi chính, còn có lõi đồ họa tích hợp (không phải ở tất cả các kiểu máy) và bộ điều khiển bộ nhớ (IMC, Bộ điều khiển bộ nhớ tích hợp);
  • Chipset (PCH, Platform Controller Hub), chứa nhiều bộ điều khiển khác nhau để tương tác với các thiết bị ngoại vi và quản lý các hệ thống con. Trong số đó có Intel Management Engine (ME) nổi tiếng, cũng có phần mềm cơ sở (Intel ME firmware).

Máy tính xách tay, ngoài những điều trên, còn cần có bộ điều khiển tích hợp (ACPI EC, Điều khiển nâng cao và Bộ điều khiển nhúng giao diện nguồn), chịu trách nhiệm vận hành hệ thống con nguồn, bàn di chuột, bàn phím, phím Fn (độ sáng màn hình, âm lượng , đèn nền bàn phím, v.v.) và những thứ khác. Và nó cũng có firmware riêng.

Vì vậy, toàn bộ phần sụn trên là phần sụn của nền tảng máy tính (phần sụn hệ thống), được lưu trữ trên bộ nhớ flash SPI chung. Để người dùng bộ nhớ này không bị nhầm lẫn về vị trí của nó, nội dung của bộ nhớ này được chia thành các vùng sau (như trong hình):

  • BIOS UEFI;
  • Phần sụn ACPI EC (một vùng riêng biệt xuất hiện cùng với vi kiến ​​trúc bộ xử lý Skylake (2015), nhưng trong thực tế, chúng tôi chưa thấy ví dụ nào về việc sử dụng nó, vì vậy phần sụn của bộ điều khiển tích hợp vẫn được bao gồm trong UEFI BIOS) ;
  • Phần mềm Intel ME;
  • cấu hình (địa chỉ MAC, v.v.) của bộ điều hợp mạng GbE (Gigabit Ethernet) tích hợp;
  • Bộ mô tả Flash là vùng chính của bộ nhớ flash chứa các con trỏ tới các vùng khác cũng như quyền truy cập chúng.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
SPI bus master, một bộ điều khiển SPI được tích hợp trong chipset, qua đó bộ nhớ này được truy cập, chịu trách nhiệm phân định quyền truy cập vào các vùng (theo các quyền đã chỉ định). Nếu các quyền được đặt thành các giá trị được đề xuất (vì lý do bảo mật) của Intel thì mỗi người dùng flash SPI chỉ có toàn quyền truy cập (đọc/ghi) vào khu vực của họ. Và phần còn lại là chỉ đọc hoặc không thể truy cập được. Một thực tế nổi tiếng: trên nhiều hệ thống, CPU có toàn quyền truy cập vào UEFI BIOS và GbE, chỉ đọc quyền truy cập vào các bộ mô tả flash và hoàn toàn không có quyền truy cập vào vùng Intel ME. Tại sao lại có nhiều mà không phải tất cả? Những gì được đề nghị là không cần thiết. Chúng tôi sẽ cho bạn biết chi tiết hơn ở phần sau của bài viết.

Cơ chế bảo vệ phần mềm nền tảng máy tính khỏi bị sửa đổi

Rõ ràng, phần sụn của nền tảng máy tính phải được bảo vệ khỏi sự xâm phạm có thể xảy ra, điều này sẽ cho phép kẻ tấn công tiềm năng có được chỗ đứng trong đó (tồn tại các bản cập nhật/cài đặt lại hệ điều hành), thực thi mã của chúng ở các chế độ đặc quyền nhất, v.v. Và tất nhiên, việc hạn chế quyền truy cập vào các vùng bộ nhớ flash SPI là chưa đủ. Do đó, để bảo vệ phần sụn khỏi bị sửa đổi, nhiều cơ chế khác nhau dành riêng cho từng môi trường hoạt động sẽ được sử dụng.

Do đó, phần sụn Intel ME được ký để kiểm soát tính toàn vẹn và tính xác thực và được bộ điều khiển ME kiểm tra mỗi lần nó được tải vào bộ nhớ ME UMA. Quá trình xác minh này đã được chúng tôi thảo luận ở một trong những Điều, dành riêng cho hệ thống con Intel ME.

Và phần sụn ACPI EC, theo quy định, chỉ được kiểm tra tính toàn vẹn. Tuy nhiên, do tệp nhị phân này được bao gồm trong UEFI BIOS nên nó hầu như luôn tuân theo các cơ chế bảo vệ giống như UEFI BIOS sử dụng. Hãy nói về họ.

Những cơ chế này có thể được chia thành hai loại.

Bảo vệ ghi trong vùng UEFI BIOS

  1. Bảo vệ vật lý nội dung của bộ nhớ flash SPI bằng jumper chống ghi;
  2. Bảo vệ hình chiếu của vùng UEFI BIOS trong không gian địa chỉ CPU bằng cách sử dụng các thanh ghi chipset PRx;
  3. Chặn các nỗ lực ghi vào vùng UEFI BIOS bằng cách tạo và xử lý ngắt SMI tương ứng bằng cách thiết lập các bit BIOS_WE/BLE và SMM_BWP trong thanh ghi chipset;
  4. Phiên bản nâng cao hơn của biện pháp bảo vệ này là Intel BIOS Guard (PFAT).

Ngoài các cơ chế này, các nhà cung cấp có thể phát triển và triển khai các biện pháp bảo mật của riêng họ (ví dụ: ký các viên nang với các bản cập nhật BIOS UEFI).

Điều quan trọng cần lưu ý là trên một hệ thống cụ thể (tùy thuộc vào nhà cung cấp), không phải tất cả các cơ chế bảo vệ trên đều có thể được áp dụng, chúng có thể không được áp dụng hoặc chúng có thể được triển khai theo cách dễ bị tấn công. Bạn có thể đọc thêm về các cơ chế này và tình hình triển khai chúng trong bài viết này. Đối với những người quan tâm, chúng tôi khuyên bạn nên đọc toàn bộ loạt bài viết về bảo mật BIOS UEFI từ CodeRush.

Xác thực BIOS UEFI

Khi chúng ta nói về các công nghệ khởi động đáng tin cậy, điều đầu tiên chúng ta nghĩ đến là Secure Boot. Tuy nhiên, về mặt kiến ​​trúc, nó được thiết kế để xác minh tính xác thực của các thành phần bên ngoài UEFI BIOS (trình điều khiển, bộ tải khởi động, v.v.) chứ không phải bản thân phần sụn.

Do đó, Intel, trong các SoC có vi kiến ​​trúc Bay Trail (2012), đã triển khai Khởi động an toàn không bị vô hiệu hóa phần cứng (Khởi động đã xác minh), không có điểm chung nào với công nghệ Khởi động an toàn nêu trên. Sau đó (2013), cơ chế này đã được cải tiến và phát hành với tên gọi Intel Boot Guard dành cho máy tính để bàn có vi kiến ​​trúc Haswell.

Trước khi mô tả Intel Boot Guard, chúng ta hãy xem xét các môi trường thực thi trong kiến ​​trúc Intel 64, kết hợp lại với nhau, chúng là nguồn gốc của sự tin cậy đối với công nghệ khởi động đáng tin cậy này.

Intel CPU

Cap gợi ý rằng bộ xử lý là môi trường thực thi chính trong kiến ​​trúc Intel 64. Tại sao nó là gốc rễ của sự tin cậy? Hóa ra điều khiến anh ấy trở nên như vậy chính là việc sở hữu những yếu tố sau:

  • ROM vi mã là bộ nhớ không ổn định, không thể ghi lại để lưu trữ vi mã. Người ta tin rằng microcode là việc triển khai hệ thống lệnh của bộ xử lý bằng cách sử dụng các hướng dẫn đơn giản nhất. Cũng xảy ra trong microcode lỗi. Vì vậy, trong BIOS, bạn có thể tìm thấy các tệp nhị phân có cập nhật vi mã (được phủ trong khi khởi động, vì ROM không thể bị ghi đè). Nội dung của các mã nhị phân này được mã hóa, điều này làm phức tạp đáng kể việc phân tích (do đó, nội dung cụ thể của vi mã chỉ được biết bởi những người phát triển nó) và được ký để kiểm soát tính toàn vẹn và tính xác thực;
  • Khóa AES để giải mã nội dung cập nhật vi mã;
  • hàm băm của khóa công khai RSA được sử dụng để xác minh chữ ký của các bản cập nhật vi mã;
  • Hàm băm khóa công khai RSA xác minh chữ ký của các mô-đun mã ACM (Mô-đun mã xác thực) do Intel phát triển mà CPU có thể khởi chạy trước khi thực thi BIOS (xin chào vi mã) hoặc trong khi hoạt động, khi một số sự kiện nhất định xảy ra.

Intel TÔI

Blog của chúng tôi được dành riêng cho hệ thống con này две Điều. Chúng ta hãy nhớ lại rằng môi trường thực thi này dựa trên bộ vi điều khiển được tích hợp trong chipset và là môi trường được ẩn và đặc quyền nhất trong hệ thống.

Mặc dù có tính bí mật nhưng Intel ME cũng là nguồn gốc của sự tin cậy vì nó có:

  • ME ROM - bộ nhớ không ổn định, không thể ghi lại (không cung cấp phương pháp cập nhật) chứa mã bắt đầu, cũng như hàm băm SHA256 của khóa chung RSA, xác minh chữ ký của phần sụn Intel ME;
  • Khóa AES để lưu trữ thông tin bí mật;
  • quyền truy cập vào một bộ cầu chì (FPF, Cầu chì lập trình được theo trường) được tích hợp vào chipset để lưu trữ vĩnh viễn một số thông tin, bao gồm cả thông tin do nhà cung cấp hệ thống máy tính chỉ định.

Bảo vệ khởi động Intel 1.x

Một tuyên bố từ chối trách nhiệm nhỏ. Số phiên bản công nghệ Intel Boot Guard mà chúng tôi sử dụng trong bài viết này là tùy ý và có thể không liên quan gì đến cách đánh số được sử dụng trong tài liệu nội bộ của Intel. Ngoài ra, thông tin được cung cấp ở đây về việc triển khai công nghệ này được lấy trong quá trình thiết kế ngược và có thể chứa những thông tin không chính xác so với thông số kỹ thuật của Intel Boot Guard mà khó có thể được công bố.

Vì vậy, Intel Boot Guard (BG) là công nghệ xác minh xác thực UEFI BIOS được hỗ trợ phần cứng. Đánh giá theo mô tả ngắn gọn của nó trong cuốn sách [Tiết lộ công nghệ bảo mật nhúng nền tảng, chương Khởi động có tính toàn vẹn hoặc không khởi động], nó hoạt động như một chuỗi khởi động đáng tin cậy. Và liên kết đầu tiên trong đó là mã khởi động (microcode) bên trong CPU, được kích hoạt bởi sự kiện RESET (đừng nhầm với vectơ RESET trong BIOS!). CPU tìm thấy một mô-đun mã được phát triển và ký bởi Intel (Intel BG startup ACM) trên bộ nhớ flash SPI, tải nó vào bộ đệm của nó, xác minh (ở trên đã lưu ý rằng CPU có hàm băm của khóa chung để xác minh ACM chữ ký) và bắt đầu.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel

Mô-đun mã này chịu trách nhiệm xác minh một phần khởi đầu nhỏ của UEFI BIOS - Khối khởi động ban đầu (IBB), do đó, chứa chức năng xác minh phần chính của UEFI BIOS. Do đó, Intel BG cho phép bạn xác minh tính xác thực của BIOS trước khi tải HĐH (việc này có thể được thực hiện dưới sự giám sát của công nghệ Khởi động an toàn).

Công nghệ Intel BG cung cấp hai chế độ hoạt động (và một chế độ không can thiệp vào chế độ kia, tức là cả hai chế độ đều có thể được bật trên hệ thống hoặc có thể bị tắt cả hai).

Khởi động đã đo

Trong chế độ Khởi động đo (MB), mỗi thành phần khởi động (bắt đầu bằng ROM khởi động CPU) “đo lường” thành phần tiếp theo bằng cách sử dụng các khả năng của TPM (Mô-đun nền tảng đáng tin cậy). Đối với những người chưa biết, hãy để tôi giải thích.

TPM có PCR (Thanh ghi cấu hình nền tảng), trong đó kết quả của thao tác băm được ghi theo công thức:

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel

Những thứ kia. giá trị PCR hiện tại phụ thuộc vào giá trị trước đó và các thanh ghi này chỉ được đặt lại khi hệ thống được THIẾT LẬP LẠI.

Do đó, ở chế độ MB, tại một thời điểm nào đó, PCR phản ánh một mã định danh duy nhất (trong khả năng của hoạt động băm) của mã hoặc dữ liệu đã được “đo lường”. Giá trị PCR có thể được sử dụng trong một số hoạt động mã hóa dữ liệu (TPM_Seal). Sau đó, việc giải mã chúng (TPM_Unseal) sẽ chỉ có thể thực hiện được nếu các giá trị PCR không thay đổi do tải (tức là không có một thành phần “đo” nào được sửa đổi).

Khởi động đã được xác minh

Điều tồi tệ nhất đối với những người muốn sửa đổi UEFI BIOS là chế độ Khởi động được xác minh (VB), trong đó mỗi thành phần khởi động sẽ xác minh bằng mật mã tính toàn vẹn và tính xác thực của thành phần tiếp theo. Và trong trường hợp có lỗi xác minh, (một trong) sẽ xảy ra:

  • tắt máy theo thời gian chờ từ 1 phút đến 30 phút (để người dùng có thời gian hiểu lý do tại sao máy tính của mình không khởi động và nếu có thể, hãy cố gắng khôi phục BIOS);
  • tắt máy ngay lập tức (để người dùng không có thời gian để hiểu, chứ đừng nói đến việc làm bất cứ điều gì);
  • tiếp tục làm việc với vẻ mặt bình tĩnh (trường hợp đó không có thời gian cho sự an toàn, vì có nhiều việc quan trọng hơn phải làm).

Việc lựa chọn hành động tùy thuộc vào cấu hình Intel BG được chỉ định (cụ thể là theo chính sách được gọi là chính sách thực thi), được nhà cung cấp nền tảng máy tính ghi lại vĩnh viễn trong bộ lưu trữ được thiết kế đặc biệt - cầu chì chipset (FPF). Chúng ta sẽ tập trung vào điểm này chi tiết hơn sau.

Ngoài cấu hình, nhà cung cấp còn tạo hai khóa RSA 2048 và tạo hai cấu trúc dữ liệu (thể hiện trong hình):

  1. Tệp kê khai khóa gốc của nhà cung cấp (KEYM, Bản kê khai khóa gốc OEM), chứa SVN (Số phiên bản bảo mật) của bản kê khai này, hàm băm SHA256 của khóa chung của bản kê khai tiếp theo, khóa chung RSA (tức là phần công khai của khóa gốc của nhà cung cấp) để xác minh chữ ký của bản tuyên ngôn này và chính chữ ký đó;
  2. Tệp kê khai IBB (IBBM, Tệp kê khai khối khởi động ban đầu), chứa SVN của bản kê khai này, hàm băm SHA256 của IBB, khóa chung để xác minh chữ ký của bản kê khai này và chính chữ ký đó.

Hàm băm SHA256 của khóa chung OEM Root Key được ghi lại vĩnh viễn trong các cầu chì chipset (FPF), giống như cấu hình Intel BG. Nếu cấu hình Intel BG cung cấp khả năng tích hợp công nghệ này thì từ giờ trở đi chỉ chủ sở hữu phần riêng tư của Khóa gốc OEM mới có thể cập nhật BIOS trên hệ thống này (tức là có thể tính toán lại các bảng kê khai này), tức là. người bán.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel

Khi nhìn vào bức tranh, ngay lập tức nảy sinh nghi ngờ về sự cần thiết của một chuỗi xác minh dài như vậy - lẽ ra họ có thể sử dụng một bảng kê khai. Tại sao lại phức tạp hóa mọi thứ?

Trên thực tế, do đó Intel cung cấp cho nhà cung cấp cơ hội sử dụng các khóa IBB khác nhau cho các dòng sản phẩm khác nhau của mình và một khóa làm khóa gốc. Nếu phần riêng tư của khóa IBB (mà bản kê khai thứ hai được ký) bị rò rỉ thì sự cố sẽ chỉ ảnh hưởng đến một dòng sản phẩm và chỉ cho đến khi nhà cung cấp tạo một cặp mới và bao gồm các bản kê khai được tính toán lại trong bản cập nhật BIOS tiếp theo.

Nhưng nếu khóa gốc (mà bản kê khai đầu tiên được ký) bị xâm phạm thì sẽ không thể thay thế nó; không có quy trình thu hồi nào được cung cấp. hàm băm của phần công khai của khóa này được lập trình vào FPF một lần và mãi mãi.

Cấu hình bảo vệ khởi động Intel

Bây giờ chúng ta hãy xem xét kỹ hơn cấu hình Intel BG và quá trình tạo ra nó. Nếu bạn nhìn vào tab tương ứng trong GUI của tiện ích Flash Image Tool từ Bộ công cụ hệ thống Intel (STK), bạn sẽ nhận thấy rằng cấu hình Intel BG bao gồm hàm băm của phần công khai của khóa gốc của nhà cung cấp, một vài giá trị không rõ ràng, v.v. Hồ sơ Intel BG.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel

Cấu trúc của hồ sơ này:

typedef struct BG_PROFILE
{
	unsigned long Force_Boot_Guard_ACM : 1;
	unsigned long Verified_Boot : 1;
	unsigned long Measured_Boot : 1;
	unsigned long Protect_BIOS_Environment : 1;
	unsigned long Enforcement_Policy : 2; // 00b – do nothing
                                              // 01b – shutdown with timeout
                                              // 11b – immediate shutdown
	unsigned long : 26;
};

Nhìn chung, cấu hình Intel BG là một thực thể rất linh hoạt. Ví dụ: hãy xem xét cờ Force_Boot_Guard_ACM. Khi nó bị xóa, nếu không tìm thấy mô-đun ACM khởi động BG trên flash SPI thì sẽ không có hoạt động khởi động đáng tin cậy nào xảy ra. Cô ấy sẽ không được tin cậy.

Chúng tôi đã viết ở trên rằng chính sách thực thi cho chế độ VB có thể được định cấu hình để nếu có lỗi xác minh, quá trình tải xuống không đáng tin cậy sẽ xảy ra.

Hãy để những việc đó theo quyết định của nhà cung cấp...

Tiện ích GUI cung cấp các cấu hình “làm sẵn” sau:

số
chế độ
Описание

0
Không_FVME
Công nghệ Intel BG bị vô hiệu hóa

1
VE
Chế độ VB được bật, tắt máy theo thời gian chờ

2
VME
cả hai chế độ đều được bật (VB và MB), tắt máy theo thời gian chờ

3
VM
cả hai chế độ đều được bật mà không cần tắt hệ thống

4
FVE
Đã bật chế độ VB, tắt máy ngay lập tức

5
FVME
cả hai chế độ được kích hoạt, tắt máy ngay lập tức

Như đã đề cập, cấu hình Intel BG phải được nhà cung cấp hệ thống ghi một lần và mãi mãi vào cầu chì chipset (FPF) - một bộ lưu trữ thông tin phần cứng nhỏ (theo thông tin chưa được xác minh, chỉ 256 byte) bên trong chipset, có thể được lập trình bên ngoài các cơ sở sản xuất của Intel (đó chính xác là lý do tại sao trường có thể lập trình Cầu chì).

Nó rất tốt để lưu trữ cấu hình vì:

  • có khu vực được lập trình một lần để lưu trữ dữ liệu (chính xác là nơi ghi cấu hình Intel BG);
  • Chỉ Intel ME mới có thể đọc và lập trình nó.

Vì vậy, để thiết lập cấu hình cho công nghệ Intel BG trên một hệ thống cụ thể, nhà cung cấp thực hiện như sau trong quá trình sản xuất:

  1. Sử dụng tiện ích Flash Image Tool (từ Intel STK), nó tạo ra một hình ảnh chương trình cơ sở với cấu hình Intel BG nhất định dưới dạng các biến trong vùng Intel ME (được gọi là bản sao tạm thời cho FPF);
  2. Sử dụng tiện ích Công cụ lập trình Flash (từ Intel STK), nó ghi hình ảnh này vào bộ nhớ flash SPI của hệ thống và đóng cái gọi là. chế độ sản xuất (trong trường hợp này, lệnh tương ứng được gửi tới Intel ME).

Kết quả của các hoạt động này là Intel ME sẽ cam kết các giá trị được chỉ định từ máy nhân bản cho các FPF trong vùng ME thành các FPF, đặt độ phân giải trong bộ mô tả flash SPI thành các giá trị được Intel khuyến nghị (được mô tả ở phần đầu của bài viết) và thực hiện THIẾT LẬP lại hệ thống.

Phân tích việc triển khai Intel Boot Guard

Để phân tích việc triển khai công nghệ này bằng một ví dụ cụ thể, chúng tôi đã kiểm tra các hệ thống sau để tìm dấu vết của công nghệ Intel BG:

Hệ thống
Ghi

Gigabyte GA-H170-D3H
Skylake, có hỗ trợ

Gigabyte GA-Q170-D3H
Skylake, có hỗ trợ

Gigabyte GA-B150-HD3
Skylake, có hỗ trợ

MSI H170A Gaming Pro
Skylake, không hỗ trợ

LenovoThinkPad 460
Skylake, được hỗ trợ, kích hoạt công nghệ

Lenovo Yoga 2 Pro
Haswell, không có hỗ trợ

Lenovo U330p
Haswell, không có hỗ trợ

Khi nói “hỗ trợ”, chúng tôi muốn nói đến sự hiện diện của mô-đun ACM khởi động Intel BG, các bảng kê khai được đề cập ở trên và mã tương ứng trong BIOS, tức là. triển khai để phân tích.

Ví dụ: hãy lấy cái được tải xuống từ văn phòng. hình ảnh trang web của nhà cung cấp bộ nhớ flash SPI cho Gigabyte GA-H170-D3H (phiên bản F4).

ROM khởi động CPU Intel

Trước hết, hãy nói về hoạt động của bộ xử lý nếu công nghệ Intel BG được bật.

Không thể tìm thấy các mẫu vi mã được giải mã, vì vậy cách thực hiện các hành động được mô tả bên dưới (bằng vi mã hoặc phần cứng) là một câu hỏi mở. Tuy nhiên, có một thực tế là các bộ xử lý Intel hiện đại “có thể” thực hiện những hành động này.

Sau khi thoát khỏi trạng thái RESET, bộ xử lý (nội dung của bộ nhớ flash đã được ánh xạ vào không gian địa chỉ) sẽ tìm thấy bảng FIT (Bảng giao diện phần sụn). Rất dễ tìm, con trỏ tới nó được ghi ở địa chỉ FFFF FFC0h.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Trong ví dụ đang xem xét, giá trị FFD6 9500h được đặt tại địa chỉ này. Bằng cách truy cập địa chỉ này, bộ xử lý sẽ nhìn thấy bảng FIT, nội dung của bảng này được chia thành các bản ghi. Mục đầu tiên là tiêu đề của cấu trúc sau:

typedef struct FIT_HEADER
{
	char           Tag[8];     // ‘_FIT_   ’
	unsigned long  NumEntries; // including FIT header entry
	unsigned short Version;    // 1.0
	unsigned char  EntryType;  // 0
	unsigned char  Checksum;
};

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Vì một số lý do không xác định, tổng kiểm tra không phải lúc nào cũng được tính trong các bảng này (trường được để lại bằng XNUMX).

Các mục còn lại trỏ đến các tệp nhị phân khác nhau cần được phân tích/thực thi trước khi BIOS được thực thi, tức là. trước khi chuyển sang vectơ RESET kế thừa (FFFF FFF0h). Cấu trúc của mỗi mục như sau:

typedef struct FIT_ENTRY
{
	unsigned long  BaseAddress;
	unsigned long  : 32;
	unsigned long  Size;
	unsigned short Version;     // 1.0
	unsigned char  EntryType;
	unsigned char  Checksum;
};

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Trường EntryType cho bạn biết loại khối mà mục nhập này trỏ đến. Chúng tôi biết một số loại:

enum FIT_ENTRY_TYPES
{
	FIT_HEADER = 0,
	MICROCODE_UPDATE,
	BG_ACM,
	BIOS_INIT = 7,
	TPM_POLICY,
	BIOS_POLICY,
	TXT_POLICY,
	BG_KEYM,
	BG_IBBM
};

Bây giờ rõ ràng là một trong các mục trỏ đến vị trí của tệp nhị phân ACM khởi động Intel BG. Cấu trúc tiêu đề của tệp nhị phân này là điển hình cho các mô-đun mã do Intel phát triển (ACM, cập nhật vi mã, phần mã Intel ME, ...).

typedef struct BG_ACM_HEADER
{
	unsigned short ModuleType;     // 2
	unsigned short ModuleSubType;  // 3
	unsigned long  HeaderLength;   // in dwords
	unsigned long  : 32;
	unsigned long  : 32;
	unsigned long  ModuleVendor;   // 8086h
	unsigned long  Date;           // in BCD format
	unsigned long  TotalSize;      // in dwords
	unsigned long  unknown1[6];
	unsigned long  EntryPoint;
	unsigned long  unknown2[16];
	unsigned long  RsaKeySize;     // in dwords
	unsigned long  ScratchSize;    // in dwords
	unsigned char  RsaPubMod[256];
	unsigned long  RsaPubExp;
	unsigned char  RsaSig[256];
};

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Bộ xử lý tải tệp nhị phân này vào bộ đệm của nó, xác minh và chạy nó.

ACM khởi nghiệp Intel BG

Qua phân tích hoạt động của ACM này, có thể thấy rõ rằng nó thực hiện những việc sau:

  • nhận cấu hình Intel BG từ Intel ME, được ghi vào cầu chì chipset (FPF);
  • tìm thấy các bảng kê khai KEYM và IBBM và xác minh chúng.

Để tìm những bảng kê khai này, ACM cũng sử dụng bảng FIT, bảng này có hai loại mục nhập để biểu thị dữ liệu cấu trúc (xem FIT_ENTRY_TYPES ở trên).

Chúng ta hãy xem xét kỹ hơn các bản tuyên ngôn. Trong cấu trúc của tệp kê khai đầu tiên, chúng tôi thấy một số hằng số khó hiểu, hàm băm của khóa chung từ tệp kê khai thứ hai và Khóa gốc OEM công khai được ký dưới dạng cấu trúc lồng nhau:

typedef struct KEY_MANIFEST
{
	char           Tag[8];          // ‘__KEYM__’
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 0
	unsigned char  : 8;             // 1
	unsigned short : 16;            // 0Bh
	unsigned short : 16;            // 20h == hash size?
	unsigned char  IbbmKeyHash[32]; // SHA256 of an IBBM public key
	BG_RSA_ENTRY   OemRootKey;
};

typedef struct BG_RSA_ENTRY
{
	unsigned char  : 8;             // 10h
	unsigned short : 16;            // 1
	unsigned char  : 8;             // 10h
	unsigned short RsaPubKeySize;   // 800h
	unsigned long  RsaPubExp;
	unsigned char  RsaPubKey[256];
	unsigned short : 16;            // 14
	unsigned char  : 8;             // 10h
	unsigned short RsaSigSize;      // 800h
	unsigned short : 16;            // 0Bh
	unsigned char  RsaSig[256];
};

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Để xác minh khóa công khai OEM Root Key, chúng tôi nhớ rằng chúng tôi sử dụng hàm băm SHA256 của cầu chì, tại thời điểm này đã được nhận từ Intel ME.

Hãy chuyển sang bản tuyên ngôn thứ hai. Nó bao gồm ba cấu trúc:

typedef struct IBB_MANIFEST
{
	ACBP Acbp;         // Boot policies
	IBBS Ibbs;         // IBB description
	IBB_DESCRIPTORS[];
	PMSG Pmsg;         // IBBM signature
};

Cái đầu tiên chứa một số hằng số:

typedef struct ACBP
{
	char           Tag[8];          // ‘__ACBP__’
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 1
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 0
	unsigned short : 16;            // x & F0h = 0
	unsigned short : 16;            // 0 < x <= 400h
};

Phần thứ hai chứa hàm băm SHA256 của IBB và số lượng bộ mô tả mô tả nội dung của IBB (tức là hàm băm được tính từ đâu):

typedef struct IBBS
{
	char           Tag[8];            // ‘__IBBS__’
	unsigned char  : 8;               // 10h
	unsigned char  : 8;               // 0
	unsigned char  : 8;               // 0
	unsigned char  : 8;               // x <= 0Fh
	unsigned long  : 32;              // x & FFFFFFF8h = 0
	unsigned long  Unknown[20];
	unsigned short : 16;              // 0Bh
	unsigned short : 16;              // 20h == hash size ?
	unsigned char  IbbHash[32];       // SHA256 of an IBB
	unsigned char  NumIbbDescriptors;
};

Các bộ mô tả IBB lần lượt tuân theo cấu trúc này. Nội dung của chúng có định dạng sau:

typedef struct IBB_DESCRIPTOR
{
	unsigned long  : 32;
	unsigned long  BaseAddress;
	unsigned long  Size;
};

Thật đơn giản: mỗi bộ mô tả chứa địa chỉ/kích thước của đoạn IBB. Do đó, phép nối các khối được chỉ ra bởi các bộ mô tả này (theo thứ tự của chính các bộ mô tả) là IBB. Và, theo quy định, IBB là tập hợp tất cả các mô-đun của giai đoạn SEC và PEI.

Tệp kê khai thứ hai được hoàn thành bằng cấu trúc chứa khóa chung IBB (được xác minh bằng hàm băm SHA256 từ tệp kê khai đầu tiên) và chữ ký của tệp kê khai này:

typedef struct PMSG
{
	char           Tag[8];            // ‘__PMSG__’
	unsigned char  : 8;               // 10h
	BG_RSA_ENTRY   IbbKey;
};

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Vì vậy, ngay cả trước khi UEFI BIOS bắt đầu thực thi, bộ xử lý sẽ khởi chạy ACM, ACM sẽ xác minh tính xác thực của nội dung của các phần bằng mã pha SEC và PEI. Tiếp theo, bộ xử lý thoát khỏi ACM, đi theo vectơ RESET và bắt đầu thực thi BIOS.

Phân vùng PEI đã được xác minh phải chứa một mô-đun sẽ kiểm tra phần còn lại của BIOS (mã DXE). Mô-đun này hiện đang được phát triển bởi IBV (Nhà cung cấp BIOS độc lập) hoặc chính nhà cung cấp hệ thống. Bởi vì Chúng tôi chỉ sử dụng hệ thống Lenovo và Gigabyte và có hỗ trợ Intel BG; hãy xem mã được trích xuất từ ​​các hệ thống này.

Mô-đun BIOS UEFI LenovoĐã xác minhBootPei

Trong trường hợp của Lenovo, hóa ra đó là mô-đun Lenovo VerifyBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, do Lenovo phát triển.

Công việc của nó là tra cứu (bằng GUID) bảng băm cho DXE và xác minh DXE.

if (EFI_PEI_SERVICES->GetBootMode() != BOOT_ON_S3_RESUME)
{
	if (!FindHashTable())
		return EFI_NOT_FOUND;
	if (!VerifyDxe())
		return EFI_SECURITY_VIOLATION;
}

Хеш таблица {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} имеет следующий формат:

typedef struct HASH_TABLE
{
	char          Tag[8];            // ‘$HASHTBL’
	unsigned long NumDxeDescriptors;
	DXE_DESCRIPTORS[];
};

typedef struct DXE_DESCRIPTOR
{
	unsigned char BlockHash[32];     // SHA256
	unsigned long Offset;
	unsigned long Size;
};

Mô-đun BIOS UEFI BootGuardPei

Trong trường hợp của Gigabyte, hóa ra đó là mô-đun BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, do AMI phát triển, do đó, có mặt trong bất kỳ BIOS AMI nào có hỗ trợ Intel BG.

Thuật toán hoạt động của nó hơi khác một chút, tuy nhiên, nó có chung một điểm:

int bootMode = EFI_PEI_SERVICES->GetBootMode();

if (bootMode != BOOT_ON_S3_RESUME &&
    bootMode != BOOT_ON_FLASH_UPDATE &&
    bootMode != BOOT_IN_RECOVERY_MODE)
{
	HOB* h = CreateHob();
	if (!FindHashTable())
		return EFI_NOT_FOUND;
	WriteHob(&h, VerifyDxe());
	return h;
}

Bảng băm {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} mà nó đang tìm kiếm có định dạng sau:

typedef HASH_TABLE DXE_DESCRIPTORS[];

typedef struct DXE_DESCRIPTOR
{
	unsigned char BlockHash[32];     // SHA256
	unsigned long BaseAddress;
	unsigned long Size;
};

Bảo vệ khởi động Intel 2.x

Hãy nói ngắn gọn về một triển khai khác của Intel Boot Guard, được tìm thấy trong một hệ thống mới hơn dựa trên Intel SoC với vi kiến ​​trúc Apollo Lake - ASRock J4205-IT.

Mặc dù phiên bản này sẽ chỉ được sử dụng trong SoC (các hệ thống mới có vi kiến ​​trúc bộ xử lý Kaby Lake tiếp tục sử dụng Intel Boot Guard 1.x), việc nghiên cứu tùy chọn kiến ​​trúc mới cho nền tảng Intel SoC rất đáng quan tâm, vốn đã có những thay đổi đáng kể, ví dụ:

  • các vùng BIOS và Intel ME (hay đúng hơn là Intel TXE, theo thuật ngữ dành cho Intel SoC) hiện là một vùng IFWI;
  • mặc dù Intel BG đã được kích hoạt trên nền tảng nhưng các cấu trúc như FIT, KEYM, IBBM không được tìm thấy trong bộ nhớ flash;
  • Ngoài lõi TXE và ISH (x86), lõi thứ ba đã được thêm vào chipset (nhân tiện, lại là ARC) - PMC (Bộ điều khiển quản lý nguồn), liên quan đến việc đảm bảo khả năng hoạt động của hệ thống con nguồn và giám sát hiệu suất.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Nội dung của vùng IFWI mới là tập hợp các mô-đun sau:

Thiên kiến
tên
Описание

0000 2000 giờ
SMIP
một cấu hình nền tảng nhất định, được ký bởi nhà cung cấp

0000 6000 giờ
RBEP
Phần mã chương trình cơ sở Intel TXE, x86, đã ký Intel

0001 0000 giờ
PMCP
Phần mã chương trình cơ sở Intel PMC, ARC, đã ký Intel

0002 0000 giờ
FTPR
Phần mã chương trình cơ sở Intel TXE, x86, đã ký Intel

0007 B000h
UCOD
cập nhật vi mã cho CPU, có chữ ký của Intel

0008 0000 giờ
IBBP
UEFI BIOS, giai đoạn SEC/PEI, x86, được ký bởi nhà cung cấp

0021 8000 giờ
ISHC
Phần mã chương trình cơ sở Intel ISH, x86, có chữ ký của nhà cung cấp

0025 8000 giờ
NFTP
Phần mã chương trình cơ sở Intel TXE, x86, đã ký Intel

0036 1000 giờ
IUNP
không biết

0038 1000 giờ
OBBP
UEFI BIOS, pha DXE, x86, không dấu

Trong quá trình phân tích phần sụn TXE, rõ ràng là sau khi THIẾT LẬP LẠI, TXE giữ bộ xử lý ở trạng thái này cho đến khi nó chuẩn bị các nội dung cơ bản của không gian địa chỉ cho CPU (FIT, ACM, vectơ RESET ...). Hơn nữa, TXE đặt dữ liệu này vào SRAM của nó, sau đó nó tạm thời cấp cho bộ xử lý quyền truy cập vào đó và “giải phóng” nó khỏi RESET.

Đề phòng chống rootkit

Thôi bây giờ chúng ta chuyển sang chủ đề “nóng” nhé. Chúng tôi từng phát hiện ra rằng trên nhiều hệ thống, bộ mô tả flash SPI chứa quyền truy cập vào các vùng của bộ nhớ flash SPI để tất cả người dùng bộ nhớ này có thể ghi và đọc bất kỳ vùng nào. Những thứ kia. không đời nào.

Sau khi kiểm tra bằng tiện ích MEinfo (của Intel STK), chúng tôi thấy rằng chế độ sản xuất trên các hệ thống này không bị đóng, do đó, các cầu chì chipset (FPF) vẫn ở trạng thái không xác định. Có, Intel BG không bật cũng không tắt trong những trường hợp như vậy.

Chúng ta đang nói về các hệ thống sau (liên quan đến Intel BG và những gì sẽ được mô tả ở phần sau của bài viết, chúng ta sẽ nói về các hệ thống có vi kiến ​​trúc bộ xử lý Haswell trở lên):

  • tất cả các sản phẩm Gigabyte;
  • tất cả các sản phẩm MSI;
  • 21 mẫu máy tính xách tay Lenovo và 4 mẫu máy chủ Lenovo.

Tất nhiên, chúng tôi đã báo cáo phát hiện này cho các nhà cung cấp này cũng như cho Intel.

Một phản ứng thích hợp chỉ đến từ Lenovongười đã nhận ra vấn đề và đã phát hành một bản vá.

Gigabyte Họ dường như chấp nhận thông tin về lỗ hổng nhưng không bình luận dưới bất kỳ hình thức nào.

Giao tiếp với MSI hoàn toàn bị đình trệ trong yêu cầu gửi khóa PGP công khai của chúng tôi (để gửi cho họ lời khuyên bảo mật ở dạng được mã hóa). Họ tuyên bố rằng họ "là nhà sản xuất phần cứng và không sản xuất khóa PGP."

Nhưng hãy đi vào vấn đề. Vì cầu chì được để ở trạng thái không xác định nên người dùng (hoặc kẻ tấn công) có thể lập trình chúng một cách độc lập (điều khó khăn nhất là tìm Intel STK). Để làm điều này, bạn cần phải hoàn thành các bước sau.

1. Khởi động vào HĐH Windows (nói chung, các hành động được mô tả bên dưới cũng có thể được thực hiện trong Linux, nếu bạn phát triển một phiên bản tương tự của Intel STK cho HĐH mong muốn). Sử dụng tiện ích MEinfo, đảm bảo rằng cầu chì không được lập trình trên hệ thống này.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
2. Đọc nội dung của bộ nhớ flash bằng Công cụ lập trình Flash.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
3. Mở hình ảnh đã đọc bằng bất kỳ công cụ chỉnh sửa BIOS UEFI nào, thực hiện các thay đổi cần thiết (ví dụ: giới thiệu rootkit), tạo/chỉnh sửa cấu trúc KEYM và IBBM hiện có trong vùng ME.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Hình ảnh nêu bật phần công khai của khóa RSA, hàm băm của khóa này sẽ được lập trình vào các cầu chì chipset cùng với phần còn lại của cấu hình Intel BG.

4. Sử dụng Công cụ hình ảnh Flash, xây dựng hình ảnh chương trình cơ sở mới (bằng cách đặt cấu hình Intel BG).

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
5. Viết hình ảnh mới vào bộ nhớ flash bằng Công cụ lập trình Flash và xác minh bằng MEinfo rằng vùng ME hiện chứa cấu hình Intel BG.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
6. Sử dụng Công cụ lập trình Flash để đóng chế độ sản xuất.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
7. Hệ thống sẽ khởi động lại, sau đó bạn có thể sử dụng MEinfo để xác minh rằng các FPF hiện đã được lập trình.

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Những hành động này mãi mãi kích hoạt Intel BG trên hệ thống này. Hành động không thể hoàn tác được, có nghĩa là:

  • Chỉ chủ sở hữu phần riêng tư của khóa gốc (tức là người đã kích hoạt Intel BG) mới có thể cập nhật BIOS UEFI trên hệ thống này;
  • nếu bạn trả lại phần sụn gốc cho hệ thống này, chẳng hạn như sử dụng lập trình viên, nó thậm chí sẽ không bật (hậu quả của chính sách thực thi trong trường hợp có lỗi xác minh);
  • để loại bỏ BIOS UEFI như vậy, bạn cần thay thế chipset có FPF được lập trình bằng một chipset “sạch” (tức là hàn lại chipset nếu bạn có quyền truy cập vào trạm hàn hồng ngoại giá một chiếc ô tô hoặc đơn giản là thay thế bo mạch chủ ).

Để hiểu những gì một rootkit như vậy có thể làm, bạn cần đánh giá xem điều gì có thể thực thi mã của bạn trong môi trường UEFI BIOS. Giả sử, ở chế độ bộ xử lý đặc quyền nhất - SMM. Một rootkit như vậy có thể có các đặc tính sau:

  • được thực thi song song với HĐH (bạn có thể định cấu hình xử lý để tạo ngắt SMI, ngắt này sẽ được kích hoạt bởi bộ hẹn giờ);
  • có tất cả các lợi thế khi ở chế độ SMM (toàn quyền truy cập vào nội dung của RAM và tài nguyên phần cứng, tính bảo mật khỏi HĐH);
  • Mã chương trình của rootkit có thể được mã hóa và giải mã khi khởi chạy ở chế độ SMM. Mọi dữ liệu chỉ có ở chế độ SMM đều có thể được sử dụng làm khóa mã hóa. Ví dụ: hàm băm từ một tập hợp địa chỉ trong SMRAM. Để lấy được key này bạn cần phải vào SMM. Và điều này có thể được thực hiện theo hai cách. Tìm RCE trong mã SMM và khai thác nó hoặc thêm mô-đun SMM của riêng bạn vào BIOS, điều này là không thể vì chúng tôi đã bật Boot Guard.

Do đó, lỗ hổng này cho phép kẻ tấn công:

  • tạo một rootkit ẩn, không thể xóa được với mục đích không xác định trong hệ thống;
  • thực thi mã của bạn trên một trong các lõi chipset bên trong Intel SoC, cụ thể là trên Intel ISH (hãy xem kỹ hình ảnh).

Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Bản tải xuống đáng tin cậy của Schrödinger. Bộ bảo vệ khởi động Intel
Mặc dù khả năng của hệ thống con Intel ISH chưa được khám phá nhưng nó dường như là một phương tiện tấn công thú vị dành cho Intel ME.

Những phát hiện

  1. Nghiên cứu đã giúp có được mô tả kỹ thuật về hoạt động của công nghệ Intel Boot Guard. Trừ một số bí mật về bảo mật của Intel thông qua mô hình tối nghĩa.
  2. Một kịch bản tấn công được trình bày cho phép bạn tạo một rootkit có thể gỡ cài đặt trong hệ thống.
  3. Chúng tôi thấy rằng bộ xử lý Intel hiện đại có khả năng thực thi nhiều mã độc quyền ngay cả trước khi BIOS bắt đầu chạy.
  4. Các nền tảng có kiến ​​trúc Intel 64 ngày càng trở nên ít phù hợp hơn để chạy phần mềm miễn phí: xác minh phần cứng, ngày càng có nhiều công nghệ độc quyền và hệ thống con (ba lõi trong chipset SoC: x86 ME, x86 ISH và ARC PMC).

Giảm nhẹ

Các nhà cung cấp cố tình để chế độ sản xuất mở phải đảm bảo đóng chế độ này. Cho đến nay, họ chỉ nhắm mắt và hệ thống Kaby Lake mới cho thấy điều này.

Người dùng có thể vô hiệu hóa Intel BG trên hệ thống của họ (dễ bị tổn thương được mô tả) bằng cách chạy Công cụ lập trình Flash với tham số -closemnf. Trước tiên, bạn nên đảm bảo (sử dụng MEinfo) rằng cấu hình Intel BG trong vùng ME cung cấp khả năng tắt công nghệ này sau khi lập trình trong FPF.

Nguồn: www.habr.com

Thêm một lời nhận xét