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.

Cont<strong>in</strong>u<strong>in</strong>g on, MiAddPagesTo<strong>Enclave</strong> will sit <strong>in</strong> a loop, call<strong>in</strong>g MiGetPageFor<strong>Enclave</strong>, which at this po<strong>in</strong>t<br />

will get one of the EPC pages that the <strong>Enclave</strong> VAD now has <strong>in</strong> its PFN array thanks to the call to<br />

MiReserve<strong>Enclave</strong>Pages we saw earlier. Then it will call MiGetPteFromCopyList to get one of the system<br />

PTEs it has pre-reserved a moment ago. With this <strong>in</strong>formation <strong>in</strong> hand, it can now call <strong>in</strong>to<br />

KeAdd<strong>Enclave</strong>Page, which will perform the low-level <strong>SGX</strong> hardware work to add this page.<br />

KeAdd<strong>Enclave</strong>Page once aga<strong>in</strong> checks KeFeatureBits to make sure <strong>SGX</strong> is supported on this platform. It<br />

then takes as <strong>in</strong>put the source address of the data to add <strong>in</strong>to the enclave (which corresponds to the<br />

zeroed-out system PTE the function first requested), the dest<strong>in</strong>ation address of where this data should be<br />

copied <strong>in</strong>to (which is one of the system PTEs it just requested above), and f<strong>in</strong>ally the enclave virtual<br />

address that maps to this data, which is based on the <strong>in</strong>put PTE ranges that MiAddPagesTo<strong>Enclave</strong><br />

received based on the virtual addresses that VirtualAlloc is currently be<strong>in</strong>g called on with MEM_COMMIT.<br />

F<strong>in</strong>ally, it receives the computed page attributes that will be used <strong>in</strong> the SECINFO structure.<br />

Remember that special flag MiAddPagesTo<strong>Enclave</strong> sets if the enclave is already <strong>in</strong>itialized? Well,<br />

KeAdd<strong>Enclave</strong>Page checks for it, and immediately fails with STATUS_CONFLICTING_ADDRESSES if it’s<br />

set. In other words, the <strong>SGX</strong> implementation does not allow add<strong>in</strong>g EPC pages to an <strong>in</strong>itialized enclave,<br />

and the Ke layer enforces this. You might ask why the Mm layer even bothered with the flag to start with.<br />

As per the usual rules of the NT kernel’s portability and architectural layers, Ke refers to the low-level<br />

hardware-specific implementation of the kernel. It’s here that <strong>SGX</strong>-specific rules are obeyed.<br />

Mm, on the other hand, provides enclave functionality on top of any underly<strong>in</strong>g CPU feature that supports<br />

it – and perhaps other enclave technologies <strong>in</strong> the future will not have this requirement. In fact, <strong>SGX</strong>2,<br />

which W<strong>in</strong>dows does not yet support, actually <strong>in</strong>cludes an EAUG (0Dh) leaf function that allows add<strong>in</strong>g<br />

pages to <strong>in</strong>itialized enclaves.<br />

KeAdd<strong>Enclave</strong>Page now builds a PAGEINFO structure, which you familiarized yourself with already. In this<br />

case, s<strong>in</strong>ce the enclave already exists, the LINADDR and SECS addresses must be filled <strong>in</strong>. But the kernel<br />

has this data – LINADDR corresponds to the user-mode enclave address that is be<strong>in</strong>g committed, and<br />

SECS is known because the <strong>Enclave</strong> VAD stores the system PTE we saw was reserved earlier <strong>in</strong><br />

Create<strong>Enclave</strong>’s logic.<br />

SRCPGE <strong>in</strong> this case is set to the zeroed-out system PTE we mentioned above, and we f<strong>in</strong>ally have the<br />

SECINFO structure, which conta<strong>in</strong>s the EPC page protection attributes, based on the page protection<br />

flags. We already saw how PAGE_READWRITE and PAGE_EXECUTE were handled, but what about<br />

PAGE_ENCLAVE_THREAD_CONTROL? Simply put, this will be converted <strong>in</strong>to the PT_TCS value <strong>in</strong> the<br />

PAGE_TYPE flag, <strong>in</strong>stead of the usual PT_REG we saw earlier.<br />

Now it’s time to call <strong>in</strong>to <strong>SGX</strong> with the ENCLS <strong>in</strong>struction offered by KiEncls aga<strong>in</strong>. However, leaf function<br />

EADD (1) will be used this time <strong>in</strong>stead. Here are its required parameters:<br />

The dest<strong>in</strong>ation address, <strong>in</strong> this case, is one of the system PTEs that was reserved for this purpose, part of<br />

the PTE Copy List we described above, which maps to one of the EPC page PFN entries. We are not quite<br />

done yet, however. One of the features of <strong>SGX</strong> is its ability to host an <strong>in</strong>ternal TPM, regardless of the

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

Saved successfully!

Ooh no, something went wrong!