solnik secure enclaveprocessor-pacsec-final-jp

95
詳説 Secure Enclave プロセッサ Tarjei Mandt (@kernelpool) Mathew Solnik (@msolnik) David Wang (@planetbeing)

Upload: pacsecjp

Post on 16-Apr-2017

232 views

Category:

Internet


1 download

TRANSCRIPT

Page 1: Solnik secure enclaveprocessor-pacsec-final-jp

詳説Secure Enclave プロセッサ

Tarjei Mandt (@kernelpool)

Mathew Solnik (@msolnik)

David Wang (@planetbeing)

Page 2: Solnik secure enclaveprocessor-pacsec-final-jp

自己紹介

• Tarjei Mandt

▫ Azimuth Securityシニアセキュリティリサーチャー

[email protected]

• Mathew Solnik

▫ OffCell Researchディレクター

[email protected]

• David Wang

▫ Azimuth Securityシニアセキュリティリサーチャー

[email protected]

Page 3: Solnik secure enclaveprocessor-pacsec-final-jp

はじめに

• iPhone 5Sは技術上のマイルストーンであった▫ 初めての 64-bit 携帯電話

• いくつもの技術的な新規性を導入▫ Touch ID

▫ M7 モーションコプロセッサ

▫ セキュリティ コプロセッサ (SEP)

• 機密情報の安全な記憶が有効になった▫ 指紋情報、暗号キー、その他

Page 4: Solnik secure enclaveprocessor-pacsec-final-jp

Secure Enclave プロセッサ

• SOCの他の部分に安全にサービスを動作させるよう設計されたセキュリティ回路

▫ メインプロセッサが機密データへ直接アクセスすることを防ぐ

• 他の多くのサービスをサポートするために使われる▫ 特にTouch IDなど

• それ専用の独自のOSが動作 (SEPOS)

▫ 専用のカーネル、ドライバ、サービスおよびアプリケーションを含む

Page 5: Solnik secure enclaveprocessor-pacsec-final-jp

Secure (?) Enclave プロセッサ

• SEPに関しては非常に少ない情報だけが公開▫ Appleによって提供された情報のみ

• SEPの特許は高レベルの概要のみ提示▫ 具体的な実装の詳細は記載されていない

• 複数の疑問が残る▫ SEPはどのようなサービスを提供しているのか?

▫ それらのサービスにどのようにアクセスするのか?

▫ どのような権限が必要なのか?

▫ SEPには攻撃に対してどのような効果があるのか?

Page 6: Solnik secure enclaveprocessor-pacsec-final-jp

トークの概要

• パート 1: Secure Enclaveプロセッサ▫ ハードウェアデザイン▫ ブートプロセス

• パート 2: 通信▫ メールボックスの仕組み▫ カーネルとSEP間のインタフェース

• パート 3: SEPOS▫ アーキテクチャ / 内部

• パート 4: セキュリティ分析▫ 攻撃面と堅牢性

Page 7: Solnik secure enclaveprocessor-pacsec-final-jp

詳説 Secure Enclave プロセッサ

Page 8: Solnik secure enclaveprocessor-pacsec-final-jp

SEPのARMコア: Kingfisher

• 専用のARMv7a 「Kingfisher」コア▫ APコアのEL3からではSEPにアクセスできない

• 300-400MHz以上で動作しているようである

• SOC内の複数のKingfisherコアのひとつ▫ 2-4個の他のKFコア - NAND/SmartIO/他に使用

▫ 他のコアから多数のアーキテクチャ情報が得られる

• プラットフォームに応じて変更(A7/A8/A9)

▫ 新しいチップ上での耐タンパーのようである

Page 9: Solnik secure enclaveprocessor-pacsec-final-jp

専用の周辺ハードウェア

• SEPはメモリマップドI/Oによってアクセス可能な独自の周辺回路のセットを持っている▫ APはアクセスできない組み込みのハードウェア

暗号化エンジンや乱数生成期 セキュリティヒューズ GID/UIDキー

• 専用のIO信号線 -▫ 信号線はチップ外の周辺装置へと直接駆動する

GPIO

SPI

UART

I2C

Page 10: Solnik secure enclaveprocessor-pacsec-final-jp

共有の周辺ハードウェア

• SEPとAPはいくつかの周辺回路を共有する• 電源管理(PMGR)

▫ セキュリティヒューズの設定はPMGRに置かれている▫ それ以外にもいくつもの興味深いものがある

• メモリコントローラ▫ iOSカーネル経由でのぞき見ることが可能

• 位相同期(PLL)クロック生成器▫ 特に見どころなし…

• セキュアメールボックス▫ コア間でのデータ転送に使用

• 外部ランダムアクセスメモリ(RAM)

Page 11: Solnik secure enclaveprocessor-pacsec-final-jp

物理メモリ

• 専用のブートROM (といくらかの SRAM)

▫ BootROMの物理配置は 0x2_0da0_0000

• 外部RAMの暗号化にインラインAESを使用▫ SoCのRAMチップを取り外す物理メモリ攻撃に対してもっとも効果的 (iPad)

• APからSEPのメモリアクセスを防止するハードウェア「フィルタ」▫ SEPのKFコアだけがこのフィルタを保有

Page 12: Solnik secure enclaveprocessor-pacsec-final-jp

SEP KF フィルター構成図

From SoC To SoC

ブートROM

メールボックス

コア

SEPフィルタ

Page 13: Solnik secure enclaveprocessor-pacsec-final-jp

詳説 Secure Enclave プロセッサ

Page 14: Solnik secure enclaveprocessor-pacsec-final-jp

SEPの初期化 – 第1ステージ

• APのリセット完了後、APのブートROMがリセットからSEPを開放▫ この動作は不可逆である。APによってアクセス可能なハードウェアレジスタはSEPのリセットや停止はできない

• 初期状態では4096バイトのスタティックRAMがスタックおよび変数のために使用される

• ROM内のページテーブルが使われる▫ 大きな物理アドレス拡張が必要

• メッセージループが開始

Page 15: Solnik secure enclaveprocessor-pacsec-final-jp

SEPの初期化 – 第2ステージ

• メールボックス内のメッセージを受信

• SEPOSが使用するものと同じフォーマットの8バイトのメッセージ

• 全てのメッセージがエンドポイント255を使用(EP_BOOTSTRAP)

オペコード 説明

1, 2 “ステータスチェック” (Ping)

3 nonceの生成

4 nonceワードの取得

5 “BootTZ0” (ブート継続)

Page 16: Solnik secure enclaveprocessor-pacsec-final-jp

メモリ保護

• SEPは4096バイトのSRAMより多くのメモリがいるため、外部のRAMを必要とする

• SEPの使用するRAMはAP改ざんから保護されなければならない

• APによって設定可能な2つの領域がセットアップされる:▫ TZ0はSEP向け▫ TZ1はAPの信頼ゾーン(カーネルパッチ保護)向け

• SEPはブート時のAPによるTZoのセットアップを待たなければならない

Page 17: Solnik secure enclaveprocessor-pacsec-final-jp

SEP 起動フロー

TZ0 と TZ1の設定

Ping送信

Send BootTZ0

Ping送信

AP

Acknowledge Ping

SEP

Map in TZ0

メモリ暗号化のセットアップ

Acknowledge BootTZ0

ステージ3の開始

iBoot

カーネル

ステージ3

ステージ2

Page 18: Solnik secure enclaveprocessor-pacsec-final-jp

SEP メモリ保護 ブートストラップ

• SEPはTZ0がロック中にAPのワードを取得することはない

▫ ロックのためにハードウェアレジスタをチェック

▫ そののちに他のハードウェアレジスタからTZ0のサイズとアドレスを読み取る

• TZ0ロック後はこれらのハードウェアレジスタは変更不可

• 故障時にはプロセッサをスピン

TZ0 と TZ1 の設定

Ping送信

Send BootTZ0

Ping送信

Acknowledge Ping

Map in TZ0

メモリ暗号化のセットアップ

Acknowledge BootTZ0

ステージ3の開始

iBoot

Kernel

Stage 3

Stage 2

Page 19: Solnik secure enclaveprocessor-pacsec-final-jp

メモリ暗号化モード

• ECB、CBCおよびXEXをサポートしている模様• AES-128およびAES-256が使用可能• 2つのチャンネルをサポート

▫ ブートROMはチャンネル1を使用▫ SEPOSはチャンネル0を使用

• 物理アドレスの領域へのすべてのアクセスにおいて暗号化/復号は透過的に行われる▫ ブート後、SEPOSは暗号化領域の全ページのマッピングを保持する (ハードウェア領域およびAPとの共有メモリを除く)

Page 20: Solnik secure enclaveprocessor-pacsec-final-jp

キーの生成

• キーは“tangling”によって生成される:▫ 真の乱数生成出力▫ スタティックな“type”の値

• 保護された(読み取り不可の)レジスタを使用:▫ UID、GID、シードA、シードB

UIDに絡んだシードB == GenID_2B

• キーを生成するため、GenID_2Bを用いて以下のように暗号化:▫ [4 バイトマジック = 0xFF XK1][4バイト 0s][192ビットの乱数]

Page 21: Solnik secure enclaveprocessor-pacsec-final-jp

ステージ3の開始

• メモリ暗号化のセットアップ後、SEPは暗号化メモリを使用するために再び初期化:

▫ ページテーブル

▫ スタック

▫ データ

• 初期の低能力のブートストラップとの間でコード共有なしの新しいメッセージループを開始

TZ0 と TZ1 の設定

Ping送信

Send BootTZ0

Ping送信

Acknowledge Ping

Map in TZ0

メモリ暗号化のセットアップ

Acknowledge BootTZ0

ステージ3の開始

iBoot

Kernel

Stage 3

Stage 2

Page 22: Solnik secure enclaveprocessor-pacsec-final-jp

SEP ブートフロー: ステージ3

ART送信

AP

Acknowledge Ping

SEP

Acknowledge ART

Copy in ART

共有メモリのアドレスを送信

SEPOS送信

Copy in SEPOS

Validate SEPOS and ART

Acknowledge SEPOS

SEPOSのブート

Page 23: Solnik secure enclaveprocessor-pacsec-final-jp

ブートローディング: Img4

• SEPはASN.1 DER エンコードに基づく“IMG4”ブートローダフォーマットを使用▫ 64bit iBoot/AP ブートROMと酷似▫ ”openssl -asn1parse”でパース可能

• SEPの使用する重要な3つのオブジェクト▫ ペイロード –

暗号化されたsepファームウェアを格納▫ リストア –

SEPをリストアする際の基本的な情報を格納▫ マニフェスト (またはAPチケット) -

ブートROM設定(およびセキュリティ)のアルファおよびオメガに影響

Page 24: Solnik secure enclaveprocessor-pacsec-final-jp

Img4 - マニフェスト

• マニフェスト(APTicket)には、SEP(OS)を認証し設定するために必要な重要情報のほとんどが含まれている

• 複数のハードウェア識別タグが含まれている▫ ECID▫ ChipID▫ その他

• ソフトウェアとハードウェアの両方で実行時の設定を変更するためにも使用される▫ DPRO –プロダクションの降格▫ DSEC –セキュリティの降格▫ その他…

Page 25: Solnik secure enclaveprocessor-pacsec-final-jp

SEPのImg4パーサのリバース: ステージ1

• 見れないものをどのようにリバースしよう?

▫ 再利用されていそうなコードを探そう!

• IMG4をパースしている別の箇所▫ AP ブートROM –取得には少しの痛み

▫ iBoot –物理メモリからダンプ - 0x8700xx000

シンボルは多くない…

しかし、時にはそれだけで取り出せる…

(iBoot from n51)

Page 26: Solnik secure enclaveprocessor-pacsec-final-jp

SEPのImg4パーサのリバース: ステージ2

• 別ファイルには “Img4Decode” シンボルが含まれている▫ /usr/libexec/seputil

• ユーザランドのIMG4パーサにはよりたくさんのシンボル▫ 正確ではないかも – しかしbindiffの表示は非常に近い

• seputilから推測可能なシンボルが見つかる:

▫ ASN’1 デコーダは libDERをベースにしている Appleが親切にもオープンソースとしてリリースしている

▫ RSA 部分は CoreCryptoによって処理されている

• LibDER + CoreCrypto = SEPのIMG4パースエンジン▫ 動作させるのに適したベースが手に入った

Page 27: Solnik secure enclaveprocessor-pacsec-final-jp

Img4パースのフロー

• SEP ブートROM はAPから sep-firmware.img4をコピー

• DER デコーダの初期化▫ ペイロードとマニフェスト、リストア情報のデコード

• ダイジェストと署名の証明書を検証▫ ルート証明書はブートROMのエンドポイントにハードコード

• マニフェスト内の全プロパティを検証▫ 現在のハードウェア構成に対してチェック

• 全項目パスすれば –ペイロードのロードおよび実行

Page 28: Solnik secure enclaveprocessor-pacsec-final-jp

Img4パースのフロー

AP

ペイロードとマニフェストのデコード

SEP

ダイジェストの検証

証明書の検証 失敗

マニフェストの検証

証明書のプロパティに対する検証

ハードウェアのプロパティに対する検証

SEPOSのブート

構成の読み込み

SEP

SEP IMG4送信

Page 29: Solnik secure enclaveprocessor-pacsec-final-jp

詳説 Secure Enclave プロセッサ

Page 30: Solnik secure enclaveprocessor-pacsec-final-jp

セキュアメールボックス

• セキュアメールボックスによりAPはSEPと通信が可能になる▫ inbox(リクエスト)とoutbox(リプライ)の両方の機能

• SEPのデバイスI/Oレジスタを用いて実装▫ SEP構成空間として知られている

Page 31: Solnik secure enclaveprocessor-pacsec-final-jp

割り込みベースのメッセージパッシング

• メッセージ送信時は、APはメールボックスの inboxに書き込み

• このオペレーションはSEPに割り込みを発生させる▫ SEPにメッセージを受信したことを通知する

• リプライ準備が完了した時に、SEPが outboxにメッセージを書き込む▫ APにメッセージの受信を知らせるために、別の割り込みが発生される

Page 32: Solnik secure enclaveprocessor-pacsec-final-jp

メールボックスのメカニズム

StartWrite

operation?Read

operation?No

Yes

Address == Inbox

Data written to outbox?

Update inbox with write data

Generate interrupt for SEP processor

Yes

Ignore write operation

No

Address == Outbox

Yes

Respond to read with nonce data

No

Respond to read with outbox data

Yes

No

Yes

Done

Generate interrupt for AP processor

No

Page 33: Solnik secure enclaveprocessor-pacsec-final-jp

メールボックスのメッセージフォーマット

• 単一メッセージのサイズは8バイト

• フォーマットは受信側のエンドポイントに依存

• 最初のバイトはつねに宛先エンドポイントを指す

struct {

uint8_t endpoint; // destination endpoint number

uint8_t tag; // message tag

uint8_t opcode; // message type

uint8_t param; // optional parameter

uint32_t data; // message data

} sep_msg;

Page 34: Solnik secure enclaveprocessor-pacsec-final-jp

SEP マネージャ

• SEPと通信するための汎用的なフレームワークを提供▫ AppleSEPManager.kext内に実装

▫ IOPの提供する機能のうえに実装

• ドライバはSEPエンドポイントを登録することができる▫ 特定のSEPアプリやサービスと対話するために使用

▫ ユニークなインデックス値が割り当てられる

• またそれぞれ独自の複数のエンドポイントを実装▫ 例えば、SEPコントロールエンドポイント

Page 35: Solnik secure enclaveprocessor-pacsec-final-jp

SEP エンドポイント (1/2)

Index 名称 ドライバ

0 AppleSEPControl AppleSEPManager.kext

1 AppleSEPLogger AppleSEPManager.kext

2 AppleSEPARTStorage AppleSEPManager.kext

3 AppleSEPARTRequests AppleSEPManager.kext

4 AppleSEPTracer AppleSEPManager.kext

5 AppleSEPDebug AppleSEPManager.kext

6 <not used>

7 AppleSEPKeyStore AppleSEPKeyStore.kext

