Aiur – ZelluX 的技术博客

Security, Kernel, Virtualization, Programming Languages

Archive for May, 2008

EuroSys 08 – Solitude: App-Level Isolation and Recovery

without comments

Application-Level Isolation and Recovery with Solitude

Shvetank Jain, Fareha Shafique, Vladan Djeric, Ashvin Goel

Department of Electrical and Computer Engineering, University of Toronto

http://portal.acm.org/citation.cfm?id=1357010.1352603

引入一个新的文件系统层(Isolation File System)将安全可信的基础文件系统和不可信的环境(如网上下载的文件等)隔离开来,并对不可信的环境中做出的改动加以记录,一旦发现问题就能即使恢复。

Written by zellux

May 28th, 2008 at 8:36 pm

Posted in Computer System

Tagged with , ,

ICS Lab 6

without comments

重定向:

主要用到open, close, read和write这几个函数,关于它们的使用方法可以使用
man 2 <函数名>
查看。

这里简单介绍下:
Linux内核为每个进程维护了一张已打开的文件的表格,用File Descriptor(整型,以下简写成fd)可以访问到这些文件。所以很容易理解tsh.c中的函数listjobs为什么需要一个output_fd的整型参数,注意它的后面有这么一行:
if (writer(output_fd, buf, strlen(buf)) < 0) …

这一行就把前面构造好的buf字符串(包括当前进程的信息)输出到这个output_fd对应的文件中了。

每个进程的值为0, 1, 2的fd都指向相同的文件,0对应标准输入(通常是键盘输入),1对应标准输出(通常为屏幕),2对应标准错误输出。

可以看到在main方法的开头,有这么一句
dup2(1, 2);

dup2的作用是把参数二指向的文件改成和参数一一样(如果之前打开了文件,则先关闭),这句话的作用就是把原来要输出到标准错误端(stderr)的内容
输出到标准输出端(stdout),便于调试。

理解了fd和dup2的作用后,重定向也就很容易实现了,一种最简单的方法就是先用open函数打开输出文件并得到对应的fd,然后用dup2把标准输出/输入端的指向改成文件的fd。

另外注意用open创建输出重定向的文件的时候要加上S_IRUSR和S_IWUSR选项,否则创建后的文件没有读写权限。(不过好像这个lab的测试数据比较厚道,会事先touch一下,不加这两个选项应该也能通过测试)

一些文档中未定义的行为:
argv
假如我输入的命令是/bin/ls -l > ls.txt,对应的argv应该包括哪些内容呢?
一般的情况argv的内容应该是['/bin/ls', '-l'],后面的重定向符是不包括的不过在这个lab中似乎没有这个限制,不去掉重定向和管道部分应该还是能通过测试的。

Job ID的分配
如果现在1, 2, 4号子任务在后台运行,再新增一个进程的话应该给它分配多少呢?
这个问题不需要处理,只要所有的jobs队列操作统一使用tsh.c中给出的几个函数就行。

其他:
关于信号的转发、后台前台的转换等内容,文档和书上都说得很清楚了,这里不再赘述。

P.S. 多进程程序的调试大家之前应该接触的比较少,其实这个lab大致的代码不难写,难点在于细节上的debug比较困难,调试过程对第八章的理解很有帮助。

Written by zellux

May 27th, 2008 at 10:48 pm

Posted in Computer System

Tagged with ,

SubVirt: Implementing malware with virtual machines

without comments

http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=1624022&fromcon

Proceedings of the 2006 IEEE Symposium on Security and Privacy

作者来自密西根大学和微软研究部门

一个利用虚拟机进行攻击的rootkit。

1. Introduction
传统的攻击程序通常和安全工具(杀毒软件等)在同一个级别上(kernel mode),两者间没有绝对优势可言,因此有很大的限制,比如强大的功能和良好的隐蔽性不能兼得。而虚拟机的出现则可以解决这个问题,通过把恶意程序放在虚拟机上,可以做到对目标机(guest os)的完全监控,同时目标机完全不会知情。这种程序称为VMBR(virtual-machine based rootkit)。

2. Virtual machines
VMM(virtual-machine monitor)这里就不多介绍了。VMM上跑着一些其他服务进程,主要用于操作系统的debug,运行中的虚拟机的迁移等功能。这些服务的主要面临的一个问题是理解对应的guest os状态和事件。因为在VMM和虚拟机处在不同的抽象级别,前者只能看到磁盘块(disk blocks),网络包(network packets),以及内存;而后者则把这些东西抽象为例如文件、TCP连接、变量等概念,这种差异称为语义差异(semantic gap)。

于是有了Virutal-machine introspection(VMI),它包含了一系列让VMM上的服务了解并修改guest os的技术。

3. Virtual-machine based rootkit design and implementation
3.1 Installation
VMBR的安装和一般病毒程序类似,通过欺骗有管理员权限的用户执行安装程序实现。

当目标机是WinXP时,VMBR被安装在第一个活动分区的开始部分;目标机是Linux时,安装程序会禁止swap分区,把VMBR放在swap分区上(够狠的。。。)

修改系统引导信息的时候还有一个细节,直接修改容易被安全检查程序发现。WinXP上的一种解决方案就是尽可能的在所有程序退出之后再修改(通过注册一个LastChanceShutdownNotification事件处理器),并且使用底层的磁盘驱动进行VMBR启动代码的复制,这样可以绕过文件系统层,而大多数反病毒软件都跑在文件系统层上。Linux上,通过修改关机脚本来保证安装程序在其他程序退出后执行。

