💻
UEFI 프로젝트
  • 🧑‍🏫프로젝트 개요
  • 📖UEFI 개념
    • 1. BIOS의 과거
    • 2. UEFI 개념
    • 3. BIOS vs UEFI
    • 4. UEFI 부팅 단계
  • 🖥️UEFI 개발
    • UEFI 개발 시작하기
      • 0. EDK II 빌드 환경 구성
      • 1. 간단한 EFI application 만들기
      • 2. 간단한 Pkg 만들기
      • 3. Hello World 출력하기
      • 4. 라이브러리와 Hello World
      • 5. Conf를 통한 Build 단순화
    • 핸들 및 프로토콜
      • 6. 핸들/프로토콜 데이터 베이스 구조 - Part 1
      • 7. 핸들/프로토콜 데이터 베이스 구조 - Part 2
      • 8. HandleProtocol API 함수 & ImageHandle 프로토콜을 통한 정보
      • 9. ProtocolsPerHandle API를 통한 ImageHandle 프로토콜 가져오기
      • 10. EFI_STATUS 타입 과 EFI_ERROR 매크로
    • 메모리 맵
      • 11. EFI 메모리 맵 정보 얻기
      • 12. EFI 메모리 맵을 리눅스 커널 스타일로 바꾸기
    • 명령줄 인수를 받는 간단한 앱 만들기
      • 13.ShellAppMain Entry point
      • 14.gRT->GetNextVariableName API를 사용하여 모든 변수 이름 및 GUID 가져오기
    • 부팅 옵션
      • 15. gRT->GetVariable API를 사용하여 부팅 변수 가져오기 및 구문 분석
      • 16. OVMF 이미지 내에 부팅 옵션 추가
      • 17. 부팅 옵션에 WaitForEvent 함수 추가
      • 18. ReadKeyStroke 함수로 사용자 입력 처리
      • 19. bcfg 명령어를 사용한 부팅 옵션 수정
    • PCD
      • 20. PCD 소개
      • 21. PCD 변수에 대한 Overriding
      • 22. Feature Flag PCD와 BOOLEAN FixedAtBuild PCD의 비교
      • 23. PatchableInModule PCD 및 GenPatchPcdTable/PatchPcdValue 유틸리티를 통해 PCD를 변경하는 방법
      • 24. Dynamic/DynamiEx PCDs
      • 25. PCD 더 알아보기
    • 테이블
      • 26. EFI_CONFIGURATION_TABLE에서 참조되는 테이블
      • 27. dmem/EFI_SMBIOS_PROTOCOL/smbiosview를 통해서 SMBIOS 정보 가져오기
      • 28. EFI_SHELL_PROTOCOL을 통하여 ACPI 테이블을 파일에 저장하기
      • 29. EFI_ACPI_SDT_PROTOCOL 및 ShellLib를 사용하여 ACPI BGRT 테이블에서 BMP 이미지 저장하기
    • PCI
      • 30. PCI 루트 브리지 찾은 후 시스템의 모든 PCI 기능 가져오기
      • 31. ShellLib/PrintLib 함수를 사용해 PCI Vendor/Device 정보 가져오기
      • 32. EFI_PCI_IO_PROTOCOL을 사용해 PCI Option ROM 이미지 표시
      • 33. EfiRom 유틸리티를 사용한 PCI Option ROM 이미지 파싱 및 생성
    • 드라이버 및 라이브러리
      • 34. 간단한 UEFI 드라이버 생성
      • 35. 애플리케이션에서 사용할 간단한 라이브러리 생성
      • 36. Library의 constructor와 destructor, NULL Library
      • 37. Shell에 acpiview 명령을 추가하는 방법 조사
      • 38. 사용자 지정 프로토콜을 만들고 사용하기
      • 39. RegisterKeyNotify / UnrigisterKeyNotify 함수를 사용해 단축키 기능을 추가하는 드라이버 만들기
      • 40. Key #### NVRAM 변수
    • 디버그
      • 41. DEBUG 출력문 내부 구조와 DEBUG 문 제어를 위한 PCD 분석, 그리고 OVMF 부트 로그 가져오기
      • 42. GDB를 이용한 Driver/Application 및 OVMF Debug
    • HII
      • 43. HII 데이터베이스 개념 및 출력
      • 44. HII 데이터베이스 내부
      • 45. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 문자열 목록 게시
      • 46. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 HII 패키지 목록 게시
      • 47. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 HII 패키지 목록 게시
      • 48. UNI 파일 및 HiiLib를 사용하여 HII String 패키지 게시 및 작업하기
      • 49.MODULE_UNI_FILE/PACKAGE_UNI_FILE/[UserExtensions.TianoCore."ExtraFiles"]의 도움으로 UNI 파일 선언하기
      • 50.UEFI_HII_RESOURCE_SECTION을 사용하여 문자열 패키지와 함께 HII 패키지 목록 게시하기
      • 51. UEFI APP에 메뉴얼 추가하기(shell의 -?와 help 옵션)
      • 52. Russian 글꼴 추가 - Part 1.
      • 53. Russian 글꼴 추가 - Part 2.
      • 54. EFI_HII_STRING_PROTOCOL의 NewString 및 SetString 함수를 사용하여 다른 언어에 대한 문자열 패키지를 동적으로 추가
      • 55. PlatformLangCodes EFI 변수 수정 및 다른 언어를 동적 추가하기
      • 56. 코드에서 FILE_GUID 및 BASE_NAME을 가져오기
    • VFR
      • 57. VFR을 사용해 간단한 폼 생성 및 EFI_FORM_BROWSER2_PROTOCOL.SendForm()를 통해 화면에 폼 표시하기
      • 58. VFR 요소 : subtitle 및 text
      • 59. 간단한 폼 애플리케이션을 UEFI 드라이버 Form으로 변환하기
      • 60. gRT->SetVariable() 함수를 사용한 UEFI 변수 생성, 변경 및 삭제
      • 61.dmpstore 명령을 사용하여 변수를 파일에 저장/로드하기
      • 62. UEFI Device path의 구조
      • 63. checkbox를 가진 HII 폼 만들기
      • 64. checkbox를 가진 HII폼 만들기
      • 65. VFR 추가 입력 요소 Part 1: number
      • 66. VFR 추가 입력 요소 Part 2: string
      • 67. VFR 추가 입력 요소 Part 3: date & time
      • 68. VFR 추가 입력 요소 Part 3: oneof & orderedlist
      • 69. VFR의 조건부 키워드
      • 70. VFR의 상수 및 연산자가 내장된 기본 조건문
      • 71. 기본 VFR 내장 문자열용 함수
      • 72. label 키워드를 이용하여 HII 양식에 동적 요소 추가하기
      • 73. VFR question 기본값 설정
  • 🔐UEFI 보안
    • 1. 개요
    • 2. 공격 벡터
    • 3. mitigation
    • 4. 정적 분석 방법
    • 5. 동적 분석 방법
