SGX线程暂停原语研究

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/)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值