💻
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
  • 목적
  • 역사
  • 특징
  • 기술
  • 관련 업체
  1. UEFI 개념

2. UEFI 개념

Previous1. BIOS의 과거Next3. BIOS vs UEFI

Last updated 2 years ago

목적

Unified Extensible Firmware Interface(통일 확장형 펌웨어 인터페이스) 는 Legacy BIOS를 대체하는 펌웨어 규격으로 16비트 BIOS 의 제약 사항을 극복하고 새로운 하드웨어를 더 유연하게 지원하기 위해서 64비트 기반으로 개발되었다.

역사

1990년대 중반부터 인텔이 개발해 EFI(Extensible Firmware Interface)라는 이름으로 인텔 아이태니엄 시리즈에 사용되었으며 2005년 UEFI 포럼을 발족해 이름이 UEFI로 변경되었다. 2022년 기준으로 최신 버전은 2.10 이며, 2006년 이후에 나온 메인보드 칩셋이라면 EFI 적용이 가능하다. 2020년 이후 CSM을 삭제한 UEFI 클래스 3+가 표준으로 자리잡고, Legacy BIOS는 사라지는 추세이다.

  • CSM(Compatibility Support Module): Legacy BIOS 호환을 위한 인터페이스를 제공하는 모듈로, UEFI와 BIOS모드를 선택하여 부팅할 수 있다.

특징

UEFI 펌웨어는 시스템 마더보드에 납땜된 칩인 SPI Flash Memory에 저장된다. UEFI 펌웨어는 매우 모듈화되어 있으며 내부에는 수십 개의 실행 파일이 포함되어 있고 이들을 저장하기 위해 특별히 설계된 FFS(firmware File System)을 이용하여 볼륨에 배치한다. 각 볼륨은 GUID로 식별되는 파일이 존재하고 내부에는 각각 실행가능한 이미지가 포함되어 있는 섹션이 존재한다.

기술

UEFI는 32/64비트(protected mode)를 사용하며 MBR(CSM) 혹은 GPT(GUID Partion Table)를 사용한 대용량 디스크(2TB이상) 및 파티션에서 부팅이 가능하다. 이론상 2^64 x 512Bytes = 9.4ZB까지 지원하며 파티션 구성 정보가 쉽게 망가지지 않도록 백업 기능이 탑재되어 있다.

UEFI에는 PI(Platform Initialization)과정을 단순화하여 FastBoot(빠른부팅) 기능을 지원한다.

BIOS의 경우에는 커널이 드라이버를 로드하여 TUI 수준의 사용자 인터페이스가 지원되었지만, UEFI는 커널이 로드되기 이전에 그래픽 드라이버를 로드할 수 있기 때문에 GUI 형태의 유저 인터페이스 환경을 지원한다.

  • TUI(Text-based User Interface): CLI와 GUI의 중간 성격을 지닌 인터페이스

가장 중요한 기능 중 하나인 보안 부팅 기능을 지원한다. 제조사가 신뢰하는 드라이버 및 EFI 앱(부트로더) 및 운영 체제(커널)등의 서명을 확인하고, 유효한 경우에만 PC가 정상적으로 부팅된다. 이를 위해 해당 키가 펌웨어 내부에 저장되어 있다. 활성화되어 있는 경우에는 USB를 통한 부팅 등 검증되지 않은 행위가 제한된다.

관련 업체

UEFI 펌웨어는 UEFI Specification을 따라 만들어 지는 것이 일반적이다. 하지만 UEFI Specification은 말 그대로 규격 또는 사양, 즉 강제성이 없는 표준이기 때문에 편리한 확장이 가능하다. 이에 다양한 제조업체별 펌웨어가 존재한다.

조립PC에 탑재되는 UEFI 펌웨어는 ASUS, MSI, GigaByte 등 주요 메인보드 제조사가 만든다. 그러나 Lenovo, HP, Dell, ASUS 등 주요 완제PC 제조사는 제품 출시 시기를 단축하고 비용 절감을 위해 전문 업체가 만든 제품을 공급받아 사용한다.

📖
https://uefi.org/
EFI의 역할
UEFI Class
Image was blocked by Secure Boot
http://www.kbench.com/?q=node/112024
https://www.partsnotincluded.com/flashing-the-bios-to-fix-a-bricked-lenovo-laptop/
https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-Safeguarding-UEFI-Ecosystem-Firmware-Supply-Chain-Is-Hardcoded.pdf