パッシブ・ファジングを補完する
アクティブ・ファジング
~OSXの脆弱性を趣味と実益を兼ねて~
Complementary
Active & Passive Fuzzing
本日の内容
• 俺たち何者?
• パッシブ・ファジングのフレーム
ワーク
• Rootに至る攻撃
Moony li pacsec-1.5_j4-truefinal
Moony Li
- @Flyic
- セキュリティの世界に
7年間
- Sandcastle
- Deep Discovery
- 攻撃手段の発見
- Mac/Windows カーネル
- Android 脆弱性
Jack Tang
- @jacktang310
- セキュリティの世界に
10年以上
- ブラウザ
- 文書ファイル
- Mac/Windows カーネル
- 仮想化の脆弱性
Moony li pacsec-1.5_j4-truefinal
CVE-2015-3787, CVE-2015-5867, CVE-2015-7021,CVE-2015-7020,
CVE-2016-1716,ZDI-CAN-3536,ZDI-CAN-3558, ZDI-CAN-
3598,ZDI-CAN-3596,ZDI-CAN-3603,CVE-2015-7067, CVE-2015-
7076,CVE-2015-7106,CVE-2015-7109,CVE-2016-1718,CVE-2016-
1747,CVE-2016-1749,CVE-2016-1753, ZDI-CAN-3693, ZDI-CAN-
3694, CVE-2016-1795, CVE-2016-1808, CVE-2016-1810, CVE-
2016-1817, CVE-2016-1820, CVE-2016-1798, CVE-2016-1799,
CVE-2016-1812, CVE-2016-1814, CVE-2016-1818, CVE-2016-1816,
CVE-2016-4648,CVE-2016-4699,CVE-2016-4700,CVE-2016-
4750
CVE 実績
Github はこちらに
https://github.c
om/SilverMoon
Security
Moony li pacsec-1.5_j4-truefinal
ここでの内容
• アプローチ方法の比較
• 我々のアプローチと検討
• 実装
• 成功事例
方法 不利な点 備考
伝統的なファジング
テストしたいIOKitサービス名を
選択。IOKitユーザモードAPIに
ファジングデータを注入
(e.g. IOConnectCallMethod)
呼び出しシーケンスに依存 AppleCamIn (OpenDevice,
PowerOnCamera…)
入力データに依存 AppleHDAEngineInput(ユーザモー
ド・バッファポインターとして入力)
タイミングに依存 IOHDIXHDDriveOutKernel(dmgを
マウント)
コードレビュー
スケーラブルではない 人の経験に依存する
リバースエンジニアリング並み
に手間がかかる
多くのIOKitサービスとユーザクライ
アント
ほかのアプローチ方法を比較
我々のアプローチ・検討
インターセプトとポイズニング
これらと似てる
比較 川のダム パッシブ・ファジング
基本機能 流れを一度断ち切る
(インターセプトする)
実行をインターセプト
上流の流れ ユーザモード・データ
下流の流れ カーネルモード・データ
カオスを
つくる
上流に毒を流す ユーザ・データをファジン
グ
下流では魚が死ぬ カーネルクラッシュ
毒を入れた場所を追う 再現させる
…… ……
こんな感じに・・・
Origianl function
Hooker
IOAcceleratorFamily2.kext
Targeted application from apple store
Suspicious
module/function
manifest
IOThunderboltFamily.kext IOUSBFamily.kext
AppleGraphicsPowerManagement.kext AppleHDA.kext … …
I. is_io_connect_method
II. is_io_connect_async_method
III. iokit_user_client_trap
IV. IOMemoryDescriptor::createMappingInTask
V. ipc_kmsg_get
VI. ipc_kmsg_send
VII. Copyio
…...
Conditon Checker
Ring3
Ring0
Target
drivers
XNU/
IOKit
Tamper
StackFrame,
Process,
UserClient,
MsgID,
…...
Context Matcher
実装 - アーキテクチャの概要
TargetAPI(params):
//Call Original_TargetAPI(params)
if (matchWhitelistParameter(params)) goto _exit();
if !(matchStackFrame() &&
matchBlacklistParameter(params))
goto _exit;
if (random()) {record(params); fuzz(params);}
Call Original_TargetAPI(params);
if (matchContext(params)) alert;
実装 – Pseudo コード
• フック
• ユーザから直接アクセス可能
• 一つのフックで多くのプロセスへ
• カーネルモードでのインライン・フック
• タンパー
• ユーザモードからアクセス可能なファジングデータ
• e.g. Inband_input, scalar_input, ool_input
• サイズではない! (getTargetAndMethodForIndex チェックを迂回する)
実装 – フックとタンパー
int, bool, Gen575TextureBuffer**) + 0x12e
0xffffff80c0c7b7c0 0xffffff7fa96f2bd5 AppleIntelHD3000Graphics`Gen6GLContext::process_token_BindTextures(VendorGLStreamInfo&) + 0x103
0xffffff80c0c7b7f0 0xffffff7fa96b6242 AppleIntelHD3000Graphics`IOIntelGLContext::processCommandBuffer(VendorCommandDescriptor*) +
0x12c
0xffffff80c0c7b820 0xffffff7fa96ec1eb AppleIntelHD3000Graphics`Gen6GLContext::processCommandBuffer(VendorCommandDescriptor*) +
0x7b
0xffffff80c0c7b900 0xffffff7fa96b540a AppleIntelHD3000Graphics`IOIntelGLContext::clientMemoryForType(unsigned int, unsigned int*,
IOMemoryDescriptor**) + 0x5bc
0xffffff80c0c7b950 0xffffff7fa96b39c3 AppleIntelHD3000Graphics`IOIntelGLContext::submit_command_buffer(unsigned int,
sIOGLGetCommandBuffer*) + 0x63
0xffffff80c0c7b980 0xffffff80276b9626 ::shim_io_connect_method_scalarI_structureO(IOExternalMethod *, IOService *, const io_user_scalar_t *,
mach_msg_type_number_t, char *, IOByteCount *)((IOExternalMethod *) method = <>, , (IOService *) object = <>, , (const io_user_scalar_t *) input
= <>, , (mach_msg_type_number_t) inputCount = <>, , (char *) output = <register r10 is not available>, , (IOByteCount *) outputCount = <register
r11 is not available>, )
0xffffff80c0c7b9e0 0xffffff80276baef0 IOUserClient::externalMethod(unsigned int, IOExternalMethodArguments*, IOExternalMethodDispatch*,
OSObject*, void*)((IOUserClient *) this = <>, , (uint32_t) selector = <>, , (IOExternalMethodArguments *) args = 0xffffff80c0c7ba00,
(IOExternalMethodDispatch *) dispatch = <>, , (OSObject *) target = <>, , (void *) reference = <>, )
0xffffff80c0c7bb20 0xffffff80276b7f77 ::is_io_connect_method(io_connect_t, uint32_t, io_user_scalar_t *,
mach_msg_type_number_t, char *, mach_msg_type_number_t, mach_vm_address_t, mach_vm_size_t, char *,
mach_msg_type_number_t *, io_user_scalar_t *, mach_msg_type_number_t *, mach_vm_address_t, mach_vm_size_t
*)((io_connect_t) connection = 0xffffff80c0c7ba60, (uint32_t) selector = 16, (io_user_scalar_t *) scalar_input = <>, ,
(mach_msg_type_number_t) scalar_inputCnt = <>, , (char *) inband_input = <>, , (mach_msg_type_number_t)
inband_inputCnt = 0, (mach_vm_address_t) ool_input = <>, , (mach_vm_size_t) ool_input_size = <no location, value may
have been optimized out>, , (char *) inband_output = <no location, value may have been optimized out>, ,
(mach_msg_type_number_t *) inband_outputCnt = <no location, value may have been optimized out>, , (io_user_scalar_t *)
scalar_output = <>, , (mach_msg_type_number_t *) scalar_outputCnt = <no location, value may have been optimized out>, ,
(mach_vm_address_t) ool_output = <>, , (mach_vm_size_t *) ool_output_size = <>, )
0xffffff80c0c7bcd0 0xffffff7fa9cd34ab trampline_is_io_connect_method((io_connect_t) connection = 0xffffff8035637000,
(uint32_t) selector = 16, (io_user_scalar_t *) scalar_input = 0xffffff80331a4dcc, (mach_msg_type_number_t)
scalar_inputCnt = 1, (char *) inband_input = 0xffffff80331a4dd8 "", (mach_msg_type_number_t) inband_inputCnt = 0,
(mach_vm_address_t) ool_input = 0, (mach_vm_size_t) ool_input_size = 0, (char *) inband_output = 0xffffff8035805600 "",
(mach_msg_type_number_t *) inband_outputCnt = 0xffffff80358055fc, (io_user_scalar_t *) scalar_output =
0xffffff80c0c7bd30, (mach_msg_type_number_t *) scalar_outputCnt = 0xffffff80c0c7bd2c, (mach_vm_address_t)
ool_output = 0, (mach_vm_size_t *) ool_output_size = 0xffffff80331a4df8)
0xffffff80c0c7bde0 0xffffff8027158750 _Xio_connect_method((mach_msg_header_t *) InHeadP = <>, ,
(mach_msg_header_t *) OutHeadP = 0xffffff80358055d0)
実装 – フックとタンパー
(スニペット – 報告されなかったクラッシュ)
• (ドライバ インターフェース) is_io_connect_method
• (ドライバ インターフェース)
is_io_connect_async_method
• (カーネル) iokit_user_client_trap
• (カーネル) IOMemoryDescriptor::createMappingInTask
• (IPC Msgをマッチング) ipc_kmsg_get
• (IPC Msgをマッチング) ipc_kmsg_send
• (一般 I/O) Copyio
• …
実装 – フックの概要
実装 – フックの概要 スニペット
ファジングを安定させる
• ノイズを取り除く
o busy コール, black screen コール, hung コール,
o 再現されたクラッシュ
脆弱性につながるものを追いかける
• カーネル・ヒープアドレスのリーク
• ユーザデータをカーネルにマップしてバッファサイズとして
読み取り
• …
実装 – なぜコンディション・チェッカー?
• &&, ||, *(wild match), white(black)
• プロセス
• ユーザID (root/Non-root)
• プロセス名 (例: Safari, RCE, sandbox-evasion)
• モジュール
• モジュール名
• 関数
• シンボル名・アドレス
• オフセットの範囲
実装 – 抽出の条件 1/3
//Config for mac prodetail_control_entry_t g_white_listing_detail_control[] ={ //
procName,uid,driverBundleName, driverClassName, selFunctionNO
//"*",0,"*","*",ANY_MATCH_INTEGER,#if 0 //Reported or collected yet:
//{"*",PROCESS_UID_ANY_INTEGER,"*","AGPMClient",7312},
//{"*",PROCESS_UID_ANY_INTEGER,"*", "nvDeviceTesla", 5},
//{"*",PROCESS_UID_ANY_INTEGER,"*", "NV2DContextTesla", 17},
//{"*",PROCESS_UID_ANY_INTEGER,"*","IONVSurfaceTesla",10},
//{"*",PROCESS_UID_ANY_INTEGER,"*","IOHDIXHDDriveOutKernelUserClient",2},
{"*",PROCESS_UID_ANY_INTEGER,"*","IGAccelSharedUserClient",1},//crash-24
{"*",PROCESS_UID_ANY_INTEGER,"*","AccelSurface",16},//crash-23
{"*",PROCESS_UID_ANY_INTEGER,"*",OBJECT_CLASS_NAME_NO_FOUND,16},
{"*",PROCESS_UID_ANY_INTEGER,"*","HD",2},//crash-21
//"*",PROCESS_UID_ANY_INTEGER,"*","Accel",2,//crash-28
//"*",PROCESS_UID_ANY_INTEGER,"*","IG",2,//crash-28
//"*",PROCESS_UID_ANY_INTEGER,"*","Con",2,//crash-28
"*",PROCESS_UID_ANY_INTEGER,"*","IGAccelSharedUserClient",0,//crash-29
"*",PROCESS_UID_ANY_INTEGER,"*","IOThunderboltFamilyUserClient",22,//crash-30
//"*",PROCESS_UID_ANY_INTEGER,"*","IG",ANY_MATCH_INTEGER,
//"*",PROCESS_UID_ANY_INTEGER,"*","Accel",ANY_MATCH_INTEGER,
//"vm",PROCESS_UID_ANY_INTEGER,"*","*",ANY_MATCH_INTEGER,
//"*",PROCESS_UID_ANY_INTEGER,"*","vm",ANY_MATCH_INTEGER,
"sandbox",PROCESS_UID_ANY_INTEGER,"*","*",ANY_MATCH_INTEGER,
"dog",PROCESS_UID_ANY_INTEGER,"*","*",ANY_MATCH_INTEGER,
//{"WindowServer",PROCESS_UID_ANY_INTEGER,"*","AccelSurface",16},//crash-23
//"*",PROCESS_UID_ANY_INTEGER,"*","SMC",ANY_MATCH_INTEGER,
//"windowserver",PROCESS_UID_ANY_INTEGER,"*","*",ANY_MATCH_INTEGER,};
実装 – ホワイト・リスティングの事例
• データ
• is_address_RWX
• コピーの方向(in/out)
• カーネル・スペースかユーザ・スペース (SMAP ノイズ)
• コール・スタック
• 関数の戻り先アドレス
• スタック・レベル (一番底から一番上まで)
• レベル範囲 [,]
実装 – 抽出の条件 2/3
stack_match_item_t stack_matcher_for_copyio[]={
//If any item in list match, then match
//{routineName, cache}, routineAddress, offSetFrom, offsetTo, levelLow, levelHigh
{{"_shim_io_connect_method_scalarI_scalarO",STACK_ANY_INTEGER},STACK_ANY_INTEGE
R,0, 0xC120-0xB8B0, STACK_ALL_LEVEL_RANGE},
{{"_shim_io_connect_method_scalarI_structureO",STACK_ANY_INTEGER},STACK_ANY_INTE
GER,0, 0xDB94-0xD5C0, STACK_ALL_LEVEL_RANGE},
{{"_shim_io_connect_method_scalarI_structureI",STACK_ANY_INTEGER},STACK_ANY_INTE
GER,0, 0xEA97-0xE490, STACK_ALL_LEVEL_RANGE},
{{"_shim_io_connect_method_structureI_structureO",STACK_ANY_INTEGER},STACK_ANY_IN
TEGER,0, 0xF588-0xF270, STACK_ALL_LEVEL_RANGE},
{{"_is_io_connect_method",STACK_ANY_INTEGER},STACK_ANY_INTEGER,0, 0xb2a9-
0xaf10,STACK_ALL_LEVEL_RANGE},
}
実装 – スタック・フレームの例
抽出の条件 3/3
• その他
• Mach_msg
• msg サブシステム id…
• Userclient
• serviceName,ClassName,selector…
detail_control_entry_t g_white_listing_detail_control[] ={
// procName,uid,driverBundleName, driverClassName, selFunctionNO
//{"*",PROCESS_UID_ANY_INTEGER,"*","AGPMClient",7312},,
{"*",PROCESS_UID_ANY_INTEGER,"*","IGAccelSharedUserClient",1},//crash-24
{"*",PROCESS_UID_ANY_INTEGER,"*","AccelSurface",16},//crash-23
{"*",PROCESS_UID_ANY_INTEGER,"*",OBJECT_CLASS_NAME_NO_FOUND,16},
{"*",PROCESS_UID_ANY_INTEGER,"*","HD",2},//crash-21
{"*",PROCESS_UID_ANY_INTEGER,"*","IX",2},//crash-21
"*",PROCESS_UID_ANY_INTEGER,"*","AGPM",7312,//crash-11
"*",PROCESS_UID_ANY_INTEGER,"*","IGAccelGLContext",2,//crash-28
実装 – UserClient の例
#define KMSG_IOKIT_SUBSYSTEM_RANGE 0xAF0, 0x0B47
detail_control_entry_for_ipc_kmsg_send_t g_black_listing_detail_control_foripc_kmsg_send[]
={
//procName,uid,msg_id_from, msg_id_to, routineName, addr, addr_offset_from, addr_offset_to
"chrome",PROCESS_UID_ANY_INTEGER,
KMSG_IOKIT_SUBSYSTEM_RANGE,"__Xio_connect_method",KMSG_ADDR_OFFSET_ANY_RANGE,
KMSG_LEAVING,};
• #define KMSG_IOKIT_SUBSYSTEM_RANGE 0xAF0, 0x0B47
• #define KMSG_MACH_VM_SUBSYSTEM_RANGE 0x12C0, 0x12D4
• #define KMSG_MACH_PORT_SUBSYSTEM_RANGE 0xC80, 0x0CA4
• #define KMSG_MACH_HOST_SUBSYSTEM_RANGE 0xC8, 0xE4
• #define KMSG_HOST_PRIV_SUBSYSTEM_RANGE 0x190, 0x1AA
• ……
実装 – Mach-msg の例
• コード・レビューのための啓発
• バグだらけなモジュール、リバース・エンジニアリングの
インターフェース
• バグ・ハンティングの活動で積み重ねられてきた
パターン
• 脆弱性は無いが脆弱性の疑いを示唆するもの
• コンディション・チェッカーを通じて実装されたもの
実装 – 何がつながる?
• いくつかのIOKitに関連したメモリ破壊脆弱性が下記
の流れで起こり得る :
• ユーザモード・バッファスペースをカーネルモードにマッピ
ングするためにIOMemoryDescriptor ::
createMappingInTaskを呼び出す
• バッファから値を読み出し、その値をバッファの読み出しか
書き込みに使用する
• いくつかのカーネル情報漏洩脆弱性が下記の流れ
で起こり得る:
• 出力バッファのコンテンツに0xFFFFFFのプレフィックスが
付いている
実装 – 脆弱性につながるものの例
• ファジング・ソース:
• 複数のアプリケーション
• AppStore (MMORPG games, FaceTime,USB hardisk, BlueTooth, Wifi,
VM,DirectX…)
• Virus Total, Apple OpenSource UT, github サンプルコード
• 豊富な種類のファジング・ソース
• Active fuzzing, Python watchdog, browsing WebGL
• ファジングの安定性:
• コンディション・チェッカーを使うことで、意図的なハング・アップやブ
ラック・スクリーン、そして、再現された事象をバイパスできた
(nvTestlaSurfaceTesla, IGAccelGLContext, IGAccelSurface…)
成功事例 – パッシブ・ファジング 1/3
• 再現:
• ネットワークにログイン
• NVRAMにログイン? メモリと kdp_panic_dump コールバックにログ
イン?
• コアダンプ・サーバ
• sh-3.2# nvram boot-args=”pmuflags=1 debug=0xd44 kext-dev-mode=1 kcsuffix=development –
v _panicd_ip=10.64.80.106”
• Thunderbolt + fwkdp + lldb
• 自動化
• kdp_panic_dump callback+dump+reboot?
• VM(Vmware fusion, Qemu…) で回復?
成功事例 – パッシブ・ファジング 2/3
雑多な教訓
• 時々はファジングをやってみることをお勧めする
• 正常にプログラムは走っている – そして突然ファジング
• 最新のKDKで常にOSバージョンを最新に
成功事例 – パッシブ・ファジング 3/3
成功事例 – どのように
パッシブ・ファジングを補完する?
• パッシブ・ファジングからの統計データ
• アクセス可能なユーザクライアント、non-root、non-
sandbox、クラッシュの頻度、クラッシュのタイプ(UAF,
OOB)…
• 不要なチェックを回避するためにより低いレベルでAPI
にアクセス(可能ならば)
• Mac-O format, find symbol, hard-code offset を解決
• e.g. IOServiceGetMatchingServices(mach_port_t, CFDictionaryRef, io_iterator_t *)
->io_service_get_matching_services_bin(mach_port_t, char*,int, void*)
成功事例 – アクティブ・ファジング 1/3
• 再現:
• ランダムなコールやパラメータを記録する必要はない -
ただpseudorandomのシードを記録しろ (例: Mt19937-
64/Mt19937-32)
• カーネルクラッシュは、APIコールやファジング・パラメータ
のランダムさに関わらずに簡単に再現できる
成功事例 – アクティブ・ファジング 2/3
seed = CrahsedCases[i]
for(randomSelect every kernel module)
for(randomSelect every interface)
APICall( randomByte() )
成功事例 – アクティブ・ファジング 2/3
再現のためのPseudoコード
for (every fuzz session)
seed = generate()
sendSeedOutside()
for(randomSelect every kernel module)
for(randomSelect every interface)
APICall( randomByte() )
成功事例 – アクティブ・ファジング 2/3
アクティブ・ファジングのためのPseudoコード
• 再現:
• 複数の接続のためのWebシードサーバ
• 相対的に短いファジング・サイクルのための1つの
pseudorandom シード
成功事例 – アクティブ・ファジング 3/3
Moony li pacsec-1.5_j4-truefinal
ここでの内容
• セキュリティ対応
攻撃手法
• 攻撃の実践
• SIP (System Integrity Protection)
• KALSR(e.g. PEGASUS CVE-2016-4655)
• SMAP
• SMEP
https://speakerdeck.com/marcograss/dont-trust-your-eye-apple-
graphics-is-compromised
セキュリティ対策
• KASLRを回避
– 実行時のカーネルコードセグメントのアドレスを漏らす脆
弱性を使用
– 漏れたAPIを使ってペイロードを作成
(e.g. thread_exception_return)
• SMAPを回避
– カーネルのヒープ・アドレスを漏らす脆弱性を使用
– カーネル・ヒープ内でROPチェーンを構成
– カーネルのヒープ・アドレスが必要
• SMEPを回避
– RIPをカーネルで実行する脆弱性を使用
– SMEP/SMAPを無効化するためのROPチェーンを実行
– ペイロードを実行
攻撃手法
• OSX/iOSハックの「教祖」 Stefan Esser (@i0n1c)
はSyScan 2012 にて OSUnserializeXMLが良い
手段と提案した
https://reverse.put.as/wp-
content/uploads/2011/06/SyScan2012_StefanEsser_iOS_Kernel_Heap_Armageddon.pdf
Heap feng shuiの豆知識
OSUnerializeXML()
• ほとんどの場合で、 OSUnserializeXML によって
割り当てられたOSDictionaryは、
OSObject::release のシステムコール1つで解放
される
。。。
しかし…
• もし、割り当てられたオブジェクトがほかのコンポー
ネントに参照された場合、object::release をそれ
に対して呼び出しても解放されない
• IORegistry はHeap Fengshuiにとって良い選択
• なので、 IORegistry メソッド呼び出しの近くで呼び
出されている IORegistry method calling を見つ
けた…
しかし…
• IOKIT サービスでは IOMProotDomain ,
slector 7 (kPMSleepSystemOptions)
RootDomainUserClient::secureSleepSystemOptions
。。。
常に例外
Appleを見つけたバグとHeap
Fengshui の豆知識とでrootに至る
まで攻撃する
• CVE-2016-xxx :
これはAppleHDAEngineInput
カーネルモジュールにおける典型的な
UAF脆弱性
• CVE-2016-xxxx:
オブジェクト・アドレスを漏らすディスクイメージ
モジュール内のもう一つのバグ
このアドレスはカーネル・ヒープに存在
バグ
payload
Ring3
Ring0
kernel
SMAP
SMEP
KASLR
kslide
Driver
Memory address – Disk Address
Call current_proc
Call proc_ucred
Call posix_cred_get
Call thread_exception_return
IOCommand
Exploit App
ROP Gadgets
mov cr4 rax; ret
Call payload
StackPivot
0x68
Object
0x108
AppleHDAEngineInput
IOHDIXHDDriveOutKernel
vtable_addr +0
+8
call [vtable+0]
[1]Leak kernel buffer IOCommand address
[3]Spray freed IOCommand
with OSData(StackPivot)
[2]Free IOCommand
[4]Free Object
[5]Spray freed Object with
OSData(leaked IOCommand and
ROP)
[0]Leak kslide to
build up payload
[6]Trigger execution
by use Object
攻撃の手順 1/2
IOCommandStackPivot
Object
Exploit Apppayload
+0
+8
攻撃の手順 2/2
デモ
どうもありがとうございました
<(_ _)>
Special thanks:
Herry Li, @zenhumany
Juwei Lin, @fuzzerDOTcn

More Related Content

PPTX
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
PDF
Synthesijer hls 20150116
PDF
Easy Going Groovy(Groovyを気軽に使いこなそう)
PDF
ハードウェア脳とソフトウェア脳
PDF
JavaFXでマルチタッチプログラミング
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
PDF
ウェブ標準デバイス系 API 総集編 2014
PDF
Bluespec @waseda(PDF)
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
Synthesijer hls 20150116
Easy Going Groovy(Groovyを気軽に使いこなそう)
ハードウェア脳とソフトウェア脳
JavaFXでマルチタッチプログラミング
Synthesijer and Synthesijer.Scala in HLS-friends 201512
ウェブ標準デバイス系 API 総集編 2014
Bluespec @waseda(PDF)

Viewers also liked (20)

PDF
Moony li pacsec-1.8
PDF
Lucas apa pacsec_slides_jp-final
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
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
PDF
Di shen pacsec_jp-final
PDF
Anıl kurmuş pacsec3
PDF
Kavya racharla ndh-naropanth_fin
PDF
Shusei tomonaga pac_sec_20171026_jp
PDF
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
PDF
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
PDF
Yunusov babin 7 sins pres atm v2
PDF
Yunusov babin 7sins-pres_atm_v4(2)_jp
PDF
Rouault imbert view_alpc_rpc_pacsec_jp
PDF
Di shen pacsec_final
PDF
Shusei tomonaga pac_sec_20171026
PDF
Kavya racharla ndh-naropanth_fin_jp-final
PDF
Guang gong escalate privilege by vulnerabilities in android system services ...
PDF
Mickey pac sec2016_final_ja
PDF
Mickey pacsec2016_final
Moony li pacsec-1.8
Lucas apa pacsec_slides_jp-final
Wenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-ja
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Di shen pacsec_jp-final
Anıl kurmuş pacsec3
Kavya racharla ndh-naropanth_fin
Shusei tomonaga pac_sec_20171026_jp
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yunusov babin 7 sins pres atm v2
Yunusov babin 7sins-pres_atm_v4(2)_jp
Rouault imbert view_alpc_rpc_pacsec_jp
Di shen pacsec_final
Shusei tomonaga pac_sec_20171026
Kavya racharla ndh-naropanth_fin_jp-final
Guang gong escalate privilege by vulnerabilities in android system services ...
Mickey pac sec2016_final_ja
Mickey pacsec2016_final
Ad

Similar to Moony li pacsec-1.5_j4-truefinal (20)

PPTX
Polyphony の行く末(2018/3/3)
PPTX
自作LSIコミュニティの可能性
KEY
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
PPTX
M5Stack互換機を作った話
PDF
C++0x in programming competition
PPT
C++0x in programming competition
PPTX
x86x64 SSE4.2 POPCNT
PPTX
[CEDEC2017] LINEゲームのセキュリティ診断手法
PDF
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
PDF
SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...
PPTX
自作RISC-VチップでLチカをやってみた
PPTX
PBL1-v1-006j.pptx
PPTX
Develop Web Application with Node.js + Express
PDF
Androidの入力システム
ODP
みんな大好き! Hello, World
PDF
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
PDF
201812020707 festa2018 M5Stack おうちハックLT
PDF
StackExchangeで見たシステムプログラミング案件
PDF
Android Lecture #03 @PRO&BSC Inc.
Polyphony の行く末(2018/3/3)
自作LSIコミュニティの可能性
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
M5Stack互換機を作った話
C++0x in programming competition
C++0x in programming competition
x86x64 SSE4.2 POPCNT
[CEDEC2017] LINEゲームのセキュリティ診断手法
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...
自作RISC-VチップでLチカをやってみた
PBL1-v1-006j.pptx
Develop Web Application with Node.js + Express
Androidの入力システム
みんな大好き! Hello, World
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
201812020707 festa2018 M5Stack おうちハックLT
StackExchangeで見たシステムプログラミング案件
Android Lecture #03 @PRO&BSC Inc.
Ad

More from PacSecJP (13)

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
Rouault imbert alpc_rpc_pacsec
PDF
Anıl kurmuş pacsec3-ja
PDF
Lucas apa pacsec slides
PDF
Marc schoenefeld grandma‘s old handbag_draft2_ja
PDF
Marc schoenefeld grandma‘s old handbag_draft2
PDF
Kasza smashing the_jars_j-corrected
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
Nishimura i os版firefoxの脆弱性を見つけ出す_jp
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
Rouault imbert alpc_rpc_pacsec
Anıl kurmuş pacsec3-ja
Lucas apa pacsec slides
Marc schoenefeld grandma‘s old handbag_draft2_ja
Marc schoenefeld grandma‘s old handbag_draft2
Kasza smashing the_jars_j-corrected
Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_v2
Wenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_final
Nishimura i os版firefoxの脆弱性を見つけ出す_jp

Moony li pacsec-1.5_j4-truefinal

  • 4. Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery - 攻撃手段の発見 - Mac/Windows カーネル - Android 脆弱性
  • 5. Jack Tang - @jacktang310 - セキュリティの世界に 10年以上 - ブラウザ - 文書ファイル - Mac/Windows カーネル - 仮想化の脆弱性
  • 7. CVE-2015-3787, CVE-2015-5867, CVE-2015-7021,CVE-2015-7020, CVE-2016-1716,ZDI-CAN-3536,ZDI-CAN-3558, ZDI-CAN- 3598,ZDI-CAN-3596,ZDI-CAN-3603,CVE-2015-7067, CVE-2015- 7076,CVE-2015-7106,CVE-2015-7109,CVE-2016-1718,CVE-2016- 1747,CVE-2016-1749,CVE-2016-1753, ZDI-CAN-3693, ZDI-CAN- 3694, CVE-2016-1795, CVE-2016-1808, CVE-2016-1810, CVE- 2016-1817, CVE-2016-1820, CVE-2016-1798, CVE-2016-1799, CVE-2016-1812, CVE-2016-1814, CVE-2016-1818, CVE-2016-1816, CVE-2016-4648,CVE-2016-4699,CVE-2016-4700,CVE-2016- 4750 CVE 実績
  • 11. 方法 不利な点 備考 伝統的なファジング テストしたいIOKitサービス名を 選択。IOKitユーザモードAPIに ファジングデータを注入 (e.g. IOConnectCallMethod) 呼び出しシーケンスに依存 AppleCamIn (OpenDevice, PowerOnCamera…) 入力データに依存 AppleHDAEngineInput(ユーザモー ド・バッファポインターとして入力) タイミングに依存 IOHDIXHDDriveOutKernel(dmgを マウント) コードレビュー スケーラブルではない 人の経験に依存する リバースエンジニアリング並み に手間がかかる 多くのIOKitサービスとユーザクライ アント ほかのアプローチ方法を比較
  • 13. これらと似てる 比較 川のダム パッシブ・ファジング 基本機能 流れを一度断ち切る (インターセプトする) 実行をインターセプト 上流の流れ ユーザモード・データ 下流の流れ カーネルモード・データ カオスを つくる 上流に毒を流す ユーザ・データをファジン グ 下流では魚が死ぬ カーネルクラッシュ 毒を入れた場所を追う 再現させる …… ……
  • 15. Origianl function Hooker IOAcceleratorFamily2.kext Targeted application from apple store Suspicious module/function manifest IOThunderboltFamily.kext IOUSBFamily.kext AppleGraphicsPowerManagement.kext AppleHDA.kext … … I. is_io_connect_method II. is_io_connect_async_method III. iokit_user_client_trap IV. IOMemoryDescriptor::createMappingInTask V. ipc_kmsg_get VI. ipc_kmsg_send VII. Copyio …... Conditon Checker Ring3 Ring0 Target drivers XNU/ IOKit Tamper StackFrame, Process, UserClient, MsgID, …... Context Matcher 実装 - アーキテクチャの概要
  • 16. TargetAPI(params): //Call Original_TargetAPI(params) if (matchWhitelistParameter(params)) goto _exit(); if !(matchStackFrame() && matchBlacklistParameter(params)) goto _exit; if (random()) {record(params); fuzz(params);} Call Original_TargetAPI(params); if (matchContext(params)) alert; 実装 – Pseudo コード
  • 17. • フック • ユーザから直接アクセス可能 • 一つのフックで多くのプロセスへ • カーネルモードでのインライン・フック • タンパー • ユーザモードからアクセス可能なファジングデータ • e.g. Inband_input, scalar_input, ool_input • サイズではない! (getTargetAndMethodForIndex チェックを迂回する) 実装 – フックとタンパー
  • 18. int, bool, Gen575TextureBuffer**) + 0x12e 0xffffff80c0c7b7c0 0xffffff7fa96f2bd5 AppleIntelHD3000Graphics`Gen6GLContext::process_token_BindTextures(VendorGLStreamInfo&) + 0x103 0xffffff80c0c7b7f0 0xffffff7fa96b6242 AppleIntelHD3000Graphics`IOIntelGLContext::processCommandBuffer(VendorCommandDescriptor*) + 0x12c 0xffffff80c0c7b820 0xffffff7fa96ec1eb AppleIntelHD3000Graphics`Gen6GLContext::processCommandBuffer(VendorCommandDescriptor*) + 0x7b 0xffffff80c0c7b900 0xffffff7fa96b540a AppleIntelHD3000Graphics`IOIntelGLContext::clientMemoryForType(unsigned int, unsigned int*, IOMemoryDescriptor**) + 0x5bc 0xffffff80c0c7b950 0xffffff7fa96b39c3 AppleIntelHD3000Graphics`IOIntelGLContext::submit_command_buffer(unsigned int, sIOGLGetCommandBuffer*) + 0x63 0xffffff80c0c7b980 0xffffff80276b9626 ::shim_io_connect_method_scalarI_structureO(IOExternalMethod *, IOService *, const io_user_scalar_t *, mach_msg_type_number_t, char *, IOByteCount *)((IOExternalMethod *) method = <>, , (IOService *) object = <>, , (const io_user_scalar_t *) input = <>, , (mach_msg_type_number_t) inputCount = <>, , (char *) output = <register r10 is not available>, , (IOByteCount *) outputCount = <register r11 is not available>, ) 0xffffff80c0c7b9e0 0xffffff80276baef0 IOUserClient::externalMethod(unsigned int, IOExternalMethodArguments*, IOExternalMethodDispatch*, OSObject*, void*)((IOUserClient *) this = <>, , (uint32_t) selector = <>, , (IOExternalMethodArguments *) args = 0xffffff80c0c7ba00, (IOExternalMethodDispatch *) dispatch = <>, , (OSObject *) target = <>, , (void *) reference = <>, ) 0xffffff80c0c7bb20 0xffffff80276b7f77 ::is_io_connect_method(io_connect_t, uint32_t, io_user_scalar_t *, mach_msg_type_number_t, char *, mach_msg_type_number_t, mach_vm_address_t, mach_vm_size_t, char *, mach_msg_type_number_t *, io_user_scalar_t *, mach_msg_type_number_t *, mach_vm_address_t, mach_vm_size_t *)((io_connect_t) connection = 0xffffff80c0c7ba60, (uint32_t) selector = 16, (io_user_scalar_t *) scalar_input = <>, , (mach_msg_type_number_t) scalar_inputCnt = <>, , (char *) inband_input = <>, , (mach_msg_type_number_t) inband_inputCnt = 0, (mach_vm_address_t) ool_input = <>, , (mach_vm_size_t) ool_input_size = <no location, value may have been optimized out>, , (char *) inband_output = <no location, value may have been optimized out>, , (mach_msg_type_number_t *) inband_outputCnt = <no location, value may have been optimized out>, , (io_user_scalar_t *) scalar_output = <>, , (mach_msg_type_number_t *) scalar_outputCnt = <no location, value may have been optimized out>, , (mach_vm_address_t) ool_output = <>, , (mach_vm_size_t *) ool_output_size = <>, ) 0xffffff80c0c7bcd0 0xffffff7fa9cd34ab trampline_is_io_connect_method((io_connect_t) connection = 0xffffff8035637000, (uint32_t) selector = 16, (io_user_scalar_t *) scalar_input = 0xffffff80331a4dcc, (mach_msg_type_number_t) scalar_inputCnt = 1, (char *) inband_input = 0xffffff80331a4dd8 "", (mach_msg_type_number_t) inband_inputCnt = 0, (mach_vm_address_t) ool_input = 0, (mach_vm_size_t) ool_input_size = 0, (char *) inband_output = 0xffffff8035805600 "", (mach_msg_type_number_t *) inband_outputCnt = 0xffffff80358055fc, (io_user_scalar_t *) scalar_output = 0xffffff80c0c7bd30, (mach_msg_type_number_t *) scalar_outputCnt = 0xffffff80c0c7bd2c, (mach_vm_address_t) ool_output = 0, (mach_vm_size_t *) ool_output_size = 0xffffff80331a4df8) 0xffffff80c0c7bde0 0xffffff8027158750 _Xio_connect_method((mach_msg_header_t *) InHeadP = <>, , (mach_msg_header_t *) OutHeadP = 0xffffff80358055d0) 実装 – フックとタンパー (スニペット – 報告されなかったクラッシュ)
  • 19. • (ドライバ インターフェース) is_io_connect_method • (ドライバ インターフェース) is_io_connect_async_method • (カーネル) iokit_user_client_trap • (カーネル) IOMemoryDescriptor::createMappingInTask • (IPC Msgをマッチング) ipc_kmsg_get • (IPC Msgをマッチング) ipc_kmsg_send • (一般 I/O) Copyio • … 実装 – フックの概要
  • 20. 実装 – フックの概要 スニペット
  • 21. ファジングを安定させる • ノイズを取り除く o busy コール, black screen コール, hung コール, o 再現されたクラッシュ 脆弱性につながるものを追いかける • カーネル・ヒープアドレスのリーク • ユーザデータをカーネルにマップしてバッファサイズとして 読み取り • … 実装 – なぜコンディション・チェッカー?
  • 22. • &&, ||, *(wild match), white(black) • プロセス • ユーザID (root/Non-root) • プロセス名 (例: Safari, RCE, sandbox-evasion) • モジュール • モジュール名 • 関数 • シンボル名・アドレス • オフセットの範囲 実装 – 抽出の条件 1/3
  • 23. //Config for mac prodetail_control_entry_t g_white_listing_detail_control[] ={ // procName,uid,driverBundleName, driverClassName, selFunctionNO //"*",0,"*","*",ANY_MATCH_INTEGER,#if 0 //Reported or collected yet: //{"*",PROCESS_UID_ANY_INTEGER,"*","AGPMClient",7312}, //{"*",PROCESS_UID_ANY_INTEGER,"*", "nvDeviceTesla", 5}, //{"*",PROCESS_UID_ANY_INTEGER,"*", "NV2DContextTesla", 17}, //{"*",PROCESS_UID_ANY_INTEGER,"*","IONVSurfaceTesla",10}, //{"*",PROCESS_UID_ANY_INTEGER,"*","IOHDIXHDDriveOutKernelUserClient",2}, {"*",PROCESS_UID_ANY_INTEGER,"*","IGAccelSharedUserClient",1},//crash-24 {"*",PROCESS_UID_ANY_INTEGER,"*","AccelSurface",16},//crash-23 {"*",PROCESS_UID_ANY_INTEGER,"*",OBJECT_CLASS_NAME_NO_FOUND,16}, {"*",PROCESS_UID_ANY_INTEGER,"*","HD",2},//crash-21 //"*",PROCESS_UID_ANY_INTEGER,"*","Accel",2,//crash-28 //"*",PROCESS_UID_ANY_INTEGER,"*","IG",2,//crash-28 //"*",PROCESS_UID_ANY_INTEGER,"*","Con",2,//crash-28 "*",PROCESS_UID_ANY_INTEGER,"*","IGAccelSharedUserClient",0,//crash-29 "*",PROCESS_UID_ANY_INTEGER,"*","IOThunderboltFamilyUserClient",22,//crash-30 //"*",PROCESS_UID_ANY_INTEGER,"*","IG",ANY_MATCH_INTEGER, //"*",PROCESS_UID_ANY_INTEGER,"*","Accel",ANY_MATCH_INTEGER, //"vm",PROCESS_UID_ANY_INTEGER,"*","*",ANY_MATCH_INTEGER, //"*",PROCESS_UID_ANY_INTEGER,"*","vm",ANY_MATCH_INTEGER, "sandbox",PROCESS_UID_ANY_INTEGER,"*","*",ANY_MATCH_INTEGER, "dog",PROCESS_UID_ANY_INTEGER,"*","*",ANY_MATCH_INTEGER, //{"WindowServer",PROCESS_UID_ANY_INTEGER,"*","AccelSurface",16},//crash-23 //"*",PROCESS_UID_ANY_INTEGER,"*","SMC",ANY_MATCH_INTEGER, //"windowserver",PROCESS_UID_ANY_INTEGER,"*","*",ANY_MATCH_INTEGER,}; 実装 – ホワイト・リスティングの事例
  • 24. • データ • is_address_RWX • コピーの方向(in/out) • カーネル・スペースかユーザ・スペース (SMAP ノイズ) • コール・スタック • 関数の戻り先アドレス • スタック・レベル (一番底から一番上まで) • レベル範囲 [,] 実装 – 抽出の条件 2/3
  • 25. stack_match_item_t stack_matcher_for_copyio[]={ //If any item in list match, then match //{routineName, cache}, routineAddress, offSetFrom, offsetTo, levelLow, levelHigh {{"_shim_io_connect_method_scalarI_scalarO",STACK_ANY_INTEGER},STACK_ANY_INTEGE R,0, 0xC120-0xB8B0, STACK_ALL_LEVEL_RANGE}, {{"_shim_io_connect_method_scalarI_structureO",STACK_ANY_INTEGER},STACK_ANY_INTE GER,0, 0xDB94-0xD5C0, STACK_ALL_LEVEL_RANGE}, {{"_shim_io_connect_method_scalarI_structureI",STACK_ANY_INTEGER},STACK_ANY_INTE GER,0, 0xEA97-0xE490, STACK_ALL_LEVEL_RANGE}, {{"_shim_io_connect_method_structureI_structureO",STACK_ANY_INTEGER},STACK_ANY_IN TEGER,0, 0xF588-0xF270, STACK_ALL_LEVEL_RANGE}, {{"_is_io_connect_method",STACK_ANY_INTEGER},STACK_ANY_INTEGER,0, 0xb2a9- 0xaf10,STACK_ALL_LEVEL_RANGE}, } 実装 – スタック・フレームの例
  • 26. 抽出の条件 3/3 • その他 • Mach_msg • msg サブシステム id… • Userclient • serviceName,ClassName,selector…
  • 27. detail_control_entry_t g_white_listing_detail_control[] ={ // procName,uid,driverBundleName, driverClassName, selFunctionNO //{"*",PROCESS_UID_ANY_INTEGER,"*","AGPMClient",7312},, {"*",PROCESS_UID_ANY_INTEGER,"*","IGAccelSharedUserClient",1},//crash-24 {"*",PROCESS_UID_ANY_INTEGER,"*","AccelSurface",16},//crash-23 {"*",PROCESS_UID_ANY_INTEGER,"*",OBJECT_CLASS_NAME_NO_FOUND,16}, {"*",PROCESS_UID_ANY_INTEGER,"*","HD",2},//crash-21 {"*",PROCESS_UID_ANY_INTEGER,"*","IX",2},//crash-21 "*",PROCESS_UID_ANY_INTEGER,"*","AGPM",7312,//crash-11 "*",PROCESS_UID_ANY_INTEGER,"*","IGAccelGLContext",2,//crash-28 実装 – UserClient の例
  • 28. #define KMSG_IOKIT_SUBSYSTEM_RANGE 0xAF0, 0x0B47 detail_control_entry_for_ipc_kmsg_send_t g_black_listing_detail_control_foripc_kmsg_send[] ={ //procName,uid,msg_id_from, msg_id_to, routineName, addr, addr_offset_from, addr_offset_to "chrome",PROCESS_UID_ANY_INTEGER, KMSG_IOKIT_SUBSYSTEM_RANGE,"__Xio_connect_method",KMSG_ADDR_OFFSET_ANY_RANGE, KMSG_LEAVING,}; • #define KMSG_IOKIT_SUBSYSTEM_RANGE 0xAF0, 0x0B47 • #define KMSG_MACH_VM_SUBSYSTEM_RANGE 0x12C0, 0x12D4 • #define KMSG_MACH_PORT_SUBSYSTEM_RANGE 0xC80, 0x0CA4 • #define KMSG_MACH_HOST_SUBSYSTEM_RANGE 0xC8, 0xE4 • #define KMSG_HOST_PRIV_SUBSYSTEM_RANGE 0x190, 0x1AA • …… 実装 – Mach-msg の例
  • 29. • コード・レビューのための啓発 • バグだらけなモジュール、リバース・エンジニアリングの インターフェース • バグ・ハンティングの活動で積み重ねられてきた パターン • 脆弱性は無いが脆弱性の疑いを示唆するもの • コンディション・チェッカーを通じて実装されたもの 実装 – 何がつながる?
  • 30. • いくつかのIOKitに関連したメモリ破壊脆弱性が下記 の流れで起こり得る : • ユーザモード・バッファスペースをカーネルモードにマッピ ングするためにIOMemoryDescriptor :: createMappingInTaskを呼び出す • バッファから値を読み出し、その値をバッファの読み出しか 書き込みに使用する • いくつかのカーネル情報漏洩脆弱性が下記の流れ で起こり得る: • 出力バッファのコンテンツに0xFFFFFFのプレフィックスが 付いている 実装 – 脆弱性につながるものの例
  • 31. • ファジング・ソース: • 複数のアプリケーション • AppStore (MMORPG games, FaceTime,USB hardisk, BlueTooth, Wifi, VM,DirectX…) • Virus Total, Apple OpenSource UT, github サンプルコード • 豊富な種類のファジング・ソース • Active fuzzing, Python watchdog, browsing WebGL • ファジングの安定性: • コンディション・チェッカーを使うことで、意図的なハング・アップやブ ラック・スクリーン、そして、再現された事象をバイパスできた (nvTestlaSurfaceTesla, IGAccelGLContext, IGAccelSurface…) 成功事例 – パッシブ・ファジング 1/3
  • 32. • 再現: • ネットワークにログイン • NVRAMにログイン? メモリと kdp_panic_dump コールバックにログ イン? • コアダンプ・サーバ • sh-3.2# nvram boot-args=”pmuflags=1 debug=0xd44 kext-dev-mode=1 kcsuffix=development – v _panicd_ip=10.64.80.106” • Thunderbolt + fwkdp + lldb • 自動化 • kdp_panic_dump callback+dump+reboot? • VM(Vmware fusion, Qemu…) で回復? 成功事例 – パッシブ・ファジング 2/3
  • 33. 雑多な教訓 • 時々はファジングをやってみることをお勧めする • 正常にプログラムは走っている – そして突然ファジング • 最新のKDKで常にOSバージョンを最新に 成功事例 – パッシブ・ファジング 3/3
  • 35. • パッシブ・ファジングからの統計データ • アクセス可能なユーザクライアント、non-root、non- sandbox、クラッシュの頻度、クラッシュのタイプ(UAF, OOB)… • 不要なチェックを回避するためにより低いレベルでAPI にアクセス(可能ならば) • Mac-O format, find symbol, hard-code offset を解決 • e.g. IOServiceGetMatchingServices(mach_port_t, CFDictionaryRef, io_iterator_t *) ->io_service_get_matching_services_bin(mach_port_t, char*,int, void*) 成功事例 – アクティブ・ファジング 1/3
  • 36. • 再現: • ランダムなコールやパラメータを記録する必要はない - ただpseudorandomのシードを記録しろ (例: Mt19937- 64/Mt19937-32) • カーネルクラッシュは、APIコールやファジング・パラメータ のランダムさに関わらずに簡単に再現できる 成功事例 – アクティブ・ファジング 2/3
  • 37. seed = CrahsedCases[i] for(randomSelect every kernel module) for(randomSelect every interface) APICall( randomByte() ) 成功事例 – アクティブ・ファジング 2/3 再現のためのPseudoコード
  • 38. for (every fuzz session) seed = generate() sendSeedOutside() for(randomSelect every kernel module) for(randomSelect every interface) APICall( randomByte() ) 成功事例 – アクティブ・ファジング 2/3 アクティブ・ファジングのためのPseudoコード
  • 39. • 再現: • 複数の接続のためのWebシードサーバ • 相対的に短いファジング・サイクルのための1つの pseudorandom シード 成功事例 – アクティブ・ファジング 3/3
  • 42. • SIP (System Integrity Protection) • KALSR(e.g. PEGASUS CVE-2016-4655) • SMAP • SMEP https://speakerdeck.com/marcograss/dont-trust-your-eye-apple- graphics-is-compromised セキュリティ対策
  • 43. • KASLRを回避 – 実行時のカーネルコードセグメントのアドレスを漏らす脆 弱性を使用 – 漏れたAPIを使ってペイロードを作成 (e.g. thread_exception_return) • SMAPを回避 – カーネルのヒープ・アドレスを漏らす脆弱性を使用 – カーネル・ヒープ内でROPチェーンを構成 – カーネルのヒープ・アドレスが必要 • SMEPを回避 – RIPをカーネルで実行する脆弱性を使用 – SMEP/SMAPを無効化するためのROPチェーンを実行 – ペイロードを実行 攻撃手法
  • 44. • OSX/iOSハックの「教祖」 Stefan Esser (@i0n1c) はSyScan 2012 にて OSUnserializeXMLが良い 手段と提案した https://reverse.put.as/wp- content/uploads/2011/06/SyScan2012_StefanEsser_iOS_Kernel_Heap_Armageddon.pdf Heap feng shuiの豆知識 OSUnerializeXML()
  • 45. • ほとんどの場合で、 OSUnserializeXML によって 割り当てられたOSDictionaryは、 OSObject::release のシステムコール1つで解放 される 。。。 しかし…
  • 46. • もし、割り当てられたオブジェクトがほかのコンポー ネントに参照された場合、object::release をそれ に対して呼び出しても解放されない • IORegistry はHeap Fengshuiにとって良い選択 • なので、 IORegistry メソッド呼び出しの近くで呼び 出されている IORegistry method calling を見つ けた… しかし…
  • 47. • IOKIT サービスでは IOMProotDomain , slector 7 (kPMSleepSystemOptions) RootDomainUserClient::secureSleepSystemOptions 。。。 常に例外
  • 49. • CVE-2016-xxx : これはAppleHDAEngineInput カーネルモジュールにおける典型的な UAF脆弱性 • CVE-2016-xxxx: オブジェクト・アドレスを漏らすディスクイメージ モジュール内のもう一つのバグ このアドレスはカーネル・ヒープに存在 バグ
  • 50. payload Ring3 Ring0 kernel SMAP SMEP KASLR kslide Driver Memory address – Disk Address Call current_proc Call proc_ucred Call posix_cred_get Call thread_exception_return IOCommand Exploit App ROP Gadgets mov cr4 rax; ret Call payload StackPivot 0x68 Object 0x108 AppleHDAEngineInput IOHDIXHDDriveOutKernel vtable_addr +0 +8 call [vtable+0] [1]Leak kernel buffer IOCommand address [3]Spray freed IOCommand with OSData(StackPivot) [2]Free IOCommand [4]Free Object [5]Spray freed Object with OSData(leaked IOCommand and ROP) [0]Leak kslide to build up payload [6]Trigger execution by use Object 攻撃の手順 1/2
  • 54. Special thanks: Herry Li, @zenhumany Juwei Lin, @fuzzerDOTcn