SMM Communication là gì?

Giải thích SMM Communication: kênh request vào SMM, CommBuffer, validation, nested pointer và checklist security.

Cập nhật 5 phút đọc
Đọc bằng Tiếng Việt English 日本語
Security / SMM / Memory / Firmware Image Terms cover

SMM Communication là cơ chế để code ngoài SMM gửi một request có cấu trúc vào SMM. Nó thường dùng khi một command byte kiểu SW SMI không đủ, ví dụ cần truyền header, command ID, payload, size và status trả về.

Mental model: SMM Communication là mailbox giữa firmware component và SMM handler. Mailbox này phải nằm ngoài SMRAM/MMRAM, nhưng mọi nội dung bên trong vẫn phải được xem là không đáng tin cho đến khi handler validate xong.

Luồng cơ bản

01 Caller

Prepare CommBuffer

DXE driver hoặc firmware component chuẩn bị buffer nằm ngoài SMRAM/MMRAM.

02 Protocol

Communicate()

Caller gọi SMM Communication Protocol hoặc cơ chế platform tương đương.

03 SMI

Enter SMM

Firmware trigger SMI để chuyển request vào SMM environment.

04 Validate

Validate buffer

Handler kiểm tra address, size, command, version và nested pointer.

05 Return

Write status

Handler xử lý request và ghi status trả về CommBuffer.

SMM Communication đưa request có cấu trúc vào SMM, nhưng handler phải validate toàn bộ buffer trước khi dùng.

Sau khi OS đã chạy, OS thường không gọi trực tiếp SMM Communication Protocol như DXE driver. Với các path như SetVariable(), OS gọi UEFI Runtime Services, rồi implementation bên dưới có thể chuyển request vào SMM variable handler tùy platform.

Layout CommBuffer thường gặp

Mục Giá trị Ghi chú
HeaderGuid Xác định message type Giúp SMM dispatch tới handler đúng hoặc xác định protocol message.
MessageLength Kích thước payload Phải đối chiếu với CommBufferSize thật, không được tin header một cách mù quáng.
Command Request ID Ví dụ ReadConfig, WriteConfig, FlashService, GetStatus tùy platform.
Version Format version Giúp handler reject request cũ hoặc layout không tương thích.
Payload Dữ liệu request Có thể chứa nested pointer, offset hoặc length cần validate riêng.
Status Kết quả trả về EFI_SUCCESS, EFI_ACCESS_DENIED, EFI_SECURITY_VIOLATION, EFI_INVALID_PARAMETER.

Pitfall lớn nhất: chỉ validate buffer ngoài cùng

Một lỗi nguy hiểm là chỉ kiểm tra CommBuffer nằm ngoài SMRAM, nhưng bên trong payload lại có pointer khác trỏ vào SMRAM hoặc vùng nhạy cảm.

// Sai về mặt tư duy nếu Payload->UserPointer chưa được validate riêng.
CopyMem (PrivateData, Payload->UserPointer, Payload->Length);

Với SMM communication, mọi pointer và mọi size đến từ outside SMM đều phải bị nghi ngờ. Buffer ngoài cùng đúng chưa đủ. Nested pointer, offset, length, count và phép cộng size đều phải kiểm tra lại.

Failure pattern hay gặp

Mục Giá trị Ghi chú
EFI_SECURITY_VIOLATION Buffer không hợp lệ CommBuffer nằm trong MMRAM/SMRAM, overlap vùng cấm hoặc nested pointer không an toàn.
EFI_INVALID_PARAMETER Header/size sai MessageLength không khớp CommBufferSize, command format sai hoặc version không support.
Handler không chạy Dispatch sai HeaderGuid/command không khớp handler, protocol chưa register, SMI trigger không xảy ra.
System reset Exception trong SMM Thường do dereference pointer chưa validate hoặc copy quá size.
Chỉ fail sau lock Policy block Command bị cấm sau EndOfDxe hoặc SmmReadyToLock.

Debug Diary: request vào SMM nhưng không có log handler

Một case dễ nhầm: caller log rằng đã gọi Communicate(), nhưng trong serial log không thấy handler SMM in ra gì. Đừng kết luận ngay rằng handler code sai.

Hãy tách thành ba câu hỏi:

01 Caller

Communicate có return không?

Status trả về là success, timeout hay invalid parameter?

02 Dispatch

Message có match handler không?

HeaderGuid, command ID và registration có đúng không?

03 SMM

Handler có log được không?

DebugLib instance trong SMM có support serial output không?

04 Policy

Có bị block sau lock không?

Một số command bị reject sau SmmReadyToLock hoặc EndOfDxe.

Khi Communicate không thấy handler, debug theo đường caller, dispatch và log visibility.

Nếu caller nhận status lỗi trước khi handler chạy, vấn đề có thể nằm ở validation lớp communication. Nếu handler chạy nhưng không có log, vấn đề có thể là DebugLib hoặc log level trong SMM driver.

Checklist security cho CommBuffer

SMM Communication security checklist

Câu hỏi tự kiểm tra

Tự kiểm tra sau khi đọc note này

Blog seeds

  • SMM Communication Explained: mailbox nguy hiểm nhất trong firmware
  • CommBuffer Validation: vì sao validate buffer ngoài cùng chưa đủ?
  • Debug SetVariable path: từ Runtime Services tới SMM Communication

Bài liên quan

Nguồn tham khảo public

Thấy nội dung này hữu ích?

Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.

Nội dung liên quan

Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.