Foreshadow
https://blog.csdn.net/clh14281055/article/details/107893846
上面流程图这种暂停原语在A线程从AEX进入到错误处理句柄的时候,Enclave处于Crash的状态,此时其他线程试图调用ECALL,通过EENTER试图进入Enclave会报如下错误。也就是说只能通过ERESUME恢复中断前上下文。因此SIGSEGV型不适合作为暂停原语。
SGX_ERROR_ENCLAVE_CRASHED = SGX_MK_ERROR(0x1006), /* The enclave is crashed */
Enclave外部对Enclave内部页构造别名页,对Enclave外的别名页清除,然后对Enclave外的别名页进行页P位的清除和恢复,其间,在Enclave外会探测Cache侧信道。
不使用TSX,有些电脑上并不OK(我的笔记本),有些电脑上(我的台式机)能破解部分秘密Bit。原因不明!
【alias_ptr】不设置权限,只对PTE修改权限是否有用?
如果使用了TSX,其实无所谓,因为错误都被压制了。但如果没用TSX,那么清P位的时候需要同步的对【alias_ptr】设置PROTNONE,这是由于【pte_present】函数会同时查看P位和PROTNONE位,如果没设置PROTNONE,那么就会去SWAP找【do_swap_page】(实际上并不存在于SWAP,同时不满足其他几种页错误的情况,在这里就是个缺页中断),那么就会崩溃。
直接对秘密页进行PTE级别remap并清P位(双清)是否有效?
不使用TSX时有效,可以不需要对PAGE进行Remap,只对PAGE对应的PTE Remap即可,需要对调以下loop中unmap和reload的顺序,避免unmap后的页错误在reload(用于Cache保活,其实不使用也行,可以假设Cache活性在轮与轮之间没有太大差异,似乎有一小撮Cache在多轮之间loop迭代期间不受影响)里面触发,而是让他在瞬态执行中触发页错误。
使用TSX,经反复测试无效。非常奇怪!!!
PTE级别Remap,可以构建线程暂停原语
别名页机制也可以在用户态实现SGX内线程的暂停原语。具体做法就是对秘密页的PTE进行remap,在remap得到的虚拟地址上对PTE的Value进行清P位(PORTNONE也必须得清)。
关于Remap
初版的别名方法是,秘密页Remap到别名页,别名页的PTE Remap到别名PTE,然后在别名页、别名PTE进行双清,然后访问别名页。
实际上可以,对秘密页、秘密页对应的别名PTE进行双清,然后访问秘密页。
Game of Thread
https://blog.csdn.net/clh14281055/article/details/109382041
https://github.com/LihengChen9/Game_of_Threads
驱动先清除页P位置None位。
Enclave内部触发页错误,AEX退出Enclave,然后进入Ring0的Page Fault的IDTENTRY,在OS真正处理页错误句柄之前,kprob先于它进行线程暂停或者P位恢复。
Fault-on-Fault的可能原因
I realize that notify_attack will catch all page faults and many of these are not relate with this POC (means many page faults are not Image's or Model's Faults), the original POC's driver restore all fault pages' present bit, which will cause new page fault (may be #PF: supervisor read access in kernel mode).
I modified driver to treat fault-on-fault respectively, kindly metigate some new fualt( but still some page fualt thar I have no idea, fualt page is not about Images' or Model's page).
And I think using noticy_attack to catch all page faults is not a good idea to pause threads, and I think register a SIGSEGV handler to handle page faults is a better idea to pause threads.
Discuss: As there are logic about prot_none check in handle_pte_fault, so I think when undo page-flag-modify, we should clear prot_none as well.
Discuss: Because we don't kprobe do_page_fault, __do_page_fault, do_user_addr_fault, so it needn't to remove "NOKPROBE_SYMBOL" label.
Notice: %p parameter in printk will output a "hashed" address, so 0x%lx may helpful.(https://lwn.net/Articles/737451/)