パッシブ・ファジングを補完する アクティブ・ファジング osx … · moony li...
TRANSCRIPT
![Page 1: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/1.jpg)
パッシブ・ファジングを補完するアクティブ・ファジング
~OSXの脆弱性を趣味と実益を兼ねて~
Complementary
Active & Passive Fuzzing
![Page 2: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/2.jpg)
本日の内容
• 俺たち何者?
• パッシブ・ファジングのフレームワーク
• Rootに至る攻撃
![Page 3: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/3.jpg)
![Page 4: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/4.jpg)
Moony Li
- @Flyic- セキュリティの世界に7年間
- Sandcastle - Deep Discovery- 攻撃手段の発見- Mac/Windows カーネル- Android 脆弱性
![Page 5: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/5.jpg)
Jack Tang
- @jacktang310- セキュリティの世界に
10年以上- ブラウザ- 文書ファイル- Mac/Windows カーネル- 仮想化の脆弱性
![Page 6: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/6.jpg)
![Page 7: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/7.jpg)
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 実績
![Page 9: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/9.jpg)
![Page 10: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/10.jpg)
ここでの内容
• アプローチ方法の比較
• 我々のアプローチと検討
• 実装
• 成功事例
![Page 11: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/11.jpg)
方法 不利な点 備考
伝統的なファジングテストしたいIOKitサービス名を選択。IOKitユーザモードAPIにファジングデータを注入
(e.g. IOConnectCallMethod)
呼び出しシーケンスに依存 AppleCamIn (OpenDevice, PowerOnCamera…)
入力データに依存 AppleHDAEngineInput(ユーザモード・バッファポインターとして入力)
タイミングに依存 IOHDIXHDDriveOutKernel(dmgをマウント)
コードレビュースケーラブルではない 人の経験に依存する
リバースエンジニアリング並みに手間がかかる
多くのIOKitサービスとユーザクライアント
ほかのアプローチ方法を比較
![Page 12: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/12.jpg)
我々のアプローチ・検討インターセプトとポイズニング
![Page 13: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/13.jpg)
これらと似てる
比較 川のダム パッシブ・ファジング
基本機能 流れを一度断ち切る(インターセプトする)
実行をインターセプト
上流の流れ ユーザモード・データ
下流の流れ カーネルモード・データ
カオスをつくる
上流に毒を流す ユーザ・データをファジング
下流では魚が死ぬ カーネルクラッシュ
毒を入れた場所を追う 再現させる
…… ……
![Page 14: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/14.jpg)
こんな感じに・・・
![Page 15: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/15.jpg)
Origianl function
Hooker
IOAcceleratorFamily2.kext
Targeted application from apple storeSuspicious
module/function
manifest
IOThunderboltFamily.kext IOUSBFamily.kext
AppleGraphicsPowerManagement.kext AppleHDA.kext … …
I. is_io_connect_methodII. is_io_connect_async_methodIII. iokit_user_client_trapIV. IOMemoryDescriptor::createMappingInTaskV. ipc_kmsg_getVI. ipc_kmsg_sendVII. Copyio…...
Conditon Checker
Ring3
Ring0
Target
drivers
XNU/
IOKit
Tamper
StackFrame,Process,UserClient,MsgID,…...
Context Matcher
実装-アーキテクチャの概要
![Page 16: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/16.jpg)
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 コード
![Page 17: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/17.jpg)
•フック
• ユーザから直接アクセス可能
• 一つのフックで多くのプロセスへ
• カーネルモードでのインライン・フック
•タンパー
• ユーザモードからアクセス可能なファジングデータ
• e.g. Inband_input, scalar_input, ool_input
• サイズではない! (getTargetAndMethodForIndex チェックを迂回する)
実装 – フックとタンパー
![Page 18: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/18.jpg)
0xffffff80c0c7b720 0xffffff7fa96ec9f2 AppleIntelHD3000Graphics`Gen6GLContext::bind_texture(VendorGLStreamInfo&, unsigned int, unsigned 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)
0xffffff80c0c7be10 0xffffff8027083443 ipc_kobject_server((ipc_kmsg_t) request = 0xffffff80331a4d40)
実装 – フックとタンパー(スニペット –報告されなかったクラッシュ)
![Page 19: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/19.jpg)
• (ドライバインターフェース) 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
• …
実装 – フックの概要
![Page 20: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/20.jpg)
実装 – フックの概要 スニペット
![Page 21: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/21.jpg)
ファジングを安定させる
• ノイズを取り除く
o busy コール, black screen コール, hung コール,
o 再現されたクラッシュ
脆弱性につながるものを追いかける
• カーネル・ヒープアドレスのリーク
• ユーザデータをカーネルにマップしてバッファサイズとして
読み取り
• …
実装 – なぜコンディション・チェッカー?
![Page 22: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/22.jpg)
• &&, ||, *(wild match), white(black)
• プロセス• ユーザID (root/Non-root)
• プロセス名 (例: Safari, RCE, sandbox-evasion)
• モジュール• モジュール名
•関数• シンボル名・アドレス
• オフセットの範囲
実装 –抽出の条件 1/3
![Page 23: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/23.jpg)
//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,};
実装 – ホワイト・リスティングの事例
![Page 24: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/24.jpg)
• データ• is_address_RWX
• コピーの方向(in/out)
• カーネル・スペースかユーザ・スペース (SMAP ノイズ)
• コール・スタック• 関数の戻り先アドレス
• スタック・レベル (一番底から一番上まで)
• レベル範囲 [,]
実装 –抽出の条件 2/3
![Page 25: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/25.jpg)
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_INTEGER,0, 0xC120-0xB8B0, STACK_ALL_LEVEL_RANGE},
{{"_shim_io_connect_method_scalarI_structureO",STACK_ANY_INTEGER},STACK_ANY_INTEGER,0, 0xDB94-0xD5C0, STACK_ALL_LEVEL_RANGE},
{{"_shim_io_connect_method_scalarI_structureI",STACK_ANY_INTEGER},STACK_ANY_INTEGER,0, 0xEA97-0xE490, STACK_ALL_LEVEL_RANGE},
{{"_shim_io_connect_method_structureI_structureO",STACK_ANY_INTEGER},STACK_ANY_INTEGER,0, 0xF588-0xF270, STACK_ALL_LEVEL_RANGE},
{{"_is_io_connect_method",STACK_ANY_INTEGER},STACK_ANY_INTEGER,0, 0xb2a9-0xaf10,STACK_ALL_LEVEL_RANGE},
}
実装 – スタック・フレームの例
![Page 26: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/26.jpg)
抽出の条件 3/3
• その他• Mach_msg
• msgサブシステム id…
• Userclient• serviceName,ClassName,selector…
![Page 27: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/27.jpg)
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の例
![Page 28: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/28.jpg)
#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の例
![Page 29: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/29.jpg)
•コード・レビューのための啓発• バグだらけなモジュール、リバース・エンジニアリングのインターフェース
•バグ・ハンティングの活動で積み重ねられてきたパターン
•脆弱性は無いが脆弱性の疑いを示唆するもの
•コンディション・チェッカーを通じて実装されたもの
実装 –何がつながる?
![Page 30: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/30.jpg)
• いくつかのIOKitに関連したメモリ破壊脆弱性が下記の流れで起こり得る :• ユーザモード・バッファスペースをカーネルモードにマッピングするためにIOMemoryDescriptor :: createMappingInTaskを呼び出す
• バッファから値を読み出し、その値をバッファの読み出しか書き込みに使用する
• いくつかのカーネル情報漏洩脆弱性が下記の流れで起こり得る:• 出力バッファのコンテンツに0xFFFFFFのプレフィックスが付いている
実装 –脆弱性につながるものの例
![Page 31: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/31.jpg)
• ファジング・ソース:
• 複数のアプリケーション
• 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
![Page 32: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/32.jpg)
•再現:
• ネットワークにログイン
• 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
![Page 33: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/33.jpg)
雑多な教訓
• 時々はファジングをやってみることをお勧めする
• 正常にプログラムは走っている –そして突然ファジング
• 最新のKDKで常にOSバージョンを最新に
成功事例 –パッシブ・ファジング 3/3
![Page 34: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/34.jpg)
成功事例 – どのようにパッシブ・ファジングを補完する?
![Page 35: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/35.jpg)
•パッシブ・ファジングからの統計データ
• アクセス可能なユーザクライアント、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
![Page 36: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/36.jpg)
•再現:
• ランダムなコールやパラメータを記録する必要はない -
ただpseudorandomのシードを記録しろ (例: Mt19937-
64/Mt19937-32)
• カーネルクラッシュは、APIコールやファジング・パラメータ
のランダムさに関わらずに簡単に再現できる
成功事例 – アクティブ・ファジング 2/3
![Page 37: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/37.jpg)
seed = CrahsedCases[i]
for(randomSelect every kernel module)
for(randomSelect every interface)
APICall( randomByte() )
成功事例 – アクティブ・ファジング 2/3
再現のためのPseudoコード
![Page 38: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/38.jpg)
for (every fuzz session)
seed = generate()
sendSeedOutside()
for(randomSelect every kernel module)
for(randomSelect every interface)
APICall( randomByte() )
成功事例 – アクティブ・ファジング 2/3アクティブ・ファジングのためのPseudoコード
![Page 39: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/39.jpg)
•再現:
• 複数の接続のためのWebシードサーバ
• 相対的に短いファジング・サイクルのための1つの
pseudorandom シード
成功事例 – アクティブ・ファジング 3/3
![Page 40: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/40.jpg)
![Page 41: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/41.jpg)
ここでの内容
• セキュリティ対応
攻撃手法
• 攻撃の実践
![Page 42: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/42.jpg)
• 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
セキュリティ対策
![Page 43: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/43.jpg)
• KASLRを回避–実行時のカーネルコードセグメントのアドレスを漏らす脆弱性を使用
–漏れたAPIを使ってペイロードを作成
(e.g. thread_exception_return)
• SMAPを回避–カーネルのヒープ・アドレスを漏らす脆弱性を使用
–カーネル・ヒープ内でROPチェーンを構成
–カーネルのヒープ・アドレスが必要
• SMEPを回避–RIPをカーネルで実行する脆弱性を使用
–SMEP/SMAPを無効化するためのROPチェーンを実行
–ペイロードを実行
攻撃手法
![Page 44: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/44.jpg)
• 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()
![Page 45: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/45.jpg)
•ほとんどの場合で、 OSUnserializeXMLによって割り当てられたOSDictionaryは、OSObject::release のシステムコール1つで解放される
。。。
しかし…
![Page 46: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/46.jpg)
• もし、割り当てられたオブジェクトがほかのコンポーネントに参照された場合、object::release をそれに対して呼び出しても解放されない
• IORegistryはHeap Fengshuiにとって良い選択
• なので、 IORegistry メソッド呼び出しの近くで呼び出されている IORegistry method calling を見つけた…
しかし…
![Page 47: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/47.jpg)
• IOKIT サービスでは IOMProotDomain , slector 7 (kPMSleepSystemOptions)
RootDomainUserClient::secureSleepSystemOptions
。。。
常に例外
![Page 48: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/48.jpg)
Appleを見つけたバグとHeap Fengshuiの豆知識とでrootに至る
まで攻撃する
![Page 49: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/49.jpg)
• CVE-2016-xxx :
これはAppleHDAEngineInput
カーネルモジュールにおける典型的な
UAF脆弱性
• CVE-2016-xxxx:
オブジェクト・アドレスを漏らすディスクイメージ
モジュール内のもう一つのバグ
このアドレスはカーネル・ヒープに存在
バグ
![Page 50: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/50.jpg)
payload
Ring3
Ring0
kernel
SMAPSMEP
KASLR
kslide
Driver
Memory address – Disk Address
Call current_procCall proc_ucredCall posix_cred_get
Call thread_exception_return
IOCommand
Exploit App
ROP Gadgets
mov cr4 rax; ret
Call payload
StackPivot0x68
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
![Page 51: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/51.jpg)
IOCommandStackPivot
Object
Exploit Apppayload
+0
+8
攻撃の手順 2/2
![Page 52: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/52.jpg)
デモ
![Page 53: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/53.jpg)
どうもありがとうございました
<(_ _)>
![Page 54: パッシブ・ファジングを補完する アクティブ・ファジング OSX … · Moony Li - @Flyic - セキュリティの世界に 7年間 - Sandcastle - Deep Discovery](https://reader033.vdocuments.net/reader033/viewer/2022042308/5ed4605e05beeb3a300884fb/html5/thumbnails/54.jpg)
Special thanks:
Herry Li, @zenhumany
Juwei Lin, @fuzzerDOTcn