Notice
Recent Posts
Recent Comments
Link
«   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
Tags more
Archives
Today
Total
관리 메뉴

방망이

[프로젝트]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가 있을 때
      1. DXE Dispatcher는 ProtocolA가 설치되었는지 확인하고 TRUE/FALSE를 스택에 PUSH
      2. ProtocolB가 설치 되었는지 확인하고 TRUE/FALSE를 스택에 PUSH
      3. AND를 만나 스택에서 두 개를 꺼내어 AND 연산
      4. 결과가 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 상태인 다른 드라이버들을 검사함. (방금 실행된 드라이버 덕분에 조건이 풀린 드라이버가 있는지 확인하기 위해)
  • 흐름도
    1. FV 발견
    2. Security 검증
    3. A Priori File 탐색
    4. 존재하면 목록에 있는 드라이버 모두 강제 실행
    5. 남은 드라이버 DEPEX 확인
      • 조건 만족 → LoadImage()가 호출되어 메모리에 올리고, StartImage()가 호출되어 실행 → 새로운 프로토콜 생성 → 다시 5번으로 돌아가 대기 중이던 드라이버들 재검사
      • 조건 불만족 → 대기(Dependent)
    6. 더 이상 실행할 드라이버가 없으면 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)
    • 검사 시점과 사용 시점의 사이에 발생할 수 있는 취약점
    • 원리
      1. Dispatcher가 드라이버의 서명을 검사하고 안전하다고 판단.
      2. 메모리에 로드하고 실행하기 직전의 Race condition 발생.
      3. 공격자가 그 틈을 타 원본 드라이버를 악성 코드로 바꿔치기 함.
      4. Dispatcher는 아까 검사한 드라이버인 줄 알고 악성 코드를 실행.
    • 사례
      • CVE-2022-32266
        • PcdSmmDxe 드라이버에서 발견된 취약점.
        • 드라이버 PcdSmmDxe에서 사용하는 소프트웨어 SMI 핸들러의 파라미터 버퍼(CommBuffer)에 대해 공격자가 DMA(Direct Memory Access) 공격을 이용하여 SMI 핸들러에 대한 TOCTOU 공격을 함.
        • 검사가 끝난 직후 메모리 내의 데이터를 조작하여 SMI 핸들러를 속이고 임의 코드를 실행할 수 있음.
        • 추가
          • SMI 핸들러는 SMRAM 안에 존재하지만, 명령을 받기 위해 사용하는 파라미터 버퍼는 SMRAM 밖에 존재.
          • CPU가 버퍼를 검사하는 동안 DMA 컨트롤러는 CPU와 상관 없이 메모리에 접근할 수 있음.
          • CPU가 검사를 완료하고 안전함을 확인하고 사용되기 직전에 DMA가 데이터를 바꿔치기 하게 됨.