UEFI 스터디 3차 - 프로토콜 취약점 예시

1 minute read

Published:

취약점이 발견되었던 프로토콜 예시이다. 지난 주에 서웅이가 진행한 부분의 이슈를 좀더 로우한 프로토콜 측면에서 바라본다.
SMM, 취약점

EFI_SMM_COMMUNICATION_PROTOCOL

출처 및 참고 자료: Intel White Paper: A Tour Beyond BIOS: Secure SMM Communication in the EFI Developer Kit II (Jiewen Yao, Vincent Zimmer)

과거 백서 내용을 참고한 것으로 현재는 UEFI PI spec에서 EFI_MM_COMMUNICATION_PROTOCOL으로 찾아볼 수 있다.

용도

-> SMM 내부의 SMM 인터럽트 핸들러에 SMM 외부의 드라이버가 접근하는 수단.

pic1

구성함수
Communicate -> 등록된 핸들러와 communicate한다.
인수(처음 this 제외) : CommBuffer 구조체 주소, CommBuffer size(optional)

pic2

사용 예시 edk2 참조구현의 SMM 접근

pic3

SMM 에이전트 드라이버가 초기화할때 VariableServiceInitialize() 함수의 핸들을 등록해둠 DXE 단계에서 이를 사용하고픈 드라이버가 이를 활용해 commbuffer를 초기화함 SendCommunicateBuffer()를 호출 -> 내부의 EFI_SMM_COMMUNICATION_PROTOCOL.communicate가 호출.

취약점: CommBuffer 공격

잘못된 commbuffer 주소 (SMRAM 내부)를 데이터로 넘김 -> SMI 핸들러 선에서 컷 실패 -> SMRAM 오염 OR SMRAM 내부 데이터 유출

pic4

VMM(= OS 하이퍼바이저)의 주소를 데이터로 넘김 -> SMM 이 더 낮은 링 레벨이므로 VMM을 해킹하는 또다른 경로 (이 경우에는 포멧해도 소용없음)

pic5

만약 프로젝트에서 활용한다면

해당 백서는 2016년 작성. 그리고 SMM 권한탈취의 주요 루트이므로 spec 차원의 강화 및 검사용 툴들이 나왔다고 함. 실제 활용 시 이미 해결된 문제는 제하고 보완하자.