Page 36: Solnik secure enclaveprocessor-pacsec-final-jp

SEP エンドポイント (2/2)

Index 名称 ドライバ

8 AppleMesaSEPDriver AppleMesaSEPDriver.kext

9 AppleSPIBiometricSensor AppleBiometricSensor.kext

10 AppleSEPCredentialManager AppleSEPCredentialManager.kext

11 AppleSEPPairing AppleSEPManager.kext

12 AppleSSE AppleSSE.kext

254 L4Info

255 Bootrom SEP Bootrom

Page 37: Solnik secure enclaveprocessor-pacsec-final-jp

エンドポイントのコントロール (EP0)

• SEP宛てに発行されたコントロールリクエストを処理

• out-of-lineバッファをリクエストとリプライを設定するために使用

• nonceを生成、読み取り、無効化するためのインタフェースを提供

• SEPマネージャのユーザクライアントは、コントロールエンドポイントと対話するためのサポートを提供▫ SEPユーティリティによって利用 (/usr/libexec/seputil)

Page 38: Solnik secure enclaveprocessor-pacsec-final-jp

コントロールエンドポイントのオペコード

オペコード 名称 説明

0 NOP SEPの起動に使われる

2 SET_OOL_IN_ADDR out-of-lineバッファのアドレス要求

3 SET_OOL_OUT_ADDR out-of-line bufferアドレスの応答

4 SET_OOL_IN_SIZE リクエストバッファのサイズ

5 SET_OOL_OUT_SIZE リプライバッファのサイズ

10 TTYIN SEP コンソールへの書き込み

12 SLEEP SEPのスリープ

Page 39: Solnik secure enclaveprocessor-pacsec-final-jp

Out-of-line バッファ

• 割り込みベースのメールボックスを使用しての大量のデータ転送は低速▫ Out-of-line バッファは巨大データの転送に使われる

• SEPマネージャはSEPから見えるメモリを割り当てる方法を提供する▫ AppleSEPManager::allocateVisibleMemory(…)▫ 実際に物理メモリの一部を割り当てる

• コントロールエンドポイントはターゲットエンドポイントへのリクエスト/リプライバッファを割り当てるために使われる

Page 40: Solnik secure enclaveprocessor-pacsec-final-jp

エンドポイントの登録 (AP)

Allocate SEP visible memory

Create AppleSEPEndpoint

object

Insert endpoint in endpoint table

OOL buffers required?

Yes

Assign send buffer to endpoint

Allocate SEP visible memory

Register OOL buffer with SEP via EP0

Register OOL buffer with SEP via EP0

Assign receive buffer to endpoint

DoneNo

Start

Physically contiguious memory region

AppleSEPManager::endpointForHandle()

Inserts endpoint at the specified table index

Page 41: Solnik secure enclaveprocessor-pacsec-final-jp

SEP を使用するドライバ

• 現在、いくつかのドライバはその動作のためにSEPに依存している

• 以前はカーネル内に置かれていたドライバのいくつかのパーツはSEP内に移動された▫ Apple(SEP)KeyStore

▫ Apple(SEP)CredentialManager

• ほとんどのドライバはSEP内に対応するドライバを持っている

Page 42: Solnik secure enclaveprocessor-pacsec-final-jp

詳説 Secure Enclave プロセッサ

Page 43: Solnik secure enclaveprocessor-pacsec-final-jp

L4

• マイクロカーネルの一系統

• 1993年にJochen Liedtkeによって発表▫ L3からの発展 (1980年代半ば)

• それ以前のマイクロカーネルの低パフォーマンスに対応するために開発された▫ L3よりもIPCパフォーマンスを10-20倍高速に改善

• 多数の亜種および実装▫ 例:組み込みシステム向けに最適化された L4-

embedded

Page 44: Solnik secure enclaveprocessor-pacsec-final-jp

SEPOS

• Darbat/L4-embedded ベース (ARMv7)

▫ Appleによるカスタマイズ

• 独自のドライバ、サービス、アプリケーションを実装▫ macho バイナリとしてコンパイルされている

• カーネルは最小限のインタフェースセットのみ提供

▫ オペレーティングシステムの多くの部分がユーザランド上に実装

Page 45: Solnik secure enclaveprocessor-pacsec-final-jp

SEPOS アーキテクチャ

SEP Drivers SEP ServicesSEPOS

(Bootstrap Server)

Secure Key StoreSecure Credential

ManagerSecure Biometric

Engine

Hardware

SSEART Manager /

ART Mate

Embedded Runtime (ERT)

libSEPOS

Kernel (L4)

Core SEPOS Components

SEP Applications

Page 46: Solnik secure enclaveprocessor-pacsec-final-jp

カーネル (L4)

• 利用可能な状態にマシンを初期化▫ カーネルページテーブルの初期化

▫ カーネルインタフェースページ(KIP)のセットアップ

▫ ハードウェア上での割り込みの設定

▫ タイマーのスタート

▫ カーネルスケジューラの初期化および開始

▫ ルートタスクの開始

• 小さいシステムコールのセット(~20) を提供

Page 47: Solnik secure enclaveprocessor-pacsec-final-jp

システムコール (1/2)

Num Name Description

0x00 L4_Ipc 2スレッド間でのIPCをセットアップ

0x00 L4_Notify スレッド通知

0x04 L4_ThreadSwitch スレッド実行の切り替え

0x08 L4_ThreadControl スレッドの生成または削除

