Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
EFI Undercover
Search
Yuma Kurogome
July 13, 2013
Programming
3
1.6k
EFI Undercover
第3回 ローレイヤー勉強会 発表資料
http://atnd.org/events/40773
#ll3rd
Yuma Kurogome
July 13, 2013
Tweet
Share
More Decks by Yuma Kurogome
See All by Yuma Kurogome
The Art of De-obfuscation
ntddk
16
27k
死にゆくアンチウイルスへの祈り
ntddk
55
38k
Windows Subsystem for Linux Internals
ntddk
10
2.9k
なぜマルウェア解析は自動化できないのか
ntddk
6
4.1k
Linear Obfuscation to Drive angr Angry
ntddk
4
820
CAPTCHAとボットの共進化
ntddk
2
1.1k
マルウェアを機械学習する前に
ntddk
3
1.6k
Peeling Onions
ntddk
7
3.5k
仮想化技術を用いたマルウェア解析
ntddk
8
27k
Other Decks in Programming
See All in Programming
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
240
카카오페이는 어떻게 수천만 결제를 처리할까? 우아한 결제 분산락 노하우
kakao
PRO
0
110
ピラミッド、アイスクリームコーン、SMURF: 自動テストの最適バランスを求めて / Pyramid Ice-Cream-Cone and SMURF
twada
PRO
10
1.3k
CSC509 Lecture 12
javiergs
PRO
0
160
Better Code Design in PHP
afilina
PRO
0
130
C++でシェーダを書く
fadis
6
4.1k
subpath importsで始めるモック生活
10tera
0
320
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
200
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
1
300
WebフロントエンドにおけるGraphQL(あるいはバックエンドのAPI)との向き合い方 / #241106_plk_frontend
izumin5210
4
1.4k
最新TCAキャッチアップ
0si43
0
190
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Code Reviewing Like a Champion
maltzj
520
39k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
Into the Great Unknown - MozCon
thekraken
32
1.5k
Docker and Python
trallard
40
3.1k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Faster Mobile Websites
deanohume
305
30k
A Tale of Four Properties
chriscoyier
156
23k
Designing Experiences People Love
moore
138
23k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Transcript
EFI Undercover @ntddk
UEFI www.uefi.org
自己紹介 • Yuma Kurogome(@ntddk) #include <ntddk.h> • 慶應義塾大学 SFC B1,
武田研 • Synclogue Inc. • セプキャン2011, セキュキャン2013 • RCE, kernel hack
リバースエンジニアリング necomimi • ロジアナ – αLow/Hi: リラックス – βLow/Hi: 活性化
– γLow/Mid: ピキーン – δ: 深いリラックス – θ: 睡眠 • 脳波の異常検知? – fluent-plugin-serialport: ログ整形 – Jubatus: 機械学習
今回話すこと • UEFI • PatchGuard
* 初心者向け * 日本語の書籍が無い...
UEFI?
UEFIとは • BIOSに代わるブートシステム • IntelとHPが1990年台にIA64アーキテクチャを 設計 • IA64にBIOSなんか乗せてられない – 16ビットプロセッサモード、1MBのアドレス空間、
PC/ATハードウェアへの依存
UEFIとは • BIOSに代わるブートシステム • IntelとHPが1990年台にIA64アーキテクチャを 設計 • BIOSが許されるのは小学生までだよね – 16ビットプロセッサモード、1MBのアドレス空間、
PC/ATハードウェアへの依存 → CPU非依存なアーキテクチャ、ドライバ
UEFIとは • Intel → Unified EFI Forum EFI → UEFI,
2.x系がリリース • 2009年頃から普及 – 2TBの壁を克服 – モジュラー型 – 高速起動
2TBの壁 • MBRのパーティションテーブルでは、開始セク タ値とセクタ数が 32bit(4G sectors) • 4G sectors *
512byte = 2TB • パーティションテーブルかセクタサイズを変え るしかない → 互換性? • GPTを前提としているUEFIに移行! • 32bit LBA → 64bit LBA
MBRとGPTの比較 • パーティション: 4個 → 128個 • セクタアドレス長: 32bit →
64bit • パーティションタイプ: 1byte → 16byte GUID • ブートフラグ: 1byte→ 属性フラグ 8bytes • パーティション名: 72bytes UTF-16 • バックアップのパーティションテーブル領域
GPT
GPT パーティションエントリ オフセット サイズ 内容 0 16byte パーティションタイプGUID 16 16byte
パーティーションユニークGUID 32 8byte 開始LBAアドレス 40 8byte 終了LBAアドレス 48 8byte 属性フラグ 56 72byte パーティション名 EFIシステムパーティションなら {C12A7328-F81F-11D2-BA4B-00A0C93EC93B}
UEFIの見た目
UEFIの見た目 • グラフィカルに実装できる • もちろんBIOSそっくりの画面のものもある • Boot ManagerというGRUBのブートメニュー のようなものがある •
UEFI Shellというコマンドプロンプトのような シェルがある
メインメニュー
Boot Managar ブート画面の選択画面 OSは自分のブートローダをここに登録する
Boot Maintenance Manager メニューの編集、ロードするドライバの指定、任 意のファイル実行など
UEFI Shell ださいシェル 任意のOS起動などに使用
GRUB 2 FOR UEFI
UEFIからのブート BootManagerの設定値がデフォルトの場合 • UEFIがHDDを検出、GPTをロード • EFI System Partitionを検索 • \EFI\BOOT\bootx64.efi
or \EFI\BOOT\bootx32.efi をロード
EFI SYSTEM PARTITION • パーティションタイプGUIDがEFI System Partitionな FATファイルシステム • GPTにブートセクタは無い
• ここからUEFIアプリケーションをロードするこ とで起動
UEFI Application • PEフォーマットのバイナリとドライバ • 32bit/64bit, Long modeも • 拡張子:
.EFI • UEFI APIを利用して各種処理を実装
UEFI APPLICATIONの種類 • 2種類のUEFI Application – 通常のUEFI Application: 終了時にExit()をコール し、
UEFI Shellなどに制御を戻す – OS Loader: 終了時にExitBootServices()をコール し、 UEFIが利用していた資源を開放して制御をOS へ移す
RUNTIME SERVICE • ExitBootServices()後もUEFIがOSに対して提供 するサービス • 最低限の機能のみ • Time (GetTime,
SetTime...) • Virtual Memory (SetirtualAddressMap...) • Variable Services (GetVariable...) • Miscellaneous Services(ResetSystem...)
BOOT SERVICE • ExitBootServices()までUEFI Applicationに提供 するサービス – Task Priority Services
(RaiseTPL...) – Memory Services (AllocatePages...) – Event & Timer Services (CreateEvent, SetTimer...) – Protocol Handler Services (HandleProtocol...) – Image Services (LoadImage, StartImage...) – Miscellaneous Services (Stall, CopyMem...) – Open and Close Protocol Services (OpenProtocol...) – Library Services (LocateProtocol...) – 32bit CRC Services (CalculateCrc32...)
Hello, World! #include <UEFI_HelloWorld.h> EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN
EFI_SYSTEM_TABLE *SystemTable) { Print (L"Hello, World!"); return EFI_SUCCESS; }
Hello, World! EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
引数は2個(ImageHandle, SystemTable) • ImageHandleはロードされたUEFI Applicationの イメージファイルに対するハンドル • SystemTableを経由して全てのUEFI APIへアクセ ス
EFI System Table typedef struct { EFI_TABLE_HEADER Hdr; CHAR16 *FirmwareVendor;
UINT32 FirmwareRevision; EFI_HANDLE ConsoleInHandle; // 例えばこれはコンソール出力、ポインタが用意されてる EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; EFI_HANDLE ConsoleOutHandle; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut; EFI_HANDLE StandardErrorHandle; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr; EFI_RUNTIME_SERVICES *RuntimeServices; EFI_BOOT_SERVICES *BootServices; UINTN NumberOfTableEntries; EFI_CONFIGURATION_TABLE *ConfigurationTable; } EFI_SYSTEM_TABLE; UEFI Applicationに対して公開するインタフェー スが全て詰め込まれた構造体
PROCOTOLS • ネットワークプロトコルスタックのことではな く・・・・・・ • UEFI上で提供される様々なサービス • UEFI Driverを実装しUEFIへロードすることで 自作のProtocolを提供する事も可能
Protocols • IP4/6, UDP/TCP 4/6, ARP, DHCP4/6, MTFP4/6, FTP, PXE,
iSCSI • VLAN, EAP, IPsec (IKEv2) • PCI, USB, SCSI, AHCI, removable media • GPT, vFAT • Console, Graphical Mode, Human Interface • User Identi cation fi • ACPI, SMRAM • Debugger • Compression • EFI Byte Code Virtual Machine • Firmware management
locate Windows bootloader BS->LocateHandleBuffer(ByProtocol,&FileSystemProtocol,NULL,&nbHdles,&hdleArr); for(i=0;i<nbHdles;i++) { err = BS->HandleProtocol(hdleArr[i],&FileSystemProtocol,(void **)&ioDevice);
if(err != EFI_SUCCESS) continue; err=ioDevice->OpenVolume(ioDevice,&handleRoots); if(err != EFI_SUCCESS) continue; err = handleRoots->Open(handleRoots,&bootFile,WINDOWS_BOOTX64_IMAGEPATH, EFI_FILE_MODE_READ,EFI_FILE_READ_ONLY); if(err == EFI_SUCCESS) { handleRoots->Close(bootFile); *LoaderDevicePath = FileDevicePath(handleArray[i],WIN_BOOTX64_IMAGEPATH); break; } }
UEFIのSDK • EDK II – デファクトスタンダードだが・・・・・・ – trunkだと良くハマる • UDK2010
– IntelによるEDK IIのstable – 機能はEDK IIに劣る • gnu-efi – UEFI ApplicationのみのためのLightweight実装 –
UEFIのSDK • EFI Toolkit – TianoCoreが開発するOSS – gnu-efiのもと – EFI
Shell開発にはEDKのほうが強いが、スタンドア ローンならこちらに分がある
VMでのUEFI開発 • Virtual Box – ネイティブに実行可能 – Windowsのブートはできなかった • VMWare
– vmxを編集 • firmware = "efi" – gdbスタブ • debugStub.listen.guest64 = "TRUE" • debugStub.listen.guest64.remote = "TRUE" • debugStub.hideBreakpoints = "TRUE" • monitor.debugOnStartGuest64 = "TRUE"
時代はUEFI • リアルモードのアセンブリを書かなくていい • サイズに悩まなくていい • 気軽にCで書ける • VMで検証できる •
Intel SDMを読め → UEFI Specificationを読め – Intelに限定されない
UEFIの問題点 • Lenovo製コンピュータに載ったUEFIの実装 – 本来ファームウェアがパースすべきでない文字列を パース – デフォルトで使われているブートエントリの表示名 と一致しなければブートを拒否
PatchGuard?
PatchGuardとは • 64bit版Windowsに実装されたカーネル保護機構 • Kernel Patch Protection(KPP)とも • カーネル領域の変更を監視 –
SDT: 全システムコールのテーブル – IDT: 割り込み – GDT: セグメントディスクリプタを置く領域 – カーネルからアロケートされていないカーネルス タック • 多くのrootkitは時代遅れに
時代遅れのrootkit 悪魔のツール“ルートキット”最前線 http://nkbp.jp/12xqHtA
PatchGuard • Bypassing PatchGuardで検索 • How to boost PatchGuard :
it's all about gong fu! www.zer0mem.sk/?p=271 • RebootすることなくPatchGuardを突破する
UEFI ApplicationによるPatchGuardのbypass手法
Dreamboot: A UEFI Bootkit • Sebastien kaczmarek, Quarkslab. • HITB2013
Amsterdamにて発表された • オープンソース!!! • https://github.com/quarkslab/dreamboot
Dreamboot: A UEFI Bootkit • ブートローダ – bootmgfw.efiのフック – winload.efiのフック
• カーネル – PatchGuardの無効化 – Dreambootのコードをリロケート – PsSetLoadImageNotifyRoutine()
Dreamboot: A UEFI Bootkit
Dreamboot: A UEFI Bootkit • UEFI Bootkitを理解するために読むべきソース – QuarksMain.c –
hooks.asm • 他は描画処理とPEロード
QuarksMain.c • ハードウェアからブートローダを検索 – EFI_FILE_IO_INTERFACEを利用 • PEのロード BS->LoadImage(TRUE,ParentHdle,WinLdrDp,NULL,0,&hImg); • PEメモリレイアウトの取得
BS->HandleProtocol(hImg,&LoadedImageProtocol, (void **)&img_inf); • PEにパッチ *((byte *)(img_inf->ImageBase) + offset = NOP; • ブート BS->StartImage(hImg,(UINTN *)NULL,(CHAR16 **)NULL);
hooks.asm • OslArchTransferToKernel()をフック – winload.exe → ntoskrnl.exeの際に呼び出さ れる – kiSystemStartup()を呼び出すように書き換
え
hooks.asm • NX flagの書き換え lea rcx, NTOSKRNL_PATTERN_NXFlag sub rbx,NTOSKRNL_PATTERN_NXFlag_size push
rdx mov rax,rdx mov rdx,NTOSKRNL_PATTERN_NXFlag_size call kernel_find_pattern cmp rax,0 je winload_OslArchTransferToKernel_hook_exit mov byte ptr[rax],0EBh mov NTOSKRNL_NxPatchAddr,rax
hooks.asm • PatchGuardの書き換え mov rax,[rsp] lea rcx,NTOSKRNL_PATTERN_PATCHGUARD mov rdx,NTOSKRNL_PATTERN_PATCHGUARD_size call
kernel_find_pattern cmp rax,0 je winload_OslArchTransferToKernel_hook_exit mov dword ptr[rax+2],090D23148h mov word ptr[rax+6],09090h mov byte ptr[rax+8],090h
hooks.asm • PEのパース • NtSetInformationThreadのフック – 通常smss.exeの作成時あるいはシステムプロセスの 作成中に呼ばれるが、無効に • NX
bit無効化後にntoskrnlにペイロードを挿入 • PEが実行される前にパッチできる • Bypassing local authentication + Priviledge escalation
hooks.asm • WP flagの書き換え • rootkitでいつも書くアレ CR0_WP_CLEAR_MASK equ 0fffeffffh CR0_WP_SET_MASK
equ 010000h cli mov rcx,cr0 and rcx, CR0_WP_CLEAR_MASK ; Unprotect kernel memory mov cr0,rcx mov rcx,cr0 or rcx, CR0_WP_SET_MASK ; Restore memory protection mov cr0,rcx sti
まとめ • UEFIで気軽にローレイヤー • PatchGuardが許されるのは(ry
やりたいこと • 悪名高いUEFI Secure Bootの補助 • OSが読み込む前に安全なチップからファイル やメモリをスキャン • rootkit/bootkit対策
• 起動のブロック
やりたいこと ・・・・・・というのを既にKasperskyがやってた “Kaspersky Anti-Virus for UEFI”
やりたいこと • 見てろよKaspersky • UEFI basedなマルウェア対策? • JIANG Zhengwei,WANG Xiaozhen,LIU
Baoxu2. UEFI malicious behavior detection model based on minimal attack tree. Computer Engineering and Applications,2012,48(32):14-17 とか、そのあたり
!!! 新規性 !!! Thanks @syuu1228 :)