SlideShare a Scribd company logo
詳説
Secure Enclave プロセッサ
Tarjei Mandt (@kernelpool)
Mathew Solnik (@msolnik)
David Wang (@planetbeing)
自己紹介
• Tarjei Mandt
▫ Azimuth Security シニアセキュリティリサーチャー
▫ tm@azimuthsecurity.com
• Mathew Solnik
▫ OffCell Research ディレクター
▫ ms@offcellresearch.com
• David Wang
▫ Azimuth Security シニアセキュリティリサーチャー
▫ dw@azimuthsecurity.com
はじめに
• iPhone 5S は技術上のマイルストーンであった
▫ 初めての 64-bit 携帯電話
• いくつもの技術的な新規性を導入
▫ Touch ID
▫ M7 モーション コプロセッサ
▫ セキュリティ コプロセッサ (SEP)
• 機密情報の安全な記憶が有効になった
▫ 指紋情報、 暗号キー、 その他
Secure Enclave プロセッサ
• SOCの他の部分に安全にサービスを動作させるよう
設計されたセキュリティ回路
▫ メインプロセッサが機密データへ直接アクセスすること
を防ぐ
• 他の多くのサービスをサポートするために使われる
▫ 特にTouch IDなど
• それ専用の独自のOSが動作 (SEPOS)
▫ 専用のカーネル、ドライバ、サービスおよびアプリケー
ションを含む
Secure (?) Enclave プロセッサ
• SEPに関しては非常に少ない情報だけが公開
▫ Appleによって提供された情報のみ
• SEPの特許は高レベルの概要のみ提示
▫ 具体的な実装の詳細は記載されていない
• 複数の疑問が残る
▫ SEPはどのようなサービスを提供しているのか?
▫ それらのサービスにどのようにアクセスするのか?
▫ どのような権限が必要なのか?
▫ SEPには攻撃に対してどのような効果があるのか?
トークの概要
• パート 1: Secure Enclaveプロセッサ
▫ ハードウェアデザイン
▫ ブートプロセス
• パート 2: 通信
▫ メールボックスの仕組み
▫ カーネルとSEP間のインタフェース
• パート 3: SEPOS
▫ アーキテクチャ / 内部
• パート 4: セキュリティ分析
▫ 攻撃面と堅牢性
詳説 Secure Enclave プロセッサ
SEPのARMコア: Kingfisher
• 専用のARMv7a 「Kingfisher」コア
▫ APコアのEL3からではSEPにアクセスできない
• 300-400MHz以上で動作しているようである
• SOC内の複数のKingfisherコアのひとつ
▫ 2-4個の他のKFコア - NAND/SmartIO/他に使用
▫ 他のコアから多数のアーキテクチャ情報が得られる
• プラットフォームに応じて変更(A7/A8/A9)
▫ 新しいチップ上での耐タンパーのようである
専用の周辺ハードウェア
• SEPはメモリマップドI/Oによってアクセス可能な独自の
周辺回路のセットを持っている
▫ APはアクセスできない組み込みのハードウェア
 暗号化エンジンや乱数生成期
 セキュリティヒューズ
 GID/UIDキー
• 専用のIO信号線 -
▫ 信号線はチップ外の周辺装置へと直接駆動する
 GPIO
 SPI
 UART
 I2C