0x0C L4_ExchangeRegisters 他のスレッドとのレジスタの交換

0x10 L4_Schedule スレッドスケジュール情報の設定

0x14 L4_MapControl 仮想メモリのマッピングまたは解放

0x18 L4_SpaceControl 新しいアドレス空間の生成

0x1C L4_ProcessorControl プロセッサ属性の設定

Page 48: Solnik secure enclaveprocessor-pacsec-final-jp

システムコール (2/2)

Num Name Description

0x20 L4_CacheControl キャッシュのフラッシュ

0x24 L4_IpcControl IPCアクセスの制限

0x28 L4_InterruptControl 割り込みの有効・無効化

0x2C L4_GetTimebase システム時刻の取得

0x30 L4_SetTimeout IPCセッションのタイムアウトの設定

0x34 L4_SharedMappingControl 共有メモリのセットアップmapping

0x38 L4_SleepKernel ?

0x3C L4_PowerControl ?

0x40 L4_KernelInterface カーネル情報の取得

Page 49: Solnik secure enclaveprocessor-pacsec-final-jp

特権システムコール

• いくつかのシステムコールは特権が必要と思われる▫ 例:メモリやスレッド管理の呼び出し

• ルートタスク (SEPOS) のみが特権システムコールを呼び出すことができる▫ 呼び出し側空間のアドレスによって決定される

• 必要時にそれぞれのシステムコールによって行われる検査▫ is_privileged_space()

Page 50: Solnik secure enclaveprocessor-pacsec-final-jp

特権システムコール

SYS_SPACE_CONTROL (threadid_t space_tid, word_t control, fpage_t kip_area,

fpage_t utcb_area)

{

TRACEPOINT (SYSCALL_SPACE_CONTROL,

printf("SYS_SPACE_CONTROL: space=%t, control=%p, kip_area=%p, "

"utcb_area=%p¥n", TID (space_tid),

control, kip_area.raw, utcb_area.raw));

// Check privilege

if (EXPECT_FALSE (! is_privileged_space(get_current_space())))

{

get_current_tcb ()->set_error_code (ENO_PRIVILEGE);

return_space_control(0, 0);

}

...

} INLINE bool is_privileged_space(space_t *

space)

