19.11.2016 Views

Technical Analysis of the Pegasus Exploits on iOS

eNQc3Ry

eNQc3Ry

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

clock_ops_overwrite Buffer:<br />

[00] (rtclock.getattr): address <str<strong>on</strong>g>of</str<strong>on</strong>g> OSSerializer::serialize<br />

[04] (calend_c<strong>on</strong>fig): NULL<br />

[08] (calend_init): NULL<br />

[0C] (calend_gettime): address <str<strong>on</strong>g>of</str<strong>on</strong>g> calen_getattr<br />

[10] (calend_getattr): address <str<strong>on</strong>g>of</str<strong>on</strong>g> _bufattr_cpx<br />

uaf_payload_buffer Exploit Buffer:<br />

[00] ptr to clock_ops_overwrite buffer<br />

[04] address <str<strong>on</strong>g>of</str<strong>on</strong>g> clock_ops array in kern memory<br />

[08] address <str<strong>on</strong>g>of</str<strong>on</strong>g> _copyin<br />

[0C] NULL<br />

[10] address <str<strong>on</strong>g>of</str<strong>on</strong>g> OSSerializer::serialize<br />

[14] address <str<strong>on</strong>g>of</str<strong>on</strong>g> "BX LR" code fragment<br />

[18] NULL<br />

[1C] address <str<strong>on</strong>g>of</str<strong>on</strong>g> OSSymbol::getMetaClass<br />

[20] address <str<strong>on</strong>g>of</str<strong>on</strong>g> "BX LR" code fragment<br />

[24] address <str<strong>on</strong>g>of</str<strong>on</strong>g> "BX LR" code fragment<br />

32Stage2 generates a new thread to handle <str<strong>on</strong>g>the</str<strong>on</strong>g> necessary setup for <str<strong>on</strong>g>the</str<strong>on</strong>g> installati<strong>on</strong> <str<strong>on</strong>g>of</str<strong>on</strong>g> <str<strong>on</strong>g>the</str<strong>on</strong>g> new<br />

clock handlers though <str<strong>on</strong>g>the</str<strong>on</strong>g> new thread, itself, does not perform <str<strong>on</strong>g>the</str<strong>on</strong>g> installati<strong>on</strong>. The thread<br />

begins by establishing a kauth_filesec data structure <strong>on</strong> <str<strong>on</strong>g>the</str<strong>on</strong>g> stack with <str<strong>on</strong>g>the</str<strong>on</strong>g> following values:<br />

.fsec_magic = KAUTH_FILESEC_MAGIC; // 0x12CC16D<br />

.fsec_owner = ;<br />

.fsec_group = ;<br />

.fsec_acl.entrycount = KAUTH_FILESEC_NOACL; // -1<br />

The uaf_payload_buffer exploit buffer is appended to <str<strong>on</strong>g>the</str<strong>on</strong>g> end <str<strong>on</strong>g>of</str<strong>on</strong>g> <str<strong>on</strong>g>the</str<strong>on</strong>g> kauth_filesec structure<br />

in what is defined as <str<strong>on</strong>g>the</str<strong>on</strong>g> kauth_filesec.fsec_acl.acl_ace[] array area.The thread <str<strong>on</strong>g>the</str<strong>on</strong>g>n<br />

opens a port to IOKit and calls IOServiceGetMatchingService for AppleKeyStore.<br />

Using <str<strong>on</strong>g>the</str<strong>on</strong>g> same technique explained previously in <str<strong>on</strong>g>the</str<strong>on</strong>g> Kernel Locati<strong>on</strong> secti<strong>on</strong>, <str<strong>on</strong>g>the</str<strong>on</strong>g> thread<br />

obtains a valid kernel memory locati<strong>on</strong>. The <strong>on</strong>ly difference between <str<strong>on</strong>g>the</str<strong>on</strong>g> new thread’s use <str<strong>on</strong>g>of</str<strong>on</strong>g> <str<strong>on</strong>g>the</str<strong>on</strong>g><br />

AppleKeyStore disclosure vulnerability and <str<strong>on</strong>g>the</str<strong>on</strong>g> method used by 32Stage2 previously is <str<strong>on</strong>g>the</str<strong>on</strong>g><br />

property name that <str<strong>on</strong>g>the</str<strong>on</strong>g> thread uses (which is<br />

“ararararararararararararararararararararararararararararararararararar<br />

arararararararararararararararararararararararararararara").<br />

After obtaining <str<strong>on</strong>g>the</str<strong>on</strong>g> kernel address from <str<strong>on</strong>g>the</str<strong>on</strong>g> AppleKeyStore, a syscall is made to <str<strong>on</strong>g>the</str<strong>on</strong>g><br />

open_extended functi<strong>on</strong>. 32Stage2 passes <str<strong>on</strong>g>the</str<strong>on</strong>g> locati<strong>on</strong> <str<strong>on</strong>g>of</str<strong>on</strong>g> <str<strong>on</strong>g>the</str<strong>on</strong>g> lock file to <str<strong>on</strong>g>the</str<strong>on</strong>g> syscall al<strong>on</strong>g with<br />

both <str<strong>on</strong>g>the</str<strong>on</strong>g> KAUTH_UID_NONE and KAUTH_GID_NONE values and <str<strong>on</strong>g>the</str<strong>on</strong>g> kauth_filesec structure<br />

c<strong>on</strong>structed at <str<strong>on</strong>g>the</str<strong>on</strong>g> start <str<strong>on</strong>g>of</str<strong>on</strong>g> <str<strong>on</strong>g>the</str<strong>on</strong>g> thread. At <str<strong>on</strong>g>the</str<strong>on</strong>g> start <str<strong>on</strong>g>of</str<strong>on</strong>g> <str<strong>on</strong>g>the</str<strong>on</strong>g> open_extended functi<strong>on</strong>, <str<strong>on</strong>g>the</str<strong>on</strong>g> following<br />

code executes:<br />

if ((uap->xsecurity != USER_ADDR_NULL) &&<br />

((ciferror = kauth_copyinfilesec(uap->xsecurity, &xsecdst)) != 0))<br />

The kauth_copyinfilesec functi<strong>on</strong> copies <str<strong>on</strong>g>the</str<strong>on</strong>g> kauth_filesec structure passed from<br />

userland into a kauth_filesec structure in <str<strong>on</strong>g>the</str<strong>on</strong>g> kernel address space. Before explaining <str<strong>on</strong>g>the</str<strong>on</strong>g><br />

Page 22

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!