共有の周辺ハードウェア
• SEPとAPはいくつかの周辺回路を共有する
• 電源管理(PMGR)
▫ セキュリティヒューズの設定はPMGRに置かれている
▫ それ以外にもいくつもの興味深いものがある
• メモリコントローラ
▫ iOSカーネル経由でのぞき見ることが可能
• 位相同期(PLL)クロック生成器
▫ 特に見どころなし…
• セキュアメールボックス
▫ コア間でのデータ転送に使用
• 外部ランダムアクセスメモリ(RAM)
物理メモリ
• 専用のブートROM (といくらかの SRAM)
▫ BootROM の物理配置は 0x2_0da0_0000
• 外部RAMの暗号化にインラインAESを使用
▫ SoCのRAMチップを取り外す物理メモリ攻撃に対して
もっとも効果的 (iPad)
• APからSEPのメモリアクセスを防止するハードウェア
「フィルタ」
▫ SEPのKFコアだけがこのフィルタを保有
SEP KF フィルター構成図
From SoC To SoC
ブートROM
メールボックス
コア
SEPフィルタ
詳説 Secure Enclave プロセッサ
SEPの初期化 – 第1ステージ
• APのリセット完了後、APのブートROMがリセットから
SEPを開放
▫ この動作は不可逆である。APによってアクセス可能な
ハードウェアレジスタはSEPのリセットや停止はできない
• 初期状態では4096バイトのスタティックRAMがス
タックおよび変数のために使用される
• ROM内のページテーブルが使われる
▫ 大きな物理アドレス拡張が必要
• メッセージループが開始
SEPの初期化 – 第2ステージ
• メールボックス内のメッセージを受信
• SEPOSが使用するものと同じフォーマットの8バイトの
メッセージ
• 全てのメッセージがエンドポイント255を使用
(EP_BOOTSTRAP)
オペコード 説明
1, 2 “ステータスチェック” (Ping)
3 nonceの生成
4 nonceワードの取得
5 “BootTZ0” (ブート継続)
メモリ保護
• SEPは4096バイトのSRAMより多くのメモリがいるた
め、外部のRAMを必要とする
• SEPの使用するRAMはAP改ざんから保護されなけ
ればならない
• APによって設定可能な2つの領域がセットアップされ
る:
▫ TZ0はSEP向け
▫ TZ1はAPの信頼ゾーン(カーネルパッチ保護)向け
• SEPはブート時のAPによるTZoのセットアップを待た
なければならない
SEP 起動フロー
TZ0 と TZ1 の設定
Ping 送信
Send BootTZ0
Ping 送信
AP
Acknowledge Ping
SEP
Map in TZ0
メモリ暗号化のセットアップ
Acknowledge BootTZ0
ステージ3の開始
iBoot
カーネル
ステージ3
ステージ2
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
メモリ暗号化モード
• ECB、CBCおよびXEXをサポートしている模様
• AES-128およびAES-256が使用可能
• 2つのチャンネルをサポート
▫ ブートROMはチャンネル1を使用
▫ SEPOSはチャンネル0を使用
• 物理アドレスの領域へのすべてのアクセスにおいて
暗号化/復号は透過的に行われる
▫ ブート後、SEPOSは暗号化領域の全ページのマッピン
グを保持する (ハードウェア領域およびAPとの共有メ
モリを除く)
キーの生成
• キーは“tangling”によって生成される:
▫ 真の乱数生成出力
▫ スタティックな“type”の値
• 保護された(読み取り不可の)レジスタを使用:
▫ UID、GID、シードA、シードB
 UIDに絡んだシードB == GenID_2B
• キーを生成するため、GenID_2Bを用いて以下のよ
うに暗号化:
▫ [4 バイト マジック = 0xFF XK1][4バイト 0s][192ビット
の乱数]
ステージ3の開始
• メモリ暗号化のセットアップ後、
SEPは暗号化メモリを使用するた
めに再び初期化:
▫ ページテーブル
▫ スタック
▫ データ
• 初期の低能力のブートストラップ
との間でコード共有なしの新しい
メッセージループを開始
TZ0 と TZ1 の設定
Ping送信
Send BootTZ0
Ping送信
Acknowledge Ping
Map in TZ0
メモリ暗号化の
セットアップ
Acknowledge
BootTZ0
ステージ3の開始
iBoot
Kernel
Stage 3
Stage 2
SEP ブートフロー: ステージ3
ART 送信
AP
Acknowledge Ping
SEP
Acknowledge ART
Copy in ART
共有メモリのアドレスを送信
SEPOS 送信
Copy in SEPOS
Validate SEPOS and ART
Acknowledge SEPOS
SEPOSのブート
ブートローディング: Img4
• SEPはASN.1 DER エンコードに基づく“IMG4”ブートロー
ダフォーマットを使用
▫ 64bit iBoot/AP ブートROMと酷似
▫ ”openssl -asn1parse”でパース可能
• SEPの使用する重要な3つのオブジェクト
▫ ペイロード –
 暗号化されたsepファームウェアを格納
▫ リストア –
 SEPをリストアする際の基本的な情報を格納
▫ マニフェスト (またはAPチケット) -
 ブートROM設定(およびセキュリティ)のアルファおよびオメガ
に影響
Img4 - マニフェスト
• マニフェスト(APTicket)には、SEP(OS)を認証し設定す
るために必要な重要情報のほとんどが含まれている
• 複数のハードウェア識別タグが含まれている
▫ ECID
▫ ChipID
▫ その他
• ソフトウェアとハードウェアの両方で実行時の設定を変更
するためにも使用される
▫ DPRO – プロダクションの降格
▫ DSEC – セキュリティの降格
▫ その他…
SEPのImg4パーサのリバース: ステージ1
• 見れないものをどのようにリバースしよう?
▫ 再利用されていそうなコードを探そう!
• IMG4をパースしている別の箇所
▫ AP ブートROM – 取得には少しの痛み
▫ iBoot – 物理メモリからダンプ - 0x8700xx000
 シンボルは多くない…
 しかし、時にはそれだけで取り出せる…