{

return (is_roottask_space(space);

}

L4_SpaceControl

システムコールにてルートタスクのチェック

from darbat 0.2 source

Page 51: Solnik secure enclaveprocessor-pacsec-final-jp

SEPOS (初期化)

• ブート時の初期プロセス (ルートタスク)

▫ 任意の特権L4システムコールを呼び出し可能

• 残りの全てのタスクの初期化および開始▫ SEPファームウェアによって組み込まれたアプリケーションリストを処理

• 各タスクのコンテキスト構造の維持

▫ 仮想アドレス空間、特権レベル、スレッド等に関する情報を含む

• ブートストラップサーバの立ち上げ

Page 52: Solnik secure enclaveprocessor-pacsec-final-jp

SEPOS アプリの初期化

Initialize Apps

proc_create( ) No Last app in list?

Done

Yes

macho2vm( ) thread_create( )

ertp_map_page( )

Read application list from sep-firmware

Compute CRC of loaded images

CRC valid?

Panic

Yes

No

Create and start new thread at app entry point (L4_ThreadControl)

Reads Mach-O header and maps segments

(L4_MapControl)

Creates new process and address space (L4_SpaceControl)

Maps the Mach-O header from physical

memory

Compares CRC with value stored in sep-firmware

Page 53: Solnik secure enclaveprocessor-pacsec-final-jp

アプリケーション リスト

• SEPファームウェアによって組み込まれている全てのアプリケーションの情報が含まれている▫ 物理アドレス (オフセット)

▫ 仮想ベースアドレス

▫ モジュール名とサイズ

▫ エントリポイント

• SEPファームウェアイメージ内のSEPOSバイナリより前にある0xEC8バイトを見つける

Page 54: Solnik secure enclaveprocessor-pacsec-final-jp

アプリケーション リスト

サイズエントリーポイント

仮想アドレス

物理アドレス(オフセット)

Page 55: Solnik secure enclaveprocessor-pacsec-final-jp

ブートストラップサーバ

• SEPOSのコア機能を実装▫ システム、スレッド、オブジェクト(メモリ)マネージメントのためのメソッドをエクスポート

• 組込みランタイム経由でRPCによってSEPアプリケーションに実現可能となる▫ ert_rpc_bootstrap_server()

• Enable applications to perform otherwise privileged operationsアプリケーションに特権操作を実行することを可能にする▫ 例: 新しいスレッドの生成

Page 56: Solnik secure enclaveprocessor-pacsec-final-jp

特権メソッド

• アプリケーションはブートストラップサーバの特定のメソッドを呼び出すために特権が必要▫ オブジェクト/プロセス/acl/マッピング情報の問合せ

• 特権レベルはプロセス生成時に決定される▫ プロセス名は‘A ’から‘ZZZZ’の範囲

▫ 例: “SEPD” (SEPDrivers)

• チェックは各メソッドによって行われる▫ proc_has_privilege( int pid );

Page 57: Solnik secure enclaveprocessor-pacsec-final-jp

sepos_object_acl_info( )

int sepos_object_acl_info(int *args)

{

int result;

int prot;

int pid;

args[18] = 1;

*((_BYTE *)args + 104) = 1;

result = proc_has_privilege( args[1] );

if ( result == 1 )

{

result = acl_get( args[5], args[6], &pid, &prot);

if ( !result )

{

args[18] = 0;

args[19] = prot;

args[20] = pid;

result = 1;

*((_BYTE *)args + 104) = 1;

}

}

return result;

}

送信側のPIDが特権付きかのチェックを呼出し

Page 58: Solnik secure enclaveprocessor-pacsec-final-jp

資格

• いくつかのメソッドは特別の資格を必要とする▫ sepos_object_create_phys()

▫ sepos_object_remap()

• 任意の物理メモリマッピングからの非特権アプリケーションを防止しようとする

• 起動時にプロセスに割り当て▫ 資格決定のために使われる別のテーブル

Page 59: Solnik secure enclaveprocessor-pacsec-final-jp

資格の割り当て

int proc_create( int name )

{

int privileged = 0;

...

if ( ( name >= 'A ' ) && ( name <= 'ZZZZ' ) )

privileged = 1;

proctab[ pid ].privileged = privileged;

proctab[ pid ].entitlements = 0;

while ( privileged_tasks[ 2 * i ] != name )

if ( ++i == 3 )

return pid;

proctab[ pid ].entitlements = privileged_tasks[ 2 * i + 1 ];

return pid;

}

Page 60: Solnik secure enclaveprocessor-pacsec-final-jp

資格の割り当て

タスク名 資格

SEPDrivers MAP_PHYS

ARTManager/ARTMate MAP_PHYS | MAP_SEP

Debug MAP_PHYS | MAP_SEP

• MAP_PHYS (2)

▫ アクセス(マップ)するために必要な物理領域

• MAP_SEP (4)

▫ 同上、ただし物理領域がSEPメモリをターゲットとしている場合に必要

Page 61: Solnik secure enclaveprocessor-pacsec-final-jp

SEP ドライバー

• 全てのSEPドライバーのホスト▫ AKF, TRNG, Expert, GPIO, PMGR, 他

▫ 完全にユーザモードで実装

• 各ドライバのデバイスI/Oレジスタをマップ▫ ローレベルなドライバの操作を有効にする

• 専用のドライバAPIを用いてSEPアプリケーションに公開される

▫ ルックアップ、コントロール、読み込み、書き込みのための関数を含む

Page 62: Solnik secure enclaveprocessor-pacsec-final-jp

ドライバの相互作用

SEPOS

SEPDrivers

Lookup handle to SEPD service

Driver

Driver lookupLookup handle to

driver

Driver control / read / write

Perform driver operation

DriverDriver

Registers SEPD service

on startup

Retrieves SEPD thread handle from list

Page 63: Solnik secure enclaveprocessor-pacsec-final-jp

AKF ドライバー

• SEPOS内のAP/SEPエンドポイントの管理

• コントロール (EP0) リクエストの処理▫ 例: リプライおよびレスポンスのためのOOLバッファオブジェクトのセットアップ

• SEPアプリケーションは特定のAPリクエストを処理するために新しいエンドポイントを登録することができる▫ AKF_ENDPOINT_REGISTER (0x412C) コントロールリクエスト

Page 64: Solnik secure enclaveprocessor-pacsec-final-jp

SEP サービス

• さまざまなSEP関連のサービスをホスト▫ セキュアなキー生成サービス

▫ テストサービス

▫ アンチ リプライサービス

▫ 資格情報サービス

• 通常、ドライバ上に実装

• サービスAPIのSEPアプリケーションへの提供▫ service_lookup(…)

▫ service_call(…)

Page 65: Solnik secure enclaveprocessor-pacsec-final-jp

サービスの相互作用

SEPOS

sepServices

Lookup handle to sepS service

Service

Service lookupLookup handle to

service

Service callIssue a service

request

ServiceService

Registers sepS service

on startup

Retrieves sepS thread handle from list

Page 66: Solnik secure enclaveprocessor-pacsec-final-jp

SEP アプリケーション

• APで動作する様々なドライバをサポートするように設計▫ AppleSEPKeyStore sks

▫ AppleSEPCredentialManager scrd

• いくつかのアプリは特定のデバイスのみで見られる▫ 例: SSEはiPhone 6以降のみに提供

• 開発ビルドに対して排他的であってもよい▫ 例: デバッグアプリケーション

Page 67: Solnik secure enclaveprocessor-pacsec-final-jp

詳説 Secure Enclave プロセッサ

Page 68: Solnik secure enclaveprocessor-pacsec-final-jp

攻撃界面: SEPOS

• 多くのデータにおいてAPとSEP間での通信する方法が含まれている▫ メールボックス (エンドポイント)

▫ 共有リクエスト/リプライバッファ

• 攻撃者はすでにAPカーネルレベルでの特権を手に入れているという前提▫ EL1での任意コード実行が可能

Page 69: Solnik secure enclaveprocessor-pacsec-final-jp

攻撃界面: AKF エンドポイント

• AKFとともに登録されたすべてのエンドポイントは潜在的なターゲットである▫ SEPドライバとアプリケーションの両方を含む

• エンドポイントを必要としないSEPマネージャ(AP)での登録▫ メールボックスに直接書き込むことができる

▫ 代わりに、我々は独自のエンドポイントをSEPマネージャに登録できる

Page 70: Solnik secure enclaveprocessor-pacsec-final-jp

攻撃界面: AKF エンドポイント

エンドポイント 所有者 OOL In OOL Out 注記

0 SEPD/ep0

1 SEPD/ep1 ✓

2 ARTM ✓ ✓ iPhone 6 and prior

3 ARTM ✓ ✓ iPhone 6 and prior

7 sks ✓ ✓

8 sbio/sbio ✓ ✓

10 scrd/scrd ✓ ✓

12 sse/sse ✓ ✓ iPhone 6 and later

List of AKF registered endpoints (iOS 9) and their use of out-of-line request and reply buffers

Page 71: Solnik secure enclaveprocessor-pacsec-final-jp

攻撃界面: エンドポイント ハンドラ

SEP バイオメトリクスメッセージハンドラ

Page 72: Solnik secure enclaveprocessor-pacsec-final-jp

耐攻撃性

• SEPの脆弱性を攻略するためにはどれくらいの労力が必要か?

▫ 例: スタック/ヒープの改変

• 複数の要因によって決定される▫ アドレス空間のレイアウト

▫ アロケータ(ヒープ)の堅牢化

▫ エクスプロイットの緩和策

▫ その他

Page 73: Solnik secure enclaveprocessor-pacsec-final-jp

アドレス空間のレイアウト

• SEPアプリケーションは適切なベースアドレスにロードされる▫ イメージベースのランダム化なし

▫ 典型的には 0x1000 または 0x8000 に配置(ページゼロセグメントの存在に依存)

• 適切なメモリ保護マスク(!=0)のないセグメントは無視される▫ 例: __PAGEZERO は決して「マップ済み」とならない

Page 74: Solnik secure enclaveprocessor-pacsec-final-jp

Stack

TEXTMain Thread

Thread 2

Stack

DATA

MappingThread 3

Stack

Virtual Memory

System stack (0x1000 bytes)

Application Image

スタックの改変

• SEPアプリケーションのメインスレッドはイメージ埋め込みのスタックを使用▫ 破壊により隣接するDATAセグメントのデータを上書きする可能性

• SEPOSによって起動された追加スレッドのスタックはオブジェクトを使用してマッピングされる▫ ギャップとともに配置 “保護ページ”

Page 75: Solnik secure enclaveprocessor-pacsec-final-jp

スタックの改変

• SEPアプリケーションはスタックcookie保護付きでコンパイルされる▫ Cookieの値は ‘GARD’の固定値

▫ 偽造/バイパスは簡単

• スタックはほとんどの場合既知のアドレス▫ メインスレッドのスタックは既知のアドレス上にある

▫ 後続スレッドのスタックのアドレスは予測可能

Page 76: Solnik secure enclaveprocessor-pacsec-final-jp

ヒープの改変: malloc()

• SEPアプリの使っているランタイムアロケータ▫ K&R 実装

• ポインタとブロックサイズを含むヘッダを持つ単一のリンクフリーリスト(サイズ順に並んでいる)

▫ struct Header { void * ptr, size_t size };

▫ free()時に隣接する要素を結合

• ヒープサイズは初期化時に決定される▫ malloc_init( malloc_base, malloc_top );

▫ 拡張しない

Page 77: Solnik secure enclaveprocessor-pacsec-final-jp

ヒープの改変: malloc()

Next

Size

Data (Free) Data (In Use)

Next

Size

Data (Free)

Free List Next

Size

Image DATA segment

Page 78: Solnik secure enclaveprocessor-pacsec-final-jp

ヒープの改変: malloc()

• ヒープのメタデータに対する保護はなし▫ フリーリストポインタの上書きが可能

▫ ブロックサイズの改変の可能性がある

• 割り当てアドレスが予測可能▫ アプリケーションイメージ内の__DATAセグメントによって埋め込まれたMallocエリア

▫ 連続の順序でアロケートされる

Page 79: Solnik secure enclaveprocessor-pacsec-final-jp

非実行保護

• SEPOS は非実行の保護機構を実装している

• ページが実行可能とマークされていない限りは常にセットされる▫ space_t::map_fpage()

▫ ページテーブルエントリの XN と PXN ビットがセット

• ノンセキュア (NS) ビットもSEPメモリの領域外すべてのページにセットされる

Page 80: Solnik secure enclaveprocessor-pacsec-final-jp

SEPOS 緩和機構 まとめ

緩和機構 提供 注

スタックcookie保護 Yes (…) ‘GARD’ –たいていは効果なし

メモリレイアウトのランダム化

ユーザー No

カーネル No イメージベース: 0xF0001000

スタックガードページ Yes/No メインスレッドにはなし

ヒープ メタデータ保護 No

Nullページ保護 No ルートタスクのページマップ必須

非実行保護 Yes XN と PXN両方

Page 81: Solnik secure enclaveprocessor-pacsec-final-jp

攻撃界面: ブートROM

• 効果的であるのは2つの大きな攻撃界面のみ▫ IMG4 パーサ

メモリ破壊

ロジックの不備

▫ ハードウェアベース

• マイナーなアンチexploitの緩和策のみ提供▫ ASLRなし

▫ 基本的なスタックガード

▫ ひとつでも適当なバグがあればゲームオーバー

Page 82: Solnik secure enclaveprocessor-pacsec-final-jp

IMG4の攻撃

• ASN.1はうまく動作させるために非常にトリッキーである▫ OpenSSL, NSS, ASN1C, その他に多くの脆弱性

• LibDER自体は比較的信頼できる▫ “他のDERパッケージと違い、LibDERではエンコードやデコードの際にmallocやコピーを行いません”

– LibDERの readme.txt

▫ KISS の設計思想

• しかし、それを呼び出すラッピングコードはそうではない▫ seputil やそれに類するもの

▫ コードが libDER自身より非常に複雑

Page 83: Solnik secure enclaveprocessor-pacsec-final-jp

攻撃界面: ハードウェア

• データ受信のための周辺信号ライン上でのメモリ破壊攻撃▫ SPI ▫ I2C▫ UART

• サイドチャネル/差動電力解析▫ A7特有 (新しいものほど耐性がある)

• グリッチ▫ 標準クロック/電圧方法▫ 他

Page 84: Solnik secure enclaveprocessor-pacsec-final-jp

外部RAM

• 暗号化メモリは検証されない▫ SEPメモリのビット破壊が可能

• 暗号キーを生成する際に、“ランダム要素”が暗号なしの外部RAMに一時的に保存される

▫ これにより攻撃者は最終的なメモリ暗号キーの生成に対して影響を与えることができる

Page 85: Solnik secure enclaveprocessor-pacsec-final-jp

ヒューズアレイへの攻撃

• 潜在的にもっとも侵略的な攻撃ベクタのひとつ▫ 多くの忍耐が必要

▫ 高い可能性

• レーザーが使用可能▫ 高価な手法 -我々向けではない

• 主なターゲット▫ プロダクションモード

▫ セキュリティモード

Page 86: Solnik secure enclaveprocessor-pacsec-final-jp

終盤: JTAG

▫ 2000以上のピンのソケットが必要

▫ CRCとヒューズ封印のバイパスが必要

▫ “FSRC” ピン - ヒューズアレイへのライン?

• ヒューズ検知ルーチンの誤動作

• IMG4 パーサの攻撃▫ DSECとDPROはそもそも本当に何を行う?

A8 SoC Pins

Page 87: Solnik secure enclaveprocessor-pacsec-final-jp

詳説 Secure Enclave プロセッサ

Page 88: Solnik secure enclaveprocessor-pacsec-final-jp

まとめ

• SEP(OS) はセキュリティを考慮して設計されている▫ メールボックスインタフェース

▫ 権限の分離

• しかし、SEP(OS)からは基本的な攻撃対策が欠けている▫ 例えば、メモリレイアウトのランダム化など

• いくつかのSEPアプリケーションは重大な攻撃界面を露出させている▫ 例: SEP バイオメトリクスアプリケーション

Page 89: Solnik secure enclaveprocessor-pacsec-final-jp

まとめ (続き)

• 全体的なハードウェアのデザインは競合よりもはるかに先▫ ハードウェアフィルタ

▫ インラインでの暗号化されたRAM

▫ 一般的には小さい攻撃界面

• しかし、弱点もある▫ 共有 PMGR と PLL は攻撃に対してオープン

▫ ヒューズソースピンが含まれていることは再考に値する

▫ 降格機能はむしろ危険であるように見える Lightning経由のJTAGがなぜ存在している?

Page 90: Solnik secure enclaveprocessor-pacsec-final-jp

Thanks!

• Ryan Mallon

• Daniel Borca

• Anonymous reviewers

Page 91: Solnik secure enclaveprocessor-pacsec-final-jp

詳説 Secure Enclave プロセッサ

Page 92: Solnik secure enclaveprocessor-pacsec-final-jp

SEPOS: システムメソッドクラス Id メソッド 説明 特権

0 0 sepos_proc_getpid() プロセスのpidを取得

0 1 sepos_proc_find_service() 登録済みのサービスを名前から検索

0 1001 sepos_proc_limits() プロセスの制限情報を問い合わせる x

0 1002 sepos_proc_info() プロセス情報を問い合わせる

0 1003 sepos_thread_info() スレッドの情報を問い合わせる

0 1004 sepos_thread_info_by_tid() スレッドIDの情報を問い合わせる

0 1100 sepos_grant_capability() - x

0 2000 sepos_panic() OSをパニックにする

Page 93: Solnik secure enclaveprocessor-pacsec-final-jp

SEPOS: オブジェクトメソッド (1/2)

クラス Id メソッド 説明 特権

1 0 sepos_object_create() 匿名オブジェクトを生成

1 1 sepos_object_create_phys() 物理領域からオブジェクトを生成 x (*)

1 2 sepos_object_map() タスクのアドレスにオブジェクトをマッピング

1 3 sepos_object_unmap() オブジェクトのマップ解除(未実装)

1 4 sepos_object_share() オブジェクトをタスクと共有

1 5 sepos_object_access() オブジェクトのアクセス制御リストを問合わせ

1 6 sepos_object_remap() オブジェクトの物理領域を再マッピング x (*)

1 7 sepos_object_share2() マニフェストをタスクと共有

Page 94: Solnik secure enclaveprocessor-pacsec-final-jp

SEPOS: オブジェクトメソッド (2/2)

クラス Id メソッド 説明 特権

1 1001 sepos_object_object_info() オブジェクトの情報を問い合わせる x

1 1002 sepos_object_mapping_info() マッピング情報を問い合わせる x

1 1003 sepos_object_proc_info() プロセス情報を問い合わせる x

1 1004 sepos_object_acl_info() アクセス制御リスト情報を問い合わせる x

Page 95: Solnik secure enclaveprocessor-pacsec-final-jp

SEPOS: スレッドメソッドクラス Id メソッド 説明 特権

2 0 sepos_thread_create() 新しいスレッドを生成

2 1 sepos_thread_kill() スレッドをKillする (実装されていない)

2 2 sepos_thread_set_name() スレッドのサービス名を設定

2 3 sepos_thread_get_info() スレッドの情報を取得