安装完成后,目标系统的内容就被保存到了一个虚拟磁盘上。重启后就由VMM控制最底层,它把目标机的对虚拟磁盘的访问转换为对应的物理磁盘的访问。

3.2 Malicious services
VMBR使用一个独立的系统执行各种攻击程序,这样目标机就无法察觉到了。对目标系统的攻击主要分三种:

一种是不需要和目标系统进行交互的恶意服务,例如垃圾电子邮件的发送(spam relays),DDoS攻击,网络钓鱼(phishing web servers)。

第二种恶意服务需要监视目标系统的数据和事件。通过修改VMM的设备模拟软件就能记录下所有硬件级的数据(比如按键信息、网络包等),而这个过程不需要修改guest os,所以目标系统完全不知情。

VMBR还可以用VMI帮助理解目标系统软件级的抽象信息,VMI可以中断目标系统的任意指令,并重新组织数据。例如一个目标应用程序将要使用一个加密的socket发送信息,攻击者可以截获所有的SSL write函数调用并且在明文被加密前得到它。同样这个过程对目标系统完全透明,因为攻击程序跑在它的外层,或者说是“上帝”层 ;-)

第三种攻击是恶意修改目标系统的执行。例如篡改网络通讯,删除email,改变目标应用程序的行为。

3.3 Example malicious services
下面介绍这篇paper提到的4个恶意程序

最简单的,开了个thttpd web服务器进行网络钓鱼,任何发送到8080端口的TCP请求都会被这个服务器截获。

然后是一个按键记录程序,号称只用了60行代码就搞定了这个模块,然后写了一个254行的带图形界面的程序来分析日志并显示。

一个扫描目标机文件系统的程序,这是一个24小时运行的perl脚本,会把诸如/etc/shadow, user_home/.ssh/id_dsa之类的机密信息保存下来。

最后是防止VMM被目标机侦测到的一个服务。paper中提到了一种叫做redpill的虚拟机侦测手段,通过使用sidt指令。这个指令会读出处理器的中断列表(interrupt descritor table),在VMM上跑的系统和普通的操作系统读出来的结果不一样,当这个指令在内核态被执行时,VMM会模拟这个指令的执行;但是用户态却不会被截获(考虑到性能因素)。所以redpill通过用户态执行sidt来判断当前系统是否运行在虚拟机上。这篇paper提到的针对redpill的解决方案是在每个可执行文件的sidt指令前设置一个断点,截获这个指令后就模拟这个指令,以此绕过redpill检测。但是这种方法不适合于在程序运行期动态生成二进制的sidt指令的程序(想到我的lab4了,呵呵)。道高一丈魔高一尺(原文是Continuing the arms race,军备战争),通过二进制转换(binary translation),动态生成的sidt同样可以被截获,但是这种方法的overhead会很大。

3.4 Maintaining Control
这块主要讲了对系统重启、关闭的处理。

系统要求重启时,VMBR总是尽可能的通过重启guest os来完成,这样就能最大化的掌握控制权。

另外通过ACPI模拟系统关闭也可以欺骗使用者。这种模式下硬盘、风扇停止,RAM仍然上电,下一次开机后可以恢复到上一次关机的状态,于是VMBR继续在第一时间掌握控制权。

4. Evaluation
测试下来开机、重启的速度都慢了不少。不过很正常,因为用的是Virtual PC和VMWare。

不过随着虚拟技术的发展,对系统性能的影响肯定越来越小的(比如Xen),这篇paper关键在于占了个坑,至少现在看来实用性还很差。

5. Defending against virtual-machine based rootkits
5.1 Security software below the VMBR

比VMBR更低的层次就很容易检测到VMBR了。比如硬件级别的安全支持(Intel LaGrande),或者CDROM启动(注意这里首先要冷重启,否则说不准虚拟机给你模拟CDROM启动了),还可以先装个安全的VMM,即使收到VMBR攻击,VMBR也只能在安全的VMM和操作系统之间那层运行。

5.2 Security software above the VMBR
在VMBR上层要检测就有一定技术难度了。

一种基本的方法是利用CPU时间、内存上限、硬盘上限、网络带快来测定。

VMBR的存在必定会影响到CPU的表观性能,通过这种时间上的差异就能发现问题。不过VMBR可以通过放慢系统时钟返回的时间来欺骗目标机,对于这种欺骗,测试人员可以使用其他的不可控的计时工具(比如手表 -_-b)

另外硬盘、内存上限都会因为VMBR的存在而变小。后者很难侦查到,因为有一层虚拟内存。而针对前者的检测,VMBR可以截获对它占用的地址的访问,然后返回一些随机的信息,让guest os以为那是坏扇区从而躲过检查。所以这招不怎么好用。

另外由于性能考虑,并不是所有的硬件都是被迷你的,通常只有需要保护的设备(比如启动盘)和需要攻击的设备(比如网卡)被虚拟化,其他的硬件都是guest os直连的,这样就只需要在这些未被虚拟化的硬件上做一个DMA,把物理内存中的部分信息读过来就能分析了(通过这个貌似可以对同一个物理机上的其他虚拟机进行攻击啊

另外一种方法就是前面的提到的通过sidt指令了。

6. Trends toward virtualization


7. Related work

Written by zellux

May 5th, 2008 at 8:00 pm

Posted in Computer System

Tagged with , , ,

FireStats icon Powered by FireStatsBetter Tag Cloud