SMM Communication là gì?
Giải thích SMM Communication: kênh request vào SMM, CommBuffer, validation, nested pointer và checklist security.
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
Prepare CommBuffer
DXE driver hoặc firmware component chuẩn bị buffer nằm ngoài SMRAM/MMRAM.
Communicate()
Caller gọi SMM Communication Protocol hoặc cơ chế platform tương đương.
Enter SMM
Firmware trigger SMI để chuyển request vào SMM environment.
Validate buffer
Handler kiểm tra address, size, command, version và nested pointer.
Write status
Handler xử lý request và ghi status trả về CommBuffer.
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:
Communicate có return không?
Status trả về là success, timeout hay invalid parameter?
Message có match handler không?
HeaderGuid, command ID và registration có đúng không?
Handler có log được không?
DebugLib instance trong SMM có support serial output không?
Có bị block sau lock không?
Một số command bị reject sau SmmReadyToLock hoặc EndOfDxe.
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
- SMM Architecture Overview
- SMRAM là gì?
- MMRAM là gì?
- SW SMI là gì?
- SMM Handler là gì?
- SmmReadyToLock là gì?
- NVRAM là gì?
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.
SMM Handler là gì?
Giải thích SMM handler: code xử lý SMI source, validate input, policy check và failure pattern khi debug.
SMM Vulnerability là gì?
Giải thích SMM vulnerability: CommBuffer lỗi, nested pointer, SMRAM exposure, lock timing và checklist review.
EndOfDxe là gì?
Giải thích EndOfDxe như mốc chốt DXE: policy bắt đầu lock, SMM/security ổn định trước BDS và OS.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.