Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

安全论文每日读-- 2015.03.11

今天介绍一篇2013年Securiy&Privacy会议上的论文:PRIVEXEC: Private Execution as an Operation System Service,文章主要讨论了一种“隐私执行”的安全加固服务。

引言

隐私浏览坏处: – 当下主流浏览器中,尽管使用隐私浏览模式,还是会在磁盘上留下痕迹 – 一旦存下来,很难保证这些数据不会被取证工具恢复出来

阻止泄露的一个办法是磁盘加密,但是无法保证磁盘加密的密钥不会泄露出去。

所以Privexec最好具有以下特点: 1. 由OS提供,这样能够为任何应用程序提供这个服务,并且便于分析。 2. 能够解决标准的加密技术(如磁盘加密)无法解决的问题。

本文亮点主要在于: 1. 提出了一个新的OS隐私执行的服务。无需修改应用程序,即可提供隐私保证服务 2. 基于这个模型实现了一个原型系统 3. 原型系统的功能和性能测试效果很不错。

威胁模型

分为两个场景 1. 会话进行中:用户能远程访问目标系统,在正常进程隔离的保护下,无法访问物理、内核和其他进程的内存,但是攻击者能控制网络流量。这种情况下,依赖如SSL/TLS这样的通用保护机制和用户知道该如何阻止数据泄露 2. 隐私会话结束后:攻击者能物理接触到目标系统,访问任何本地存储设备,因此能通过取证工具从FS、交换设备的进程内存页中提取出没有安全删除的数据。 3. 应用程序或用户恶意泄露隐私数据的,不在考虑范围内。PRIVEXEC针对的是避免由于粗心而导致泄露的隐私数据。

设计与实现

Alt text

仔细看完这张图,结合图下面的文字说明,几乎可以概括完这篇文章的整体idea。

安全属性

将所有进程分为公共进程(public process)和私有进程(private process),私有进程即为隐私的进程,执行过程会受到OS的限制。

安全属性如下: 1. 在没有进程私有知识的情况下,是无法将写入存储器里的数据恢复出来的 2. 在没有进程私有知识的情况下,是无法将交换到磁盘里的进程内存恢复出来的 3. 其他进程无法通过IPC channel获得隐私进程生成的数据 4. 应用程序私有数据不是永远不变的,并且不能放到受保护的易失存储器以外 5. 私有进程终止时,必须安全抹掉其所有数据

系统设计目标

  • 通用: 无需修改应用程序或库的源码、重新编译,即可让这个服务适用于任何类型程序、任何fs和I/O设备
  • 灵活:用户自己选择是否使用隐私模式来启动进程
  • 自动:一旦启动,无需人为干预
  • 低开销

文件系统

每一组私有进程关联一个secure storage container和一个private execution key(PEK, os保护,不会泄露给用户或其他进程)

Alt text

实现

Alt text

do_fork保证父进程的flag能通过继承传给子进程

添加的两个flag说明如下: – PF_PRIVEXEC:表示这个进程是个隐私进程,进程对应内核中task_struct结构的flags置为PF_PRIVEXEC。 – CLONE_PRIVEXEC:clone的调用到do_fork时,若检查到这个标志,则设置进程对应的flags为PF_PRIVEXEC。

在privexec的wrapper中,通过clone,并将clone的flag设置为CLONE_PRIVEXEC,就先创建了一个这样的一个带PF_PRIVEXEC的子进程,接下来这个子进程就是以隐私的方式来运行了。

隐私磁盘I/O

在VFS和具体fs之间加了中间层,组合了两个已有的stackable fs。

eCryptfs

原来的eCryptfs里,文件是独立加密的,加密元信息存在文件中。好处是不需要一个完整的设备或分配一个分区来支持,随用随分配,故可以创建任意多个

eCryptfs在这里有两个地方是与隐私执行的目标相违背的: 1. 一个加密的目录解密后,所有具有足够权限的用户和程序都能访问到 2. eCryptfs希望在kernel keyring里找到密钥,这样同一个用户的其他进程也可能dump到key。

所以这里对eCryptfs做如下修改

Alt text

scatterlist使用privexec_token验证进程是否可访问

inode无视unix的权限控制,验证访问的来源,保证只能由eCryptfs的上层目录来访问。

修改后保证一个eCryptfs只能由一个单一的私有进程组的进程访问,插入的代码同样保证不会影响正常进程使用eCryptfs.

Overlayfs

Alt text

私有进程可以看到完整的fs,可是写文件的话,就会写到mount上来的底层的那个eCryptfs上,这样只要保证进程执行结束后,这个eCryptfs是不可恢复的即可。

相当于把I/O重定向到这个mount上的eCryptfs上去了。

swap space

用PEK来加密交换到磁盘上的内存页面

Alt text

私有IPC

如前面图中的IPC交流所示。允许其他进程通过IPC往这个进程写数据,但不允许这个进程往其他外部进程(非该进程所在的私有进程组的进程)写数据。

修改了kernel中相应IPC函数,做token检查。

内存独立

关掉一些系统特性,如调试工具,禁止未授权访问会暴露kerbel虚拟或物理内存的设备。

启动私有进程

PRIVEXEC-aware的应用程序能直接启用,通过在clone设置CLONE_PRIVEXEC的标志位。

其他已有程序,则通过一个PRIVEXEC wrapper来运行。具体启动过程前面已经介绍过。

clone出一个具有PRIVEXEC的进程,创建一个空的secure storage container,挂载到随机生成的一个位置去,fs具体特征如前所述,最后将目标程序的可执行文件装载到chroot的系统中来。这时应用程序集成了wrapper的PEK,开始了其隐私执行。

应用程序终止时,PRIVEXEC wrapper清空了挂载了fs,并退出。

即使应用程序crash或被kill掉,container和overlay都在挂载着,但此时已经无法再解密这个fs了,因为对应的PEK已经被销毁。

局限性

  • 将物理内存的内容写到磁盘上,但是如果此时有隐私进程正在执行,则会是以明文的形式写到磁盘上,作者说可用swap类似的方式解决,随后release。
  • 攻击者可能通过提权、加载一个自己的内核模块等方式直接读到kernel里的PEK,这样就失去了隐私的意义,不过这个不在攻击模型的考虑范围内。
  • X应用程序在unix domain socket上存在一定的问题,需要放松策略,禁止MIT-SHM才能工作。攻击者可以通过UI截图的方式的进行攻击,泄露隐私。