Upload
others
View
36
Download
0
Embed Size (px)
Citation preview
UEFI and PCI bootkitsPierre ChifflierPacSec 2013
ANSSI.. .
▶ ANSSI(フランスネットワーク情報セキュリティ庁) は、2009 年 7 月 7 日に設立された情報システムの防御およびセキュリティを所管する官庁
▶ 首相直轄▶ 主なミッション
▶ 予防▶ 情報システムの防御
http://www.ssi.gouv.fr/en/
UEFI and PCI bootkits 2/42
UEFI の研究.. ..モチベーション..
......
▶ UEFI の研究▶ プレブートの危険性の喚起▶ 対策の提供と議論
.Study..
......
▶ ブートシーケンス▶ UEFI の機能:
▶ ブートローダのフック▶ ACPI テーブル▶ ネットワーク機能▶ …
▶ PCI デバイス▶ 対策
UEFI and PCI bootkits 3/42
概要.. .
1 UEFI
2 PCI
3 UEFI VGA Bootkit の仕組み
4 Demo
5 対策
UEFI and PCI bootkits 4/42
UEFI
UEFI and PCI bootkits 5/42
BIOS と UEFI (1/2).. .
.BIOS..
......
▶ x86 アーキテクチャ▶ リアルモード (16 ビット)▶ 大容量ディスク (2TB 以上) はサポートしない、MBR セクター
▶ メモリマッピングは 1MB▶ インテグリティチェックなし▶ 時代遅れ
UEFI and PCI bootkits 6/42
UEFI.. ..UEFI: 現在は?..
......
▶ 2000 EFI (Intel)▶ 2004 http://tianocore.org▶ 2005 UEFI (Unified EFI Forum, http://www.uefi.org)▶ 2013 現在のバージョン: UEFI 2.4
.目的..
......
▶ BIOS における制限の克服▶ 複数のアーキテクチャ(x86, ARM, Itanium, …)▶ ドライバの標準化▶ “現代的な” コンセプト: モジュール化、C 言語
UEFI and PCI bootkits 7/42
UEFI: スペック.. ..プロトコル..
......
▶ IP4/6, UDP/TCP 4/6, ARP, DHCP4/6, MTFP4/6, FTP, PXE, iSCSI▶ VLAN, EAP, IPsec (IKEv2)▶ PCI, USB, SCSI, AHCI, リムーバブルメディア▶ GPT, vFAT▶ こんそーる、グラフィカルモード、ヒューマンインターフェース、
UTF-16▶ ユーザ概念▶ ACPI, SMRAM▶ デバッガー▶ 圧縮▶ EFI バイトコード仮想マシン▶ ファームウェア管理▶ …
UEFI and PCI bootkits 8/42
UEFI とセキュリティ.. .
.EFI Development Kit (EDK) 2..
......
▶ 100 万行以上のソースコード▶ メモリページの保護は考慮されておらず、すべてが rwx▶ すべてのコードはリング 0 で実行▶ 広大なエリアで攻撃可能▶ ほとんどのコード (libc+、IPv4/IPv6、IPsec、PE parserなど) がスクラッチからの書き起こし
▶ StrCat と StrCpy が大量に
UEFI and PCI bootkits 9/42
UEFI とセキュリティ(2).. .
.マルウェアが利用できるサービス..
......
▶ ネットワーク機能 (IPv4 と IPv6)▶ PXE 経由でのドライバの取得▶ IPsec トンネル▶ ACPI テーブルの操作▶ ドライバの追加
UEFI and PCI bootkits 10/42
UEFI のブートシーケンス.. .
..
Security(SEC)
.
Pre EFIInitialization
(PEI)
.
DriverExecution
Environment(DXE)
.
BootDevSelect(BDS)
.
TransientSystemLoad
(TSL)
.
Run Time(RT)
.
AfterLife
(AL)
.Power on.
[Platform Initialization].
[....OS boot....].
Shutdown.
PreVerifier
.
CPUInit
.
ChipsetInit
.
BoardInit
.
verify
.
IntrinsicServices
.
EFI DriverDispatcher
.
DeviceDrivers
.
BootManager
.
Final OSBootLoader
.
Transient OSBootLoader
.
Transient OSEnvironment
.
OS-absentApp
.
Final OSEnvironment
.
OS PresentApp
.
AfterLife
.
.
HOOK !
.
HOOK !
.
HOOK !
UEFI and PCI bootkits 11/42
PCI bootkits
UEFI and PCI bootkits 12/42
概要: PCI 拡張 ROM.. .
▶ (小さな) オプションのメモリチップで、PCI/PCIe/Thunderboltに存在する
▶ ファームウェアによって実行されるコードを提供
▶ BIOS ではすでに攻撃対象に▶ UEFI ではどうか?
UEFI and PCI bootkits 13/42
VGA カード.. .
UEFI and PCI bootkits 14/42
シナリオと仮定.. .
.ユースケース..
......
▶ 攻撃者はすでに管理者特権を取得済み▶ 永続的でステルス性のあるルートキットをインストールしたい
▶ Bootkit: ブートローダールートキット▶ 変更はした痕跡が残る▶ BIOS パスワードが設定されている場合、困難▶ ハードウェアの使用?▶ BIOS を書き換えずに
UEFI and PCI bootkits 15/42
例: グラフィックカード.. .
目的: 権限上昇.問題..
......
▶ OS はまだメモリにない▶ ハードディスクにもアクセスできない (暗号化されている可能性も)
▶ いかにコードを実行するか?▶ しかも数キロバイトで!
.当初の反響..
......
…こうした条件を考慮すると、せいぜい映画マトリックスのファンの空想でしかない
UEFI and PCI bootkits 16/42
UEFI のブートシーケンス.. .
..
Security(SEC)
.
Pre EFIInitialization
(PEI)
.
DriverExecution
Environment(DXE)
.
BootDevSelect(BDS)
.
TransientSystemLoad
(TSL)
.
Run Time(RT)
.
AfterLife
(AL)
.Power on.
[Platform Initialization].
[....OS boot....].
Shutdown.
PreVerifier
.
CPUInit
.
ChipsetInit
.
BoardInit
.
verify
.
IntrinsicServices
.
EFI DriverDispatcher
.
DeviceDrivers
.
BootManager
.
Final OSBootLoader
.
Transient OSBootLoader
.
Transient OSEnvironment
.
OS-absentApp
.
Final OSEnvironment
.
OS PresentApp
.
AfterLife
.
.
HOOK !
.
HOOK !
.
HOOK !
UEFI and PCI bootkits 17/42
シナリオ.. .
..
Security(SEC)
.
Pre EFIInitialization
(PEI)
.
DriverExecution
Environment(DXE)
.
BootDevSelect(BDS)
.
TransientSystemLoad
(TSL)
.
Run Time(RT)
.
AfterLife
(AL)
.Power on.
[Platform Initialization].
[....OS boot....].
Shutdown.
PreVerifier
.
CPUInit
.
ChipsetInit
.
BoardInit
.
verify
.
IntrinsicServices
.
EFI DriverDispatcher
.
DeviceDrivers
.
BootManager
.
Final OSBootLoader
.
Transient OSBootLoader
.
Transient OSEnvironment
.
OS-absentApp
.
Final OSEnvironment
.
OS PresentApp
.
AfterLife
.
Start:PCI card
.
HOOK !
.
HOOK !
.
HOOK !
UEFI and PCI bootkits 17/42
シナリオ.. .
..
Security(SEC)
.
Pre EFIInitialization
(PEI)
.
DriverExecution
Environment(DXE)
.
BootDevSelect(BDS)
.
TransientSystemLoad
(TSL)
.
Run Time(RT)
.
AfterLife
(AL)
.Power on.
[Platform Initialization].
[....OS boot....].
Shutdown.
PreVerifier
.
CPUInit
.
ChipsetInit
.
BoardInit
.
verify
.
IntrinsicServices
.
EFI DriverDispatcher
.
DeviceDrivers
.
BootManager
.
Final OSBootLoader
.
Transient OSBootLoader
.
Transient OSEnvironment
.
OS-absentApp
.
Final OSEnvironment
.
OS PresentApp
.
AfterLife
.
Target:OS
.
HOOK !
.
HOOK !
.
HOOK !
UEFI and PCI bootkits 17/42
UEFI ブートシーケンス.. .
... SEC,PEI
. DXE,BDS
. Grub2. Linux. App.
Power on
.
UEFI firmware
.
Bootloader
.
Operating System
.
LegacyCode
.
Header
.
InitCode
.
ModifiedExitBootServices
.
InterruptHandler
.
ModifiedFork
.
added code
.
1
.
2
.
3
.
4
.
5
.
Load Opt. ROM
.
LoadRO
M
.ExitBS.
.
#D
B
.
fork
UEFI and PCI bootkits 18/42
現実的なシナリオ.. ..次のような方法で拡張 ROM を手にいれる..
......
▶ PCI デバイスの展開▶ 新たな内部 PCI デバイスの追加▶ 新たな外部 PCI デバイスの追加▶ USB メモリでのブート▶ OS の管理者特権の取得
.新たな機能..
......
▶ ハイブリッド ROM を作成する UEFI コードの追加▶ 拡張 ROM をフラッシュ✓□ バックドアがインストールされる
UEFI and PCI bootkits 19/42
ROM の情報をダンプ.. .▶ cat /sys/bus/pci/devices/0000\:00\:02.0/rom▶ ベンダ提供のツール
.例: ATI..
......E:\> a t i f l a s h . exe −unlockrom 0E:\> a t i f l a s h . exe −s 0 myrom. bin
UEFI and PCI bootkits 20/42
UEFI ROM の作成1.. .
.“ハイブリッド ROM” の作成..
......
▶ 開発ツール (vim + gcc)▶ DXE ドライバの作成: 64 ビット C コード (make)▶ PCI ID を選択▶ ROM フォーマットへ変換 (EfiRom)▶ イメージにパッチを当てる (cat)
1ROM のビルドは 1 日で終わらないUEFI and PCI bootkits 21/42
PCI 拡張 ROM フォーマット.. .
..
PCI ROM Header< 64 kb
PCI Data Structure
PCI ROM Header< 64 kb
PCI Data Structure
Offset Length Value Header Field
00h−01h 2 55AAh PCI Expansion ROM signature
02h−17h 16h
218h−19h
Architecture Specific Data
Pointer to PCI Data Structure
Offset Length00h−03h
06h−07h08h−09h0Ah−0Bh
422
2
Header FieldSignature, the "PCIR" stringVendor IdentificationDevice IdentificationDevice List PointerPCI Data Structure Length
04h−05h
2
1 PCI Data Structure Revision3 Class Code0Dh−0Fh
0Ch
10h−11h 2 Image Length12h−13h 2 Vendor ROM Revision Level
1 Code Type14h15h 1 Last Image Indicator
16h−17h 2 Maximum Runtime Image Length18h−19h 2 Pointer to Configuration Utility Code Header1Ah−1Bh 2 Pointer to DTMF CLP Entry Point
Image 0
Image n
.
UEFI Code
.
ROM vanilla
PCI 拡張 ROM の変更
UEFI and PCI bootkits 22/42
PCI 拡張 ROM フォーマット.. .
..
PCI ROM Header< 64 kb
PCI Data Structure
PCI ROM Header< 64 kb
PCI Data Structure
Offset Length Value Header Field
00h−01h 2 55AAh PCI Expansion ROM signature
02h−17h 16h
218h−19h
Architecture Specific Data
Pointer to PCI Data Structure
Offset Length00h−03h
06h−07h08h−09h0Ah−0Bh
422
2
Header FieldSignature, the "PCIR" stringVendor IdentificationDevice IdentificationDevice List PointerPCI Data Structure Length
04h−05h
2
1 PCI Data Structure Revision3 Class Code0Dh−0Fh
0Ch
10h−11h 2 Image Length12h−13h 2 Vendor ROM Revision Level
1 Code Type14h15h 1 Last Image Indicator
16h−17h 2 Maximum Runtime Image Length18h−19h 2 Pointer to Configuration Utility Code Header1Ah−1Bh 2 Pointer to DTMF CLP Entry Point
Image 0
Image n
.
UEFI Code
.
ROM vanilla
PCI 拡張 ROM の変更
UEFI and PCI bootkits 22/42
PCI 拡張 ROM フォーマット.. .
..
PCI ROM Header< 64 kb
PCI Data Structure
PCI ROM Header< 64 kb
PCI Data Structure
Offset Length Value Header Field
00h−01h 2 55AAh PCI Expansion ROM signature
02h−17h 16h
218h−19h
Architecture Specific Data
Pointer to PCI Data Structure
Offset Length00h−03h
06h−07h08h−09h0Ah−0Bh
422
2
Header FieldSignature, the "PCIR" stringVendor IdentificationDevice IdentificationDevice List PointerPCI Data Structure Length
04h−05h
2
1 PCI Data Structure Revision3 Class Code0Dh−0Fh
0Ch
10h−11h 2 Image Length12h−13h 2 Vendor ROM Revision Level
1 Code Type14h15h 1 Last Image Indicator
16h−17h 2 Maximum Runtime Image Length18h−19h 2 Pointer to Configuration Utility Code Header1Ah−1Bh 2 Pointer to DTMF CLP Entry Point
Image 0
Image n
.
UEFI Code
.
ROM vanilla
PCI 拡張 ROM の変更
UEFI and PCI bootkits 22/42
ROM の書き込み (1/2).. .▶ ベンダ提供のツール
.Example: ATI..
......E:\> a t i f l a s h . exe −unlockrom 0E:\> a t i f l a s h . exe −p −f 0 myrom. bin
▶ 三度お祈りして再起動
UEFI and PCI bootkits 23/42
ROM の書き込み (2/2).. .
▶ SPI のフラッシュ: ローレベルなツール
UEFI and PCI bootkits 24/42
UEFI での実行.. ..マルウェアの実行..
......
▶ UEFI ファームウェアが PCI デバイスをカウント▶ Expansion ROM がメモリにロードa:
▶ レガシー: (0xc0000 → 0xfffff)▶ UEFI: ダイナミック
▶ レガシーでは CSM(互換性サポートモジュール) によってROM がロード
▶ UEFI ROM はそのあとでロード▶ C のエントリーポイントがコール▶ 関数 ExitBootServices がフック
aすべての道は ROM に続く
UEFI and PCI bootkits 25/42
Load PCI 拡張 ROM.. .
... SEC,PEI
. DXE,BDS
. Grub2. Linux. App.
Power on
.
UEFI firmware
.
Bootloader
.
Operating System
.
LegacyCode
.
Header
.
InitCode
.
ModifiedExitBootServices
.
InterruptHandler
.
ModifiedFork
.
added code
.
1
.
2
.
3
.
4
.
5
.
Load Opt. ROM
.
LoadRO
M
.ExitBS.
.
#D
B
.
fork
UEFI and PCI bootkits 26/42
ブートローダの横取り.. ..ブートローダの役割..
......
▶ カーネルイメージをメモリにコピー(アドレス?)▶ ExitBootServices のコール▶ 問題: OS はメモリを再利用できる▶ Grub2 でテスト
.課題..
......
▶ 永続的なメモリ割り当て▶ コールスタックの再構築▶ アドレスの特定▶ 次のステップの準備
UEFI and PCI bootkits 27/42
ブートローダの横取り.. ..ブートローダの役割..
......
▶ カーネルイメージをメモリにコピー(アドレス?)▶ ExitBootServices のコール▶ 問題: OS はメモリを再利用できる▶ Grub2 でテスト
.課題..
......
▶ 永続的なメモリ割り当て▶ コールスタックの再構築▶ アドレスの特定▶ 次のステップの準備
UEFI and PCI bootkits 27/42
Next Step: ブートローダー.. .
... SEC,PEI
. DXE,BDS
. Grub2. Linux. App.
Power on
.
UEFI firmware
.
Bootloader
.
Operating System
.
LegacyCode
.
Header
.
InitCode
.
ModifiedExitBootServices
.
InterruptHandler
.
ModifiedFork
.
added code
.
1
.
2
.
3
.
4
.
5
.
Load Opt. ROM
.
LoadRO
M
.ExitBS.
.
#D
B
.
fork
UEFI and PCI bootkits 28/42
カーネルの横取り (1/2).. .▶ 展開前のメモリイメージ▶ 物理アドレス ̸= 仮想アドレス▶ カーネル: IDT、GDT、ページネーションなどの初期化▶ モードの変更 (32 -> 64 ビット)、CS、DS …▶ ブレークポイントの使用は困難 (IDT)
..
EarlyKernel
.
DecompressionCode
.
InitPart 2
.
UncompressedImage
.
32 bits
.
32 bits
.
32 →64 bitsresetGDT
+IDT
.
ResetGDT+IDT
...
.
0x1000000
UEFI and PCI bootkits 29/42
カーネルの横取り (2/2).. .
.Use ハードウェアブレークポイント..
......
▶ ハードウェアデバッグレジスタ▶ 割り込みの使用 #DB▶ 割り込みベクタ 1▶ ハードウェアブレークポイント 1: 0x1000000▶ ハードウェアブレークポイント 2: IDT のリロード前、初期化パート 2
UEFI and PCI bootkits 30/42
Next Step: 初期カーネル.. .
... SEC,PEI
. DXE,BDS
. Grub2. Linux. App.
Power on
.
UEFI firmware
.
Bootloader
.
Operating System
.
LegacyCode
.
Header
.
InitCode
.
ModifiedExitBootServices
.
InterruptHandler
.
ModifiedFork
.
added code
.
1
.
2
.
3
.
4
.
5
.
Load Opt. ROM
.
LoadRO
M
.ExitBS.
.
#D
B
.
fork
UEFI and PCI bootkits 31/42
syscall の改竄.. .
▶ システムコールの変更▶ メモリ上のコードにパッチ▶ 権限の上昇▶ 対象のシステムコール: fork▶ syscall のアドレスは?▶ 内部関数のアドレスは?
.変更されたシステムコール..
......
xor %rdi ,%rdicall *0 x f f f f f f f f 8 1 0 6 4 0 6 f ; prepare_kernel_credcall *0 x f f f f f f f f 8 1063db6 ; commit_credsret
UEFI and PCI bootkits 32/42
Next Step: syscall.. .
... SEC,PEI
. DXE,BDS
. Grub2. Linux. App.
Power on
.
UEFI firmware
.
Bootloader
.
Operating System
.
LegacyCode
.
Header
.
InitCode
.
ModifiedExitBootServices
.
InterruptHandler
.
ModifiedFork
.
added code
.
1
.
2
.
3
.
4
.
5
.
Load Opt. ROM
.
LoadRO
M
.ExitBS.
.
#D
B
.
fork
UEFI and PCI bootkits 33/42
Demo
... SEC,PEI
. DXE,BDS
. Grub2. Linux. App.
Power on
.
UEFI firmware
.
Bootloader
.
Operating System
.
LegacyCode
.
Header
.
InitCode
.
ModifiedExitBootServices
.
InterruptHandler
.
ModifiedFork
.
added code
.
1
.
2
.
3
.
4
.
5
.
Load Opt. ROM
.Load
ROM
.
ExitBS.
.
#D
B
.
fork
UEFI and PCI bootkits 34/42
EFI バイトコード.. .
▶ EBC: EFI バイトコード▶ 仕様で定義される EBC 仮想マシン▶ アセンブリに似ているインストラクションでプラットフォームに依存しない
▶ Option ROM で使用可能.EFI バイトコードの例..
......
CC 67 04 00 ADD64 R7, R6 0x4B2 78 30 00 MOVnw @R0( 0 ,+48) , R772 87 30 00 MOVnw R7, @R0( 0,+48)03 07 CALL32 R7
UEFI and PCI bootkits 35/42
EFI バイトコードとセキュリティ.. .
.EBC..
......
▶ ハードウェアに依存しない▶ メモリ制限なし▶ C の関数の呼び出し、および C 関数から呼び出し可能▶ ツールが存在しない、もしくは EBC のサポートが不十分▶ 例としては、ファイルを分析するとクラッシュなど
▶ コードの難読化に最適▶ Portable (複数の � ロードを含む)
..
UEFI and PCI bootkits 36/42
EFI バイトコードとセキュリティ.. .
.EBC..
......
▶ ハードウェアに依存しない▶ メモリ制限なし▶ C の関数の呼び出し、および C 関数から呼び出し可能▶ ツールが存在しない、もしくは EBC のサポートが不十分▶ 例としては、ファイルを分析するとクラッシュなど
▶ コードの難読化に最適▶ Portable (複数の � ロードを含む)
..
UEFI and PCI bootkits 36/42
EFI バイトコードとセキュリティ.. .
.EBC..
......
▶ ハードウェアに依存しない▶ メモリ制限なし▶ C の関数の呼び出し、および C 関数から呼び出し可能▶ ツールが存在しない、もしくは EBC のサポートが不十分▶ 例としては、ファイルを分析するとクラッシュなど▶ コードの難読化に最適▶ Portable (複数の � ロードを含む)
..
UEFI and PCI bootkits 36/42
結果.. ..UEFI PCI Bootkits..
......
▶ 高いステルス性能: ディスクやファイルの変更がなく、占有するメモリも少ない: ステルス性が高い
▶ 高い移植性▶ アップグレードや再インストールでも生き延びる▶ DMA も利用可能▶ ディスクの暗号化に影響されない▶ BIOS パスワード: 対策にならない▶ アンチウイルス (UEFI でも): 無力▶ grsec、ランダム化など: エクスプロイトが困難になるが攻撃の防止にはならない
▶ ソリューション?
UEFI and PCI bootkits 37/42
ソリューション 1: TPM.. .▶ パッシブなコンポーネントの [ はず ]
▶ (ほぼ) すべての PC に搭載▶ アイデア: いくつかの要素を測定▶ 極秘作戦で実際に使われた
.制限事項..
......
▶ アプリケーションの欠如▶ 必ずしもすべてのブートローダでサポートされていない▶ アップデートが複雑に▶ Full Disk Encryption の動作が必須▶ 完全ではないa
aBIOS Chronomancy のプレゼンテーションを参照
UEFI and PCI bootkits 38/42
ソリューション 2: セキュアブート.. .
▶ UEFI の仕様に含まれる▶ ロード済み要素 (実行ファイル、ドライバ、拡張 ROM など) の暗号署名 (RSA2048) の確認
...
Source: Intel Developer Forum 2012
UEFI and PCI bootkits 39/42
ソリューション 2: セキュアブート.. .
▶ UEFI の仕様に含まれる▶ ロード済み要素 (実行ファイル、ドライバ、拡張 ROM など) の暗号署名 (RSA2048) の確認
...
Source: Intel Developer Forum 2012
UEFI and PCI bootkits 39/42
ソリューション 2: セキュアブート.. ..制限事項..
......
▶ 必須ではない (Windows 8 Hardware Certification で必須とされているが)
▶ 互換性サポートモジュール (CSM) を無効にする必要あり▶ 使用制限 (例 ARM タブレット)▶ CA の管理▶ Microsoft 以外の CA を使うには? 再署名か ROM のホワイトリスト?
▶ 完全ではない (例 SPI フラッシュへの直接書き込みaやNVRAM アクセス)
aA tale of one software bypass of windows 8 secure boot, Blackhat 2013
UEFI and PCI bootkits 40/42
結論.. ..ハードウェア..
......
▶ 対策はあるが、実装が不十分もしくは使われていない▶ すべてのファームウェアコンポーネントは改竄から保護されていなければならない
.OEM ベンダへの提案..
......
▶ SPI の書き込みもしくは NVRAM の直接アクセスからUEFI を保護 (リブートモードを除く)
▶ 署名済みアップデートのみを許可▶ 初期ステップ (SEC/PEI) の保護▶ トラストルート S-CRTM (Static Core Root of Trust for
Measurement) の保護▶ そして上記をバグなしで実装
UEFI and PCI bootkits 41/42
今後の課題.. .
.Next..
......
▶ (多くの) UEFI 関数の評価▶ EFI バイトコードの分析▶ Blue Pill に代表される仮想化技術▶ UEFI ファームウェアの逆アセンブル▶ (Secure Boot、IPsec など) 実装の調査
ご質問は?
UEFI and PCI bootkits 42/42