(iBoot from n51)
SEPのImg4パーサのリバース: ステージ2
• 別ファイルには “Img4Decode” シンボルが含まれている
▫ /usr/libexec/seputil
• ユーザランドのIMG4パーサにはよりたくさんのシンボル
▫ 正確ではないかも – しかしbindiffの表示は非常に近い
• seputilから推測可能なシンボルが見つかる:
▫ ASN’1 デコーダは libDER をベースにしている
 Appleが親切にもオープンソースとしてリリースしている
▫ RSA 部分は CoreCrypto によって処理されている
• LibDER + CoreCrypto = SEPのIMG4パースエンジン
▫ 動作させるのに適したベースが手に入った
Img4パースのフロー
• SEP ブートROM はAPから sep-firmware.img4 をコ
ピー
• DER デコーダの初期化
▫ ペイロードとマニフェスト、リストア情報のデコード
• ダイジェストと署名の証明書を検証
▫ ルート証明書はブートROMのエンドポイントにハードコード
• マニフェスト内の全プロパティを検証
▫ 現在のハードウェア構成に対してチェック
• 全項目パスすれば – ペイロードのロードおよび実行
Img4パースのフロー
AP
ペイロードとマニフェストのデコード
SEP
ダイジェストの検証
証明書の検証 失敗
マニフェストの検証
証明書のプロパティに対する検証
ハードウェアのプロパティに対する検証
SEPOSのブート
構成の読み込み
SEP
SEP IMG4送信
詳説 Secure Enclave プロセッサ
セキュアメールボックス
• セキュアメールボックスによりAPはSEPと通信が可能
になる
▫ inbox(リクエスト)とoutbox(リプライ)の両方の機能
• SEPのデバイスI/Oレジスタを用いて実装
▫ SEP構成空間として知られている
割り込みベースのメッセージパッシング
• メッセージ送信時は、AP はメールボックスの inbox
に書き込み
• このオペレーションはSEPに割り込みを発生させる
▫ SEPにメッセージを受信したことを通知する
• リプライ準備が完了した時に、SEPが outbox にメッ
セージを書き込む
▫ APにメッセージの受信を知らせるために、別の割り込
みが発生される
メールボックスのメカニズム
Start
Write
operation?
Read
operation?
No
Yes
Address ==
Inbox
Data written to
outbox?
Updateinbox with
write data
Generate interrupt
for SEP processor
Yes
Ignorewrite
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
メールボックスのメッセージフォーマット
• 単一メッセージのサイズは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;
SEP マネージャ
• SEPと通信するための汎用的なフレームワークを提
供
▫ AppleSEPManager.kext 内に実装
▫ IOPの提供する機能のうえに実装
• ドライバはSEPエンドポイントを登録することができる
▫ 特定のSEPアプリやサービスと対話するために使用
▫ ユニークなインデックス値が割り当てられる
• またそれぞれ独自の複数のエンドポイントを実装
▫ 例えば、SEPコントロールエンドポイント
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
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
エンドポイントのコントロール (EP0)
• SEP宛てに発行されたコントロールリクエストを処理
• out-of-lineバッファをリクエストとリプライを設定する
ために使用
• nonceを生成、読み取り、無効化するためのインタ
フェースを提供
• SEPマネージャのユーザクライアントは、コントロール
エンドポイントと対話するためのサポートを提供
▫ SEPユーティリティによって利用 (/usr/libexec/seputil)
コントロールエンドポイントのオペコード
オペコード 名称 説明
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のスリープ
Out-of-line バッファ
• 割り込みベースのメールボックスを使用しての大量の
データ転送は低速
▫ Out-of-line バッファは巨大データの転送に使われる
• SEPマネージャはSEPから見えるメモリを割り当てる
方法を提供する
▫ AppleSEPManager::allocateVisibleMemory(…)
▫ 実際に物理メモリの一部を割り当てる
• コントロールエンドポイントはターゲットエンドポイント
へのリクエスト/リプライバッファを割り当てるために使
われる
エンドポイントの登録 (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
SEP を使用するドライバ
• 現在、いくつかのドライバはその動作のためにSEPに
依存している
• 以前はカーネル内に置かれていたドライバのいくつか
のパーツはSEP内に移動された
▫ Apple(SEP)KeyStore
▫ Apple(SEP)CredentialManager
• ほとんどのドライバはSEP内に対応するドライバを
持っている
詳説 Secure Enclave プロセッサ
L4
• マイクロカーネルの一系統
• 1993年にJochen Liedtkeによって発表
▫ L3からの発展 (1980年代半ば)
• それ以前のマイクロカーネルの低パフォーマンスに
対応するために開発された
▫ L3よりもIPCパフォーマンスを10-20倍高速に改善
• 多数の亜種および実装
▫ 例: 組み込みシステム向けに最適化された L4-
embedded
SEPOS
• Darbat/L4-embedded ベース (ARMv7)
▫ Appleによるカスタマイズ
• 独自のドライバ、サービス、アプリケーションを実装
▫ macho バイナリとしてコンパイルされている
• カーネルは最小限のインタフェースセットのみ提供
▫ オペレーティングシステムの多くの部分がユーザランド
上に実装
SEPOS アーキテクチャ
SEP Drivers SEP Services
SEPOS
(Bootstrap Server)
Secure Key Store
Secure Credential
Manager
Secure Biometric
Engine
Hardware
SSE
ART Manager /
ART Mate
Embedded Runtime(ERT)
libSEPOS
Kernel (L4)
Core SEPOS
Components
SEP Applications
カーネル (L4)
• 利用可能な状態にマシンを初期化
▫ カーネル ページテーブルの初期化
▫ カーネル インタフェース ページ(KIP)のセットアップ
▫ ハードウェア上での割り込みの設定
▫ タイマーのスタート
▫ カーネルスケジューラの初期化および開始
▫ ルートタスクの開始
• 小さいシステムコールのセット(~20) を提供
システムコール (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 プロセッサ属性の設定
システムコール (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 カーネル情報の取得
特権システムコール
• いくつかのシステムコールは特権が必要と思われる
▫ 例:メモリやスレッド管理の呼び出し
• ルートタスク (SEPOS) のみが特権システムコールを
呼び出すことができる
▫ 呼び出し側空間のアドレスによって決定される
• 必要時にそれぞれのシステムコールによって行われ
る検査
▫ is_privileged_space()
特権システムコール
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
SEPOS (初期化)
• ブート時の初期プロセス (ルートタスク)
▫ 任意の特権L4システムコールを呼び出し可能
• 残りの全てのタスクの初期化および開始
▫ SEPファームウェアによって組み込まれたアプリケー
ションリストを処理
• 各タスクのコンテキスト構造の維持
▫ 仮想アドレス空間、特権レベル、スレッド等に関する情
報を含む
• ブートストラップサーバの立ち上げ
SEPOS アプリの初期化
Initialize Apps
proc_create( ) No Last app in list?
Done
Yes
macho2vm( ) thread_create( )
ertp_map_page( )
Read application list
from sep-firmware
ComputeCRC 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 theMach-O
header from physical
memory
Compares CRC with value
stored in sep-firmware
アプリケーション リスト
• SEPファームウェアによって組み込まれている全ての
アプリケーションの情報が含まれている
▫ 物理アドレス (オフセット)
▫ 仮想ベースアドレス
▫ モジュール名とサイズ
▫ エントリポイント
• SEPファームウェアイメージ内のSEPOSバイナリより
前にある0xEC8バイトを見つける
アプリケーション リスト
サイズ
エントリー
ポイント
仮想アドレス
物理アドレス
(オフセット)
ブートストラップサーバ
• SEPOSのコア機能を実装
▫ システム、スレッド、オブジェクト(メモリ)マネージメント
のためのメソッドをエクスポート
• 組込みランタイム経由でRPCによってSEPアプリケー
ションに実現可能となる
▫ ert_rpc_bootstrap_server()
• Enable applications to perform otherwise
privileged operationsアプリケーションに特権操作
を実行することを可能にする
▫ 例: 新しいスレッドの生成
特権メソッド
• アプリケーションはブートストラップサーバの特定のメ
ソッドを呼び出すために特権が必要
▫ オブジェクト/プロセス/acl/マッピング情報の問合せ
• 特権レベルはプロセス生成時に決定される
▫ プロセス名は‘A ’から‘ZZZZ’の範囲
▫ 例: “SEPD” (SEPDrivers)
• チェックは各メソッドによって行われる
▫ proc_has_privilege( int pid );
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が特権付
きかのチェックを呼出し
資格
• いくつかのメソッドは特別の資格を必要とする
▫ sepos_object_create_phys()
▫ sepos_object_remap()
• 任意の物理メモリマッピングからの非特権アプリケー
ションを防止しようとする
• 起動時にプロセスに割り当て
▫ 資格決定のために使われる別のテーブル
資格の割り当て
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;
}
資格の割り当て
タスク名 資格
SEPDrivers MAP_PHYS
ARTManager/ARTMate MAP_PHYS | MAP_SEP
Debug MAP_PHYS | MAP_SEP
• MAP_PHYS (2)
▫ アクセス(マップ)するために必要な物理領域
• MAP_SEP (4)
▫ 同上、ただし物理領域がSEPメモリをターゲットとしてい
る場合に必要
SEP ドライバー
• 全てのSEPドライバーのホスト
▫ AKF, TRNG, Expert, GPIO, PMGR, 他
▫ 完全にユーザモードで実装
• 各ドライバのデバイスI/Oレジスタをマップ
▫ ローレベルなドライバの操作を有効にする
• 専用のドライバAPIを用いてSEPアプリケーションに
公開される
▫ ルックアップ、コントロール、読み込み、書き込みのため
の関数を含む
ドライバの相互作用
SEPOS
SEPDrivers
Lookup handleto
SEPD service
Driver
Driver lookup
Lookup handleto
driver
Driver control/
read / write
Perform driver
operation
DriverDriver
Registers SEPD
service
on startup
Retrieves SEPD thread
handle from list
AKF ドライバー
• SEPOS内のAP/SEPエンドポイントの管理
• コントロール (EP0) リクエストの処理
▫ 例: リプライおよびレスポンスのためのOOLバッファオ
ブジェクトのセットアップ
• SEPアプリケーションは特定のAPリクエストを処理す
るために新しいエンドポイントを登録することができる
▫ AKF_ENDPOINT_REGISTER (0x412C) コントロー
ルリクエスト
SEP サービス
• さまざまなSEP関連のサービスをホスト
▫ セキュアなキー生成サービス
▫ テストサービス
▫ アンチ リプライサービス
▫ 資格情報サービス
• 通常、ドライバ上に実装
• サービスAPIのSEPアプリケーションへの提供
▫ service_lookup(…)
▫ service_call(…)
サービスの相互作用
SEPOS
sepServices
Lookup handleto
sepS service
Service
Servicelookup
Lookup handleto
service
Servicecall
Issuea service
request
ServiceService
Registers sepS
service
on startup
Retrieves sepS thread
handle from list
SEP アプリケーション
• APで動作する様々なドライバをサポートするように設
計
▫ AppleSEPKeyStore  sks
▫ AppleSEPCredentialManager  scrd
• いくつかのアプリは特定のデバイスのみで見られる
▫ 例: SSEはiPhone 6以降のみに提供
• 開発ビルドに対して排他的であってもよい
▫ 例: デバッグアプリケーション
詳説 Secure Enclave プロセッサ
攻撃界面: SEPOS
• 多くのデータにおいてAPとSEP間での通信する方法
が含まれている
▫ メールボックス (エンドポイント)
▫ 共有 リクエスト/リプライ バッファ
• 攻撃者はすでにAPカーネルレベルでの特権を手に
入れているという前提
▫ EL1での任意コード実行が可能
攻撃界面: AKF エンドポイント
• AKFとともに登録されたすべてのエンドポイントは潜
在的なターゲットである
▫ SEPドライバとアプリケーションの両方を含む
• エンドポイントを必要としないSEPマネージャ(AP)で
の登録
▫ メールボックスに直接書き込むことができる
▫ 代わりに、我々は独自のエンドポイントをSEPマネー
ジャに登録できる
攻撃界面: 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
攻撃界面: エンドポイント ハンドラ
SEP バイオメトリクス
メッセージハンドラ
耐攻撃性
• SEPの脆弱性を攻略するためにはどれくらいの労力
が必要か?
▫ 例: スタック/ヒープの改変
• 複数の要因によって決定される
▫ アドレス空間のレイアウト
▫ アロケータ(ヒープ)の堅牢化
▫ エクスプロイットの緩和策
▫ その他
アドレス空間のレイアウト
• SEPアプリケーションは適切なベースアドレスにロード
される
▫ イメージベースのランダム化なし
▫ 典型的には 0x1000 または 0x8000 に配置(ページゼ
ロセグメントの存在に依存)
• 適切なメモリ保護マスク(!=0)のないセグメントは無
視される
▫ 例: __PAGEZERO は決して「マップ済み」とならない
Stack
TEXT
Main Thread
Thread 2
Stack
DATA
Mapping
Thread 3
Stack
Virtual Memory
System stack
(0x1000 bytes)
Application
Image
スタックの改変
• SEPアプリケーションのメインス
レッドはイメージ埋め込みのスタッ
クを使用
▫ 破壊により隣接するDATAセグメン
トのデータを上書きする可能性
• SEPOSによって起動された追加ス
レッドのスタックはオブジェクトを使
用してマッピングされる
▫ ギャップとともに配置  “保護ペー
ジ”
スタックの改変
• SEPアプリケーションはスタックcookie保護付きでコ
ンパイルされる
▫ Cookieの値は ‘GARD’ の固定値
▫ 偽造/バイパスは簡単
• スタックはほとんどの場合既知のアドレス
▫ メインスレッドのスタックは既知のアドレス上にある
▫ 後続スレッドのスタックのアドレスは予測可能
ヒープの改変: malloc()
• SEPアプリの使っているランタイムアロケータ
▫ K&R 実装
• ポインタとブロックサイズを含むヘッダを持つ単一の
リンクフリーリスト(サイズ順に並んでいる)
▫ struct Header { void * ptr, size_t size };
▫ free()時に隣接する要素を結合
• ヒープサイズは初期化時に決定される
▫ malloc_init( malloc_base, malloc_top );
▫ 拡張しない
ヒープの改変: malloc()
Next
Size
Data (Free) Data (In Use)
Next
Size
Data (Free)
Free List Next
Size
Image DATA segment
ヒープの改変: malloc()
• ヒープのメタデータに対する保護はなし
▫ フリーリストポインタの上書きが可能
▫ ブロックサイズの改変の可能性がある
• 割り当てアドレスが予測可能
▫ アプリケーションイメージ内の__DATAセグメントによっ
て埋め込まれたMallocエリア
▫ 連続の順序でアロケートされる
非実行保護
• SEPOS は非実行の保護機構を実装している
• ページが実行可能とマークされていない限りは常に
セットされる
▫ space_t::map_fpage()
▫ ページテーブルエントリの XN と PXN ビットがセット
• ノンセキュア (NS) ビットもSEPメモリの領域外すべて
のページにセットされる
SEPOS 緩和機構 まとめ
緩和機構 提供 注
スタックcookie保護 Yes (…) ‘GARD’ – たいていは効果なし
メモリレイアウトのランダム化
ユーザー No
カーネル No イメージベース: 0xF0001000
スタック ガード ページ Yes/No メインスレッドにはなし
ヒープ メタデータ保護 No
Nullページ保護 No ルートタスクのページマップ必須
非実行保護 Yes XN と PXN 両方
攻撃界面: ブートROM
• 効果的であるのは2つの大きな攻撃界面のみ
▫ IMG4 パーサ
 メモリ破壊
 ロジックの不備
▫ ハードウェアベース
• マイナーなアンチexploitの緩和策のみ提供
▫ ASLRなし
▫ 基本的なスタックガード
▫ ひとつでも適当なバグがあればゲームオーバー
IMG4の攻撃
• ASN.1はうまく動作させるために非常にトリッキーである
▫ OpenSSL, NSS, ASN1C, その他に多くの脆弱性
• LibDER 自体は比較的信頼できる
▫ “他のDERパッケージと違い、LibDERではエンコードやデ
コードの際にmallocやコピーを行いません”
– LibDER の readme.txt
▫ KISS の設計思想
• しかし、それを呼び出すラッピングコードはそうではない
▫ seputil やそれに類するもの
▫ コードが libDER 自身より非常に複雑
攻撃界面: ハードウェア
• データ受信のための周辺信号ライン上でのメモリ破
壊攻撃
▫ SPI
▫ I2C
▫ UART
• サイドチャネル/差動電力解析
▫ A7特有 (新しいものほど耐性がある)
• グリッチ
▫ 標準クロック/電圧方法
▫ 他
外部RAM
• 暗号化メモリは検証されない
▫ SEPメモリのビット破壊が可能
• 暗号キーを生成する際に、“ランダム要素”が暗号な
しの外部RAMに一時的に保存される
▫ これにより攻撃者は最終的なメモリ暗号キーの生成に
対して影響を与えることができる
ヒューズアレイへの攻撃
• 潜在的にもっとも侵略的な攻撃ベクタのひとつ
▫ 多くの忍耐が必要
▫ 高い可能性
• レーザーが使用可能
▫ 高価な手法 - 我々向けではない
• 主なターゲット
▫ プロダクションモード
▫ セキュリティモード
終盤: JTAG
▫ 2000以上のピンのソケットが
必要
▫ CRCとヒューズ封印のバイパ
スが必要
▫ “FSRC” ピン - ヒューズアレイ
へのライン?
• ヒューズ検知ルーチンの誤動作
• IMG4 パーサの攻撃
▫ DSECとDPROはそもそも本当に何を行う?
A8 SoC Pins
詳説 Secure Enclave プロセッサ
まとめ
• SEP(OS) はセキュリティを考慮して設計されている
▫ メールボックス インタフェース
▫ 権限の分離
• しかし、SEP(OS)からは基本的な攻撃対策が欠けて
いる
▫ 例えば、メモリレイアウトのランダム化など
• いくつかのSEPアプリケーションは重大な攻撃界面を
露出させている
▫ 例: SEP バイオメトリクス アプリケーション
まとめ (続き)
• 全体的なハードウェアのデザインは競合よりもはるかに先
▫ ハードウェアフィルタ
▫ インラインでの暗号化されたRAM
▫ 一般的には小さい攻撃界面
• しかし、弱点もある
▫ 共有 PMGR と PLL は攻撃に対してオープン
▫ ヒューズ ソース ピンが含まれていることは再考に値する
▫ 降格機能はむしろ危険であるように見える
 Lightning経由のJTAGがなぜ存在している?
Thanks!
• Ryan Mallon
• Daniel Borca
• Anonymous reviewers
詳説 Secure Enclave プロセッサ
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をパニックにする
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() マニフェストをタスクと共有
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
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() スレッドの情報を取得

More Related Content

PDF
Yunusov babin 7sins-pres_atm_v4(2)_jp
PDF
Lucas apa pacsec_slides_jp-final
PDF
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
PPTX
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
PPTX
Windows 10 IoT Coreの脅威分析と実施すべきセキュリティ対策 by 和栗直英 - CODE BLUE 2015
PDF
ESP8266をはじめよう
PDF
Shusei tomonaga pac_sec_20171026_jp
PDF
Exploring the x64
Yunusov babin 7sins-pres_atm_v4(2)_jp
Lucas apa pacsec_slides_jp-final
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
Windows 10 IoT Coreの脅威分析と実施すべきセキュリティ対策 by 和栗直英 - CODE BLUE 2015
ESP8266をはじめよう
Shusei tomonaga pac_sec_20171026_jp
Exploring the x64

What's hot (19)

PPTX
Cisco ios
PPTX
Cisco ios
PDF
システムコールフックを使用した攻撃検出
PDF
Kasza smashing the_jars_j-corrected
PDF
Running lagopus on Xeon D
PDF
Interrupt Affinityについて
PDF
Report for S4x14 (SCADA Security Scientific Symposium 2014)
PDF
Xeon dとlagopusと、pktgen dpdk
PDF
Azureの上におとりを置いて、世界中から攻撃される様子を観察した話
PDF
私立大学情報教育協会大学 情報セキュリティ研究講習会
PDF
ワンコインでIot入門 第二章
PPTX
産業制御システムに対するStuxnet以来最大の脅威 by Anton Cherepanov, Róbert Lipovský
PDF
続・Webエンジニアのためのスマートホームハック ~ Node.js で IoT プロトコルハック ~
PDF
Xeon d
PDF
4章 Linuxカーネル - 割り込み・例外 5
PPTX
ネットワーク機器のAPIあれこれ入門 (NetOpsCoding#2)
PDF
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
PDF
Dpdk環境の話
PPTX
Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~
Cisco ios
Cisco ios
システムコールフックを使用した攻撃検出
Kasza smashing the_jars_j-corrected
Running lagopus on Xeon D
Interrupt Affinityについて
Report for S4x14 (SCADA Security Scientific Symposium 2014)
Xeon dとlagopusと、pktgen dpdk
Azureの上におとりを置いて、世界中から攻撃される様子を観察した話
私立大学情報教育協会大学 情報セキュリティ研究講習会
ワンコインでIot入門 第二章
産業制御システムに対するStuxnet以来最大の脅威 by Anton Cherepanov, Róbert Lipovský
続・Webエンジニアのためのスマートホームハック ~ Node.js で IoT プロトコルハック ~
Xeon d
4章 Linuxカーネル - 割り込み・例外 5
ネットワーク機器のAPIあれこれ入門 (NetOpsCoding#2)
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
Dpdk環境の話
Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~
Ad

Viewers also liked (20)

PDF
Mickey pac sec2016_final_ja
PDF
Wenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-ja
PDF
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
PDF
Villegas first pacsec_2016
PDF
Nishimura i os版firefoxの脆弱性を見つけ出す_jp
PDF
Moony li pacsec-1.8
PDF
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
PDF
Lucas apa pacsec slides
PDF
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
PDF
Kavya racharla ndh-naropanth_fin
PDF
Anıl kurmuş pacsec3
PDF
Di shen pacsec_jp-final
PDF
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
PDF
Yunusov babin 7 sins pres atm v2
PDF
Rouault imbert view_alpc_rpc_pacsec_jp
PDF
Rouault imbert alpc_rpc_pacsec
PDF
Di shen pacsec_final
PDF
Kavya racharla ndh-naropanth_fin_jp-final
PDF
Guang gong escalate privilege by vulnerabilities in android system services ...
PDF
Pac sec2016 flyer_agenda
Mickey pac sec2016_final_ja
Wenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-ja
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Villegas first pacsec_2016
Nishimura i os版firefoxの脆弱性を見つけ出す_jp
Moony li pacsec-1.8
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Lucas apa pacsec slides
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Kavya racharla ndh-naropanth_fin
Anıl kurmuş pacsec3
Di shen pacsec_jp-final
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yunusov babin 7 sins pres atm v2
Rouault imbert view_alpc_rpc_pacsec_jp
Rouault imbert alpc_rpc_pacsec
Di shen pacsec_final
Kavya racharla ndh-naropanth_fin_jp-final
Guang gong escalate privilege by vulnerabilities in android system services ...
Pac sec2016 flyer_agenda
Ad

Similar to Solnik secure enclaveprocessor-pacsec-final-jp (20)

PPTX
TDEで透過的暗号化
PDF
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
PDF
図解で理解するvetKD
PDF
Secure scheme script suite
PDF
Secure Scheme Script Suite
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
KEY
My sql casual_in_fukuoka_vol1
PDF
Secure element for IoT device
ODP
Android デバッグ小ネタ
PPTX
みんなのブログ紹介
PDF
memcached + selinux engine
PDF
ホームディレクトリに埋もれた便利なコードをさがせ!
PDF
20250525_IoTLT_vol123_kitazaki_v1___.pdf
PDF
サーバー初心者のためのWordPressサイト構築手順
PDF
HeapStats: Introduction and Technical Preview
PDF
Puppet on AWS
KEY
Mysql casual fukuoa_vlo_2
PDF
CLRの基礎 - プログラミング .NET Framework 第3版 読書会
PDF
仮想化技術によるマルウェア対策とその問題点
PPTX
SCUGJ第18回勉強会:よろしい、ならばVMMだ
TDEで透過的暗号化
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
図解で理解するvetKD
Secure scheme script suite
Secure Scheme Script Suite
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
My sql casual_in_fukuoka_vol1
Secure element for IoT device
Android デバッグ小ネタ
みんなのブログ紹介
memcached + selinux engine
ホームディレクトリに埋もれた便利なコードをさがせ!
20250525_IoTLT_vol123_kitazaki_v1___.pdf
サーバー初心者のためのWordPressサイト構築手順
HeapStats: Introduction and Technical Preview
Puppet on AWS
Mysql casual fukuoa_vlo_2
CLRの基礎 - プログラミング .NET Framework 第3版 読書会
仮想化技術によるマルウェア対策とその問題点
SCUGJ第18回勉強会:よろしい、ならばVMMだ

More from PacSecJP (11)

PDF
Ryder robertson security-considerations_in_the_supply_chain_2017.11.02
PDF
Ryder robertson pac-sec skeleton 2017_jp
PDF
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
PDF
Anıl kurmuş pacsec3-ja
PDF
Shusei tomonaga pac_sec_20171026
PDF
Marc schoenefeld grandma‘s old handbag_draft2_ja
PDF
Marc schoenefeld grandma‘s old handbag_draft2
PDF
Jurczyk windows metafile_pacsec_jp3
PDF
Jurczyk windows metafile_pacsec_v2
PDF
Wenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_final
PDF
Moony li pacsec-1.5_j4-truefinal
Ryder robertson security-considerations_in_the_supply_chain_2017.11.02
Ryder robertson pac-sec skeleton 2017_jp
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
Anıl kurmuş pacsec3-ja
Shusei tomonaga pac_sec_20171026
Marc schoenefeld grandma‘s old handbag_draft2_ja
Marc schoenefeld grandma‘s old handbag_draft2
Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_v2
Wenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_final
Moony li pacsec-1.5_j4-truefinal

Solnik secure enclaveprocessor-pacsec-final-jp