30.12.2015 Views

Intel SGX Enclave Support in Windows 10 Fall Update (Threshold 2)

1ks6upt

1ks6upt

SHOW MORE
SHOW LESS

Create successful ePaper yourself

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

MiDelete<strong>Enclave</strong>Pages will first clear out the PTE attributes, flush the TLB as needed, and then call<br />

MiDelete<strong>Enclave</strong>Page for each of the pages described by the VAD. MiDelete<strong>Enclave</strong>Page will then validate<br />

if the PTE is committed, and if so, call KeRemove<strong>Enclave</strong>Page with the enclave address. Inside of<br />

KeRemove<strong>Enclave</strong>Page, once aga<strong>in</strong> the KeFeatureBits are checked to see if <strong>SGX</strong> is implemented, and if so,<br />

KiEncls is now used with leaf function EREMOVE (3).<br />

Some additional error codes from <strong>SGX</strong> itself must now be analyzed. For example, if <strong>SGX</strong>_CHILD_PRESENT<br />

is returned, this means that the SECS is be<strong>in</strong>g removed, but there are still valid EPC pages loaded. In this<br />

case, STATUS_CONFLICTING_ADDRESSES will be returned. Otherwise, if <strong>SGX</strong>_ENCLAVE_ACT is<br />

returned by the <strong>SGX</strong> hardware, this means that active enclave code is still runn<strong>in</strong>g, which will result <strong>in</strong><br />

STATUS_UNABLE_TO_FREE_VM.<br />

Interest<strong>in</strong>gly, MiDelete<strong>Enclave</strong>Page completely ignores any of these error codes, and cont<strong>in</strong>ues with its<br />

logic, which destroys the PTE, and places the PFN back <strong>in</strong>to <strong>Enclave</strong> Page List by call<strong>in</strong>g<br />

MiInsertPageInFreeOrZeroedList (recall that a special flag <strong>in</strong>structs this rout<strong>in</strong>e to use the <strong>Enclave</strong> Page<br />

List <strong>in</strong>stead).<br />

Note that this apparent bug actually makes a lot of sense – because enter<strong>in</strong>g and exit<strong>in</strong>g from an enclave<br />

are controlled by the user-mode process, if a user wants to term<strong>in</strong>ate a process that conta<strong>in</strong>s a thread<br />

which is currently <strong>in</strong> the middle of execut<strong>in</strong>g <strong>in</strong>side of an enclave, there is no way to “force” that thread<br />

to exit the enclave. In this case, an <strong>SGX</strong> error would be returned dur<strong>in</strong>g the destruction of the process’<br />

address space, which would force the VAD to rema<strong>in</strong> active, and thus force the process to rema<strong>in</strong> present.<br />

Ultimately, this would allow unprivileged user-mode applications from mak<strong>in</strong>g themselves unkillable by<br />

enter<strong>in</strong>g <strong>in</strong>to an enclave and never exit<strong>in</strong>g.<br />

On the other hand, the enclave code will actually cont<strong>in</strong>ue to execute, and the memory it resides <strong>in</strong> will<br />

have been returned back to the memory manager as free enclave pages. <strong>SGX</strong> is smart enough to prevent<br />

those not-actually-free pages from be<strong>in</strong>g associated with another enclave <strong>in</strong> the future, so they’ll<br />

essentially be leaked and never aga<strong>in</strong> be made available (even if the enclave eventually exists, nobody will<br />

be call<strong>in</strong>g EREMOVE anymore on those pages).<br />

This is an <strong>in</strong>terest<strong>in</strong>g corner case attack, which at worse seems like it would result <strong>in</strong> a DoS of enclave<br />

facilities. The kernel team may not have had enough time to come up with a reliable mechanism to avoid<br />

this situation, or one may not exist (the author can imag<strong>in</strong>e some sort of forced trampol<strong>in</strong>e code that the<br />

EIP of a term<strong>in</strong>at<strong>in</strong>g thread is sent to, which conta<strong>in</strong>s the EEXIT leaf function).<br />

Cont<strong>in</strong>u<strong>in</strong>g back to MiDelete<strong>Enclave</strong>Pages, once all the EPC pages have been freed, the system PTE that<br />

was used to map the SECS to a kernel address (when needed) is released, and MiDelete<strong>Enclave</strong>Page is<br />

called on it as well. F<strong>in</strong>ally, MiReturnReserved<strong>Enclave</strong>Pages is used to loop over any EPC pages that were<br />

<strong>in</strong> the PFN array part of the <strong>Enclave</strong> VAD. These may have come from when an <strong>in</strong>itial commitment was<br />

requested <strong>in</strong>side of Create<strong>Enclave</strong> but not all the pages were demanded (mean<strong>in</strong>g that they would not<br />

appear as valid PTEs).

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

Saved successfully!

Ooh no, something went wrong!