19.11.2016 Views

Technical Analysis of the Pegasus Exploits on iOS

eNQc3Ry

eNQc3Ry

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

list <str<strong>on</strong>g>of</str<strong>on</strong>g> all <str<strong>on</strong>g>of</str<strong>on</strong>g> its running threads and immediately place each thread (outside <str<strong>on</strong>g>of</str<strong>on</strong>g> its main thread) in<br />

a suspended state. Next, Stage 2 modifies <str<strong>on</strong>g>the</str<strong>on</strong>g> scheduling policies for <str<strong>on</strong>g>the</str<strong>on</strong>g> main thread to fur<str<strong>on</strong>g>the</str<strong>on</strong>g>r<br />

increase <str<strong>on</strong>g>the</str<strong>on</strong>g> probability that <str<strong>on</strong>g>the</str<strong>on</strong>g> UAF exploit will not face competiti<strong>on</strong> for <str<strong>on</strong>g>the</str<strong>on</strong>g> memory in<br />

questi<strong>on</strong>.<br />

An additi<strong>on</strong>al step is performed in <str<strong>on</strong>g>the</str<strong>on</strong>g> 64-bit versi<strong>on</strong> <str<strong>on</strong>g>of</str<strong>on</strong>g> Stage 2. With <str<strong>on</strong>g>the</str<strong>on</strong>g> thread scheduler<br />

modificati<strong>on</strong>s complete, 64Stage2 generates up to 1000 threads. Each thread c<strong>on</strong>sists <str<strong>on</strong>g>of</str<strong>on</strong>g> a<br />

single tight loop that merely wait for a global variable to drop below a predefined value (in this<br />

case, <str<strong>on</strong>g>the</str<strong>on</strong>g> value is less than 0). This behavior is intended to ensure (or, at least, significantly<br />

increase <str<strong>on</strong>g>the</str<strong>on</strong>g> chances) that no additi<strong>on</strong>al threads may spawn that can compete for <str<strong>on</strong>g>the</str<strong>on</strong>g> UAF’s<br />

targeted memory.<br />

Establishing Communicati<strong>on</strong> Channel (32-Bit)<br />

32Stage2 generates ano<str<strong>on</strong>g>the</str<strong>on</strong>g>r pipe set using <str<strong>on</strong>g>the</str<strong>on</strong>g> pipe command, reusing <str<strong>on</strong>g>the</str<strong>on</strong>g> same variable that<br />

held <str<strong>on</strong>g>the</str<strong>on</strong>g> original pipe set 32Stage2 generated. This acti<strong>on</strong> is immediately followed by calls to<br />

host_get_clock_service in order to get access to <str<strong>on</strong>g>the</str<strong>on</strong>g> real-time and battery clocks. As with<br />

<str<strong>on</strong>g>the</str<strong>on</strong>g> pipe set, <str<strong>on</strong>g>the</str<strong>on</strong>g> calls to host_get_clock_service reuse <str<strong>on</strong>g>the</str<strong>on</strong>g> same variables from <str<strong>on</strong>g>the</str<strong>on</strong>g><br />

previous calls to host_get_clock_service that gain a port to <str<strong>on</strong>g>the</str<strong>on</strong>g> various clocks.<br />

The previous generati<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> pipe set and <str<strong>on</strong>g>the</str<strong>on</strong>g> clock ports were necessary because <str<strong>on</strong>g>the</str<strong>on</strong>g>se<br />

items are used later for kernel manipulati<strong>on</strong> and if <str<strong>on</strong>g>the</str<strong>on</strong>g> kernel task port was available already,<br />

32Stage2 would simply skip <str<strong>on</strong>g>the</str<strong>on</strong>g> exploitati<strong>on</strong> process necessary to modify <str<strong>on</strong>g>the</str<strong>on</strong>g> kernel and instead<br />

modify <str<strong>on</strong>g>the</str<strong>on</strong>g> kernel directly through vm_write calls. However, if 32Stage2 does not have access<br />

to <str<strong>on</strong>g>the</str<strong>on</strong>g> kernel task port (<str<strong>on</strong>g>the</str<strong>on</strong>g> default case <strong>on</strong> a n<strong>on</strong>-jailbroken device), exploitati<strong>on</strong> is necessary in<br />

order to acquire such access. As part <str<strong>on</strong>g>of</str<strong>on</strong>g> this exploitati<strong>on</strong> process, 32Stage2 needs to have <str<strong>on</strong>g>the</str<strong>on</strong>g><br />

pipe set and clocks available prior to <str<strong>on</strong>g>the</str<strong>on</strong>g> exploit’s activati<strong>on</strong>, and thus <str<strong>on</strong>g>the</str<strong>on</strong>g> binary ensures that<br />

<str<strong>on</strong>g>the</str<strong>on</strong>g>y are available. While this is unnecessarily repetitive, it does serve to ensure that <str<strong>on</strong>g>the</str<strong>on</strong>g> critical<br />

objects are readily available.<br />

The 64-bit versi<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> Stage 2 binary does not need to perform this step, given that <str<strong>on</strong>g>the</str<strong>on</strong>g><br />

triggering mechanism used to ultimately call <str<strong>on</strong>g>the</str<strong>on</strong>g> functi<strong>on</strong> is little more than a redirecti<strong>on</strong> <str<strong>on</strong>g>of</str<strong>on</strong>g> an<br />

existing functi<strong>on</strong> pointer to a sysctl handler.<br />

Payload C<strong>on</strong>structi<strong>on</strong> and Kernel Inserti<strong>on</strong> (32-Bit)<br />

Without a means to modify kernel memory through <str<strong>on</strong>g>the</str<strong>on</strong>g> kernel port, 32Stage2 must leverage a<br />

vulnerability within <strong>iOS</strong> to gain access to <str<strong>on</strong>g>the</str<strong>on</strong>g> kernel. In order to perform this task, 32Stage2<br />

c<strong>on</strong>structs two data buffers: a 20-byte buffer c<strong>on</strong>taining <str<strong>on</strong>g>the</str<strong>on</strong>g> necessary overwrite data to modify<br />

<str<strong>on</strong>g>the</str<strong>on</strong>g> real-time and battery clocks and a 38-byte buffer c<strong>on</strong>taining a payload that runs a series <str<strong>on</strong>g>of</str<strong>on</strong>g><br />

ROP gadgets to install <str<strong>on</strong>g>the</str<strong>on</strong>g> clock handler overwrites. The two data buffers have <str<strong>on</strong>g>the</str<strong>on</strong>g> following<br />

layout after <str<strong>on</strong>g>the</str<strong>on</strong>g>ir c<strong>on</strong>structi<strong>on</strong>:<br />

Page 21

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

Saved successfully!

Ooh no, something went wrong!