Cuckoo沙箱Linux检测引擎

Cuckoo沙箱是一款开源自动化恶意软件分析系统,将可疑文件或URL在隔离环境中运行,生成详细的行为报告。

Cuckoo支持在Windows、macOS、Linux、Android四种操作系统平台下分析恶意文件(包括可执行文件、Office文档、PDF文档、邮件等多种类型)和恶意网站。相较于静态分析,沙箱动态分析可获得可疑文件的详细行为信息,如可疑文件创建的进程、调用的函数、创建删除或下载的文件、请求的网络流量等,进而对可疑文件进行深度判定。

Cuckoo的整体运行流程为:提交样本->启动虚拟机->往虚拟机投递样本和检测引擎并运行->回传检测结果->Processing模块处理结果->Signatures模块过规则->Reporting模块生成报告。

沙箱核心组件之一是动态检测引擎,Cuckoo沙箱Linux检测引擎基于SystemTap实现,关于SystemTap可以参见上一篇博客SystemTap,SystemTap在Linux Guest虚拟机中的安装参见Installing the Linux guest

首先打补丁escape_delimiters,将字符串中的特殊字符转换成十六进制表示,方便后续日志分析:

$ sudo patch /usr/share/systemtap/tapset/uconversions.stp < escape_delimiters.patch

然后将监控脚本strace.stp转换成内核模块:

$ sudo stap -p4 -r $(uname -r) strace.stp -m stap_ -v

检测引擎运行时,stap.py直接运行生成的内核模块,监控样本进程:

self.proc = subprocess.Popen([
"staprun", "-vv",
"-x", str(os.getpid()),
"-o", "stap.log",
path,
], stderr=subprocess.PIPE)

这里pathstap_.ko内核模块;-x指定target进程ID,可在SystemTap脚本通过target()获取。

生成的日志stap.log会回传到主机,由processing模块分析,最终由reporting模块生成报告。

由监控脚本strace.stp可见(引用的tapsets函数可参见SystemTap Tapset Reference Manual),引擎会监控样本进程及其子进程的所有系统调用并生成日志:

probe nd_syscall.* {
if (pid() == target()) next # skip our own helper process
if (!target_set_pid(pid())) next # skip unrelated processes
...
}

function report(syscall_name, syscall_argstr, syscall_retstr) {
...
if (syscall_retstr == "")
printf("%s%s(%s)\n", prefix, syscall_name, syscall_argstr)
else
printf("%s%s(%s) = %s\n", prefix, syscall_name, syscall_argstr, syscall_retstr)
...
}

生成的日志可参见测试样例log.stap

Mon Jun 19 16:58:31 2017.445170 python@b774dcf9[680] execve("/usr/bin/sh", ["sh", "-c", "/tmp/helloworld.sh"], ["LANGUAGE=en_US:en", "HOME=/root", "LOGNAME=root", "PATH=/usr/bin:/bin", "LANG=en_US.UTF-8", "SHELL=/bin/sh", "PWD=/root"]) = -2 (ENOENT)
Mon Jun 19 16:58:31 2017.517266 sh@b77825f7[680] brk(0x0) = -2118402048
Mon Jun 19 16:58:31 2017.521264 sh@b77838c1[680] access("/etc/ld.so.nohwcap", F_OK) = -2 (ENOENT)

对日志的解析参见测试脚本test_stap.py

投递样本helloworld.sh进行分析:

!/bin/bash
echo "hello world!"
cat /etc/passwd
ping -c 4 www.360.com

生成的行为分析进程树:

部分系统调用信息: