Light-weight Contexts An OS Abstraction for Safety and Performance(OSDI 2016) 论文学习

论文地址:https://www.usenix.org/conference/osdi16/technical-sessions/presentation/litton
论文官网:http://www.cs.umd.edu/projects/lwc/
参考资料:http://ytliu.info/blog/2016/12/15/sa-fan-na-xiao-zhen-shang-de-osdi2016/

  • 问题

进程间切换性能开销大:    
    OS中内存隔离、特权分离等必须运行在分离的进程中,但进程间切换和通信会导致内核调度、资源审计、上下文切换等开销。
     然而,实际上真正作用到硬件上的开销少得多:如果将TLB作为地址空间标记器,切换上下文只需要一个系统调用和加载CPU寄存器。
线程基本没有相互隔离的能力。

  • 解决方法

新的OS抽象——light-weight context(lwC)
与进程关系:进程内包含多个lwC,但是lwC的虚拟内存映射、文件描述符以及证书等资源独立,通过配置可共享。
与线程关系:
lwC与线程完全正交,不是可调度的实体。线程可以在lwC之间切换,切换的时可以原子地改变线程的虚拟内存映射、文件表项、权限、指令指针和栈指针。
多个线程也可以同时运行在同一个lwC中,lwC为每个线程保持状态来确保一个进入lwC的线程能够在它创建或上次切换出这个lwC的地点继续执行。
lwC适用于:高效的实现快照回滚、保护权限(通过证书限制)、会话隔离和区域保护(使用虚拟内存和资源映射)。

  • lwC的设计

    lwC是进程里隔离、权限、运行状态的独立单元。每个lwC有自己的虚拟地址空间、页映射集合、绑定的文件描述符和证书等。lwC以文件描述符命名,每个进程初始有一个root lwC。


  • lwC API

lwCreate


用法:当lwC在当前进程中创建新的child lwC调用此方法。
实现:
与fork类似,child lwC一开始是parent lwC的拷贝,除描述符外其他均相同。
不同于fork的是,此操作不会创建新的线程,child lwC不会执行任何内容,直至线程切换到child lwC。
返回值:
parent lwC调用时,将child lwC的描述符返回(new)。
线程第一次切换到child lwC时,lwCreate返回调用此方法的lwC描述符(caller)和parent lwC的文件描述符(new)。
参数:通过设置resource-spec决定自身资源对child lwC的可见性。

lwSwitch


用法:当线程在不同的lwC之间的切换时调用此方法。
此方法会维护线程在从当前lwC切换时的状态,便于以后切换回来。
可以看做权限隔离的协同程序。

资源共享


静态方式中,lwCreate默认的规则是copy-on-write,该规则可以通过参数resource-spec修改。
动态规则定义,通过另外一个接口lwOverlay中resource-spec参数进行定义。

系统调用——lwSyscall


用法:parent lwC可以通过lwSyscall来定义child lwC的系统调用规则,如可以通过LWC_SYSTRAP flag来对子lwC中的某些系统调用进行拦截。
在lwC C内的线程发起系统调用时,如果C不具有执行此系统调用的能力,可以切换到C的parent lwC,parent lwC选择代替child lwC执行或者拒绝。

lwRestrict
限制lwC的权限。
lwOverlay
引入其他lwC授予当前lwC的新的资源。
信号机制
SIGSEGV和SIGFPE可指派的信号传送给引发信号的lwC。
SIGKILL和SIGUSR1等不可指派的信号则传送给进程中root lwC和以LWC_SHARESIGNALS为参数创建的lwC。
fork系统调用
fork创建子进程时,任意被标记为MAP_SHARE的内存区域可以在父子进程中对应lwCs共享,这是跨进程的共享。

lwC隔离
每个lwC没有互相访问其他lwC的内存状态、文件描述符等的权限,这可以实现进程内的权限隔离。
lwC安全
Threat model:child lwC创建时,parent lwC有对child lwC的所有权限,且不会授予child lwC多余的权限,同时假设parent lwC不会被劫持;lwC的API不允许进程内lwC的通信。
Security properties:进程内的lwC不会有比进程更多的权限,任意lwC也不会比进程有更弱的机密性和完整性(confidentiality and integrity)。

  • lwC的使用场景——Snapshots

以下例子用于在Apache web server中实现在处理完每个session后,回滚至之前的快照。


在处理request前执行12行snapshot(),此时执行第三行,返回快照句柄snap;处理完request后,执行14行的rollback(snap)的lwSwitch切换到lwC快展,从而执行至第2行,然后跳转至第6行,此时caller为原来的lwC,关闭原来的lwC,执行snapshot()时会从第2行执行,并将结果返回到12行向下继续执行。




  • lwC的使用场景——session隔离

Nginx在仅有单线程的进程中通过事件驱动处理多个session,但是进程内的session之间没有隔离,此问题可通过lwC解决。




    descriptors是用来监听client通信的socket描述符,file2lwc_map用于在当前lwC中设置socket fd的映射。
    当在lwC中处理新的描述符fd时,执行15行,在第18行创建新的lwC,并传递新的fd作为参数,然后设置fd映射。当接收到对之前fd的请求时,执行至24行,执行lwSwitch时,依次执行18、22行,在serve_request中处理请求。

  • lwC的使用场景——敏感数据隔离

以下程序用于使私有签名秘钥仅对SIGN方法可见,对程序中其他方法不可见。使用的是动态资源共享的方法。此方法用于在OpenSSL库中长期持有秘钥。


    程序在11行生成私钥privkey,在12行调用lwCreate创建child lwC,作为可以访问privkey的隔离的部分,parent lwC继续执行至16行,重置key,17行之后parent lwC中代码无法访问私钥。当需要使用私钥时,调用SIGN_CSTUB方法,创建lwC后第一次执行时至15行,调用SIGN_SSTUB方法。
    在SIGN_SSTUB中,通过lwOverlay的设置,保证第一次执行时调用SIGN获取私钥,然后切换到调用者的lwC,以后的每次调用都在第7行直接返回args的值。

  • lwC的使用场景——Reference Monitor

    此方法用于实现在parent lwC中拦截child lwC(如web server)的所有系统调用,并对这些系统调用进行监控。


    实现监控的是root lwC,在13行以LWC_SYSTRAP为参数创建child lwC,然后root lwC执行monitor()函数。Monitor函数中,在第2行切换到child lwC执行(child lwC执行的内容为第16行),当child lwC执行系统调用时切换回root lwC至第3行,当系统调用允许执行,则进入第5行,在child lwC内执行系统调用,将返回参数设置为out;当系统调用不被允许时,进入第9行,设置错误代码,然后切换回child lwC继续执行。


  • 实现

    在FreeBSD 11.0内核中实现了lwC,表明在商用OS上高效实现lwC是可能的。在使用lwC来重构Apache和Nginx等大型应用软件的过程中,发现能够在现有代码的基础上以很小的代价来引入一些诸如回滚和安全数据隔离等新的功能。
    lwCreate和lwSwitch的实现主要是在fork子进程的方法基础上进行了改进。
    需要考虑的资源主要包括:内存管理、文件表、证书、lwC权限、lwC中多线程。

  • 评估

lwC switch:因为避免了同步和调度操作,lwC切换时间约为process和内核thread的一半;用户线程切换用时之所以比lwC短是因为FreeBSD中通过系统调用实现的。

lwC creation:在微型数据集(microbenchmarks)测试进程中创建和销毁lwC用时,当没有写页时,用时87.8微秒,标准差低于1%;在child lwC中有写页时,100个页用时397微秒,用时与页大小成正比,标准差低于7%。

Reference monitoring:将lwC实现的reference monitor(lwc-mon)和添加代码的Inline Monitoring(inline)、通过socket实现的进程隔离沙箱的Process Separation(procsep)比较,前者最优。

Apache:用lwC实现session隔离。lwC的实现相比fork进程性能好,而threads和prefork方法无法实现session隔离。

Nginx:用lwC实现session隔离,可以看出,使用lwc实现session隔离和reference monitor后,性能仅有微小的下降。



Isolating OpenSSL keys:秘钥保护功能,使用SSL handshakes进行评估,实验表明lwC对性能仅有微小的影响。
FCGI fast launch:本文使用快照功能来加速PHP启动,即在FCGI server中添加pagecache调用来允许使用之前的快照。


  • 结论

    本文提出了一个新的OS抽象lwC,并在FreeBSD内核中实现,并基于lwC提供的新特性对大型商业应用进行了重构,现阶段的工作已经表明利用lwC来实现某些很有价值的功能是可行的。

  • 认识

    本文主要是在线程和进程之间增加了一层,思想新颖。将基本的API用于session隔离、reference monitor等有价值的工作,实现过程中工程性的工作量大。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值