방망이
망구입니다
« 2026/07 »
| 일 |
월 |
화 |
수 |
목 |
금 |
토 |
| |
|
|
1 |
2 |
3 |
4 |
| 5 |
6 |
7 |
8 |
9 |
10 |
11 |
| 12 |
13 |
14 |
15 |
16 |
17 |
18 |
| 19 |
20 |
21 |
22 |
23 |
24 |
25 |
| 26 |
27 |
28 |
29 |
30 |
31 |
|
관리 메뉴
방망이
[프로젝트]UEFI DXE 바이너리 취약점 분석기 2주차 - DEPEX/DXE Dispatcher 본문
2026_졸업프로젝트
[프로젝트]UEFI DXE 바이너리 취약점 분석기 2주차 - DEPEX/DXE Dispatcher
망구입니다
2026. 2. 26. 14:56
DEPEX (Dependency Expression)
- 소스 레벨(.inf)에서는 [DEPEX] 섹션에 명시되며, 빌드 과정을 통해 바이너리 형태의 논리 수식(opcode)으로 변환되어 최종 드라이버 이미지(.efi) 내부의 EFI_SECTION_DXE_DEPEX라는 별도의 섹션에 바이너리 데이터로 저장됨.
- 드라이버가 실행되기 위해 "내 앞에 누가 먼저 와야 하는가?"를 정의하는 역할.
- DEPEX는 Boolean 로직으로 존재함. (Reverse Polish Notation을 주로 사용)
- Reverse Polish Notation
- 우리 사용하는 연산자가 피연산자 중간에 있는 중위 표기법이 아닌, 연산자가 피연산자 뒤에 오는 후위 표기법.
- 즉, 'A+B' 형태가 아닌 'AB+'의 형태로 사용되는 것.
- 'Protocol A와 Protocol B가 설치되어 있어야 한다.'를 DEPEX에 작성할 때 'ProtocolA ProtocolB AND'로 작성됨.
- 만약 DEPEX가 없거나, 단순히 TRUE라면 의존성이 없다는 뜻이므로 Dispatcher가 발견하자마자 즉시 실행됨.
- 명령어
- 논리 연산 : AND, OR, NOT
- 상수 : TRUE, FALSE
- 스택 조작 : PUSH <GUID>
- 특정 프로토콜이 존재하는지 확인하여 결과를 스택에 넣음
- 순서 제어
- BEFORE <GUID> : 지정된 드라이버보다 먼저 실행.
- AFTER <GUID> : 지정된 드라이버보다 나중에 실행.
- 기타
- SOR : Schedule On Request의 약자로, 조건이 만족되더라도 명시적으로 실행하라는 요청을 받기 전까지는 대기 상태로 머무름.
- END : 표현식의 끝.
DXE Dispatcher
- DXECore라는 핵심 모듈 안에 들어있는 기능
- 펌웨어 볼륨(FV)을 검사하고, 그 안에 있는 DXE 드라이버를 찾아 메모리에 로드하고 실행(드라이버의 실행 순서를 결정함).
- 알고리즘
- 로드되지 않은 드라이버를 스캔
- 각 드라이버의 DEPEX 확인
- 현재 시스템에 이미 설치된 Protocol들과 비교
- 조건이 TRUE가 된 드라이버를 로드하고 실행 (Entry Point 호출)
- 실행된 드라이버가 새로운 Protocol을 설치하면 다시 1번으로 돌아가 재검사
- 예시
- 위 예시('ProtocolA ProtocalB AND')와 같은 DEPEX가 있을 때
- DXE Dispatcher는 ProtocolA가 설치되었는지 확인하고 TRUE/FALSE를 스택에 PUSH
- ProtocolB가 설치 되었는지 확인하고 TRUE/FALSE를 스택에 PUSH
- AND를 만나 스택에서 두 개를 꺼내어 AND 연산
- 결과가 TRUE라면 드라이버 실행
- 핵심 기능
- 고정 실행 순서 지원
- 무조건 가장 먼저 실행되어야 하는 드라이버 처리.
- 이는 'A Priori File'이라는 특수 파일에 정의됨.
- A Priori File이라는 특수 파일을 찾기 위해 파일에 'EFI_APRIORI_GUID'라는 GUID(이름표)를 붙임.
- 의존성 기반 실행 순서 결정
- 고정 순서가 아닌 나머지 드라이버들은 DEPEX를 해석하여 실행 시점 결정.
- 긴급 패치 지원
- 특정 드라이버 바로 앞이나 바로 뒤에 실행되도록 지정된 패치 드라이버를 처리할 수 있어야 함.
- 보안 정책 지원
- 펌웨어 볼륨(FV)를 발견하거나 드라이버를 로드할 때마다 Security Architectural Protocol을 호출하여 검증 절차를 거침.
- DXE Dispatcher 상태
- Discovered(검색됨) : FV 안에서 드라이버 파일이 발견된 상태.
- Dependent(종속) : DEPEX 조건을 만족하지 못해 대기 중인 상태.
- Scheduled(스케줄됨) : 조건을 만족하여 실행 대기열(Queue)에 올라간 상태.
- Initializing(초기화 중) : StartImage()가 호출되어 드라이버의 진입점(Entry Point) 코드가 실행 중인 상태.
- Initialized(초기화 완료) : 드라이버가 성공적으로 실행을 마치고, 자신이 만든 프로토콜을 시스템에 등록한 상태
- 드라이버 하나가 'Initialized'되면 Dispatcher는 다시 Dependent 상태인 다른 드라이버들을 검사함. (방금 실행된 드라이버 덕분에 조건이 풀린 드라이버가 있는지 확인하기 위해)
- 흐름도
- FV 발견
- Security 검증
- A Priori File 탐색
- 존재하면 목록에 있는 드라이버 모두 강제 실행
- 남은 드라이버 DEPEX 확인
- 조건 만족 → LoadImage()가 호출되어 메모리에 올리고, StartImage()가 호출되어 실행 → 새로운 프로토콜 생성 → 다시 5번으로 돌아가 대기 중이던 드라이버들 재검사
- 조건 불만족 → 대기(Dependent)
- 더 이상 실행할 드라이버가 없으면 BDS(부트 매니저)로 제어권 이양.
관련 취약점
- 무한 루프
- 드라이버 A는 B를 기다리고, 드라이버 B는 A를 기다리게 조작하여 Dispatcher가 영원히 끝나지 않는 대기 상태에 빠지게 함.
- DoS (Infinite Loop & Denial of Service)
- DEPEX는 스택을 사용해 계산. 악성 드라이버가 무한히 PUSH만 하고 POP은 안 하는 등 기형적인 DEPEX를 가지고 있다면, 스택 버퍼 오버플로우가 발생함.
- 사례
- CVE-2021-39301
- HP 컴퓨터 제품의 UEFI 펌웨어(BIOS)에서 발견된 고위험군 스택 버퍼 오버플로우(Stack Buffer Overflow) 취약점.
- 특정 HP 기기에서 권한 상승 및 임의 코드 실행을 가능하게 하여 보안에 심각한 위협을 초래.
- 영향: 로컬 공격자가 시스템 관리자 권한을 넘어 펌웨어 레벨의 권한 상승 및 임의 코드 실행이 가능함.(보안 부팅 무력화 가능성)
- 원인: UEFI의 DXE 단계에서 드라이버가 외부 데이터를 처리할 때, 입력값의 길이를 제대로 검증하지 않아 부적절한 입력 검증(Improper Input Validation) 발생.
- 공격 원리 : 할당된 스택 버퍼보다 큰 데이터를 입력하여 Return Address를 덮어씀. 함수 종료 시 CPU가 정상적인 복귀 지점이 아닌, 공격자가 주입한 악성 코드(Shellcode)로 점프하여 실행하게 됨.
- TOCTOU (Time of Check To Time of Use)
- 검사 시점과 사용 시점의 사이에 발생할 수 있는 취약점
- 원리
- Dispatcher가 드라이버의 서명을 검사하고 안전하다고 판단.
- 메모리에 로드하고 실행하기 직전의 Race condition 발생.
- 공격자가 그 틈을 타 원본 드라이버를 악성 코드로 바꿔치기 함.
- Dispatcher는 아까 검사한 드라이버인 줄 알고 악성 코드를 실행.
- 사례
- CVE-2022-32266
- PcdSmmDxe 드라이버에서 발견된 취약점.
- 드라이버 PcdSmmDxe에서 사용하는 소프트웨어 SMI 핸들러의 파라미터 버퍼(CommBuffer)에 대해 공격자가 DMA(Direct Memory Access) 공격을 이용하여 SMI 핸들러에 대한 TOCTOU 공격을 함.
- 검사가 끝난 직후 메모리 내의 데이터를 조작하여 SMI 핸들러를 속이고 임의 코드를 실행할 수 있음.
- 추가
- SMI 핸들러는 SMRAM 안에 존재하지만, 명령을 받기 위해 사용하는 파라미터 버퍼는 SMRAM 밖에 존재.
- CPU가 버퍼를 검사하는 동안 DMA 컨트롤러는 CPU와 상관 없이 메모리에 접근할 수 있음.
- CPU가 검사를 완료하고 안전함을 확인하고 사용되기 직전에 DMA가 데이터를 바꿔치기 하게 됨.