Powered by GitBook
On this page
  • UEFITool
  • efiXplorer
  • Brick
  1. UEFI 보안

4. 정적 분석 방법

Previous3. mitigationNext5. 동적 분석 방법

Last updated 2 years ago

여기서는 UEFI의 분석 방법에 대해서 설명한다. 일반적으로 분석 방법에는 크게 정적, 동적 분석 방법이 있고 UEFI에도 그대로 해당된다. 먼저 정적 분석 방법과 관련 툴에 대해 설명해보겠다.

먼저 정적 분석이란 소스 코드의 실행 없이 정적으로 프로그램의 버그를 찾는 분석 방법으로 동적 분석과는 분석 시점에서 큰 차이가 있다고 볼 수 있다. UEFI의 취약점을 정적 분석으로 찾기 위해서는 이미 알려진 취약점 유형을 숙지하고 있거나 UEFI Spec을 공부하여 새로운 취약점 유형을 찾는 노력이 필요하다.

다음으로 프로젝트를 진행하며 사용한 분석 툴에 대해 설명해 보겠다.

UEFITool은 UEFI 펌웨어 이미지를 트리 구조로 파싱하여 이미지를 분석할 수 있는 GUI도구이다.

이미지를 덤프하여 넣는 것은 상관 없지만 공급업체별 펌웨어 업데이트 파일을 넣었을 때는 잘못 열리거나 전혀 열리지 않을 수도 있다. (예: 암호화된 HP업데이트 파일, Dell HDR 및 EXE파일 등)

위 사진은 덤프된 펌웨어 이미지를 넣었을 때 섹션별로 분석해주는 UEFITool의 모습이다.

UEFI의 구조를 분석하거나 원하는 모듈을 추출하고 싶을 때 유용한 분석 도구이다.

GUID 검색 기능도 있어서 GUID를 통해 검색 가능하다.

먼저, Binarly.io에서 만든 IDA Pro용 플러그인인 efiXplorer가 제일 유명한 분석 툴이다.

이 플러그인의 제일 큰 기능은 Boot Service, Runtime Service, SMM Service, PEI Service, Protocol, GUID등을 자동으로 인식하고 수도 코드에 적용시켜 주는 것이다.

적용된 예시를 한 번 보자. 먼저 적용이 안된 모습이다.

대충 봐도 분석이 힘들 것 같은 수도 코드가 나오는 것을 볼 수 있다.

하지만, efiXplorer를 적용시켜 준다면,

다음과 같은 GUID, 서비스, 프로토콜등이 해석되어 디컴파일되는 모습을 확인 할 수 있다.

또한 efiXplorer에는 잘 알려진 취약점 패턴을 찾아주는 기능이 존재한다.

하지만 오탐일 확률도 높으니 무조건 맹신하지 말고 직접 확인하고 검증하는 과정이 필요하다.

다음은 Sentinel-One에서 만든 Brick이라는 정적 분석 툴이다. 이 툴은 방금 소개한 efiXplorer을 기반으로 하는 툴로 이 툴은 UEFI를 분석하는 툴보다는 정적 취약점 스캐너의 일종이다.

이 툴은 잘 알려진 SMM취약점을 가지고 있는 SMM모듈을 대상으로 스캐닝을 하며 이 과정에서 efiXplorer가 사용된다. 툴을 실행하면 UEFI이미지에서 SMM모듈을 각각 IDA Python스크립트를 통해 분석을 하고 결과를 html파일로 출력해준다.

또한 위의 efiXplorer에서 탐지하는 취약점도 같이 보여준다.

🔐
efiXplorer
Brick
UEFITool
https://github.com/assafcarlsbad/brick
https://github.com/assafcarlsbad/brick