武汉大学学报(理学版) 2017, Vol. 63 Issue (5): 377-384
0

文章信息

王亮, 彭国军, 朱泽瑾
WANG Liang, PENG Guojun, ZHU Zejin
基于系统调用的macOS软件行为监测技术和框架
macOS Software Behavior Monitoring Technology and Framework Based on System Call
武汉大学学报(理学版), 2017, 63(5): 377-384
Journal of Wuhan University(Natural Science Edition), 2017, 63(5): 377-384
http://dx.doi.org/10.14188/j.1671-8836.2017.05.001

文章历史

收稿日期:2017-01-02
基于系统调用的macOS软件行为监测技术和框架
王亮1, 彭国军1,2, 朱泽瑾1    
1. 武汉大学 计算机学院, 湖北 武汉 430072;
2. 武汉大学 空天信息安全与可信计算教育部重点实验室, 湖北 武汉 430072
摘要:通过基于系统调用hooking的技术手段,实现了macOS系统下系统调用hooking的通用框架.该框架可根据用户配置对指定系统调用进行监控并输出定制日志,构建了基于策略的安全事件监测与处理机制.实验测试结果表明,该框架具备对macOS底层系统所有系统调用函数的监控能力,其基于策略的事件监测机制运行有效,可为macOS系统下的安全研究及应用提供良好支撑.
关键词macOS     系统调用     hooking     行为监测     恶意软件    
macOS Software Behavior Monitoring Technology and Framework Based on System Call
WANG Liang1, PENG Guojun1,2, ZHU Zejin1    
1. School of Computer, Wuhan University, Wuhan 430072, Hubei, China;
2. Key Laboratory of Aerospace Information Security and Trusted Computing, Ministry of Education, Wuhan University, Wuhan 430072, Hubei, China
Abstract: Based on system call hooking technique, a configurable generic system call hooking framework of macOS was designed and implemented. According to the user configuration, this framework can monitor the system call and output custom log. At the same time, a policy based on security event monitoring mechanism was constructed.The experimental results show that the framework is able to monitor all the system calls of the macOS system, and the policy based on event monitoring mechanism was effective. The framework can provide excellent support for the security research and application of macOS.
Key words: macOS     system call     hooking     behavior monitoring     malware    
0 引言

近年来, 针对macOS系统的攻击越来越多.根据美国Bit9(Carbon Black)安全威胁研究团队2015年的研究报告[1]显示, 2015年恶意软件样本数量是前5年恶意样本数量之和的5倍.到目前为止, 在macOS平台上, 各种类型的恶意软件, 包括病毒木马, 广告欺诈以及近期倍受关注的勒索软件都已经被发现.

2016年3月, macOS系统下的第一款勒索软件KeRanger被发现.同年9月, 针对macOS系统的木马程序Komplex在俄罗斯的APT 28攻击活动中被发现.由此可见macOS系统的安全形势日趋严峻, 与人们之前固有的macOS系统是非常安全的印象完全不同.另一方面, 对比Windows和Andriod等主流系统平台的安全研究现状, 目前市场上macOS平台安全软件的整体数量和技术水平都比Windows平台上的同类软件要逊色.特别是国内安全公司的macOS版的安全软件开发基本趋于停滞.macOS平台的反病毒安全防护技术相对Windows平台落后很多.

在macOS系统的安全研究方面, 2012年, 赵帅[2]对macOS系统下的应用程序安全性进行了研究, 提出了Shellcode的动态检测方法, 实现了文件快照对比.但是基于快照对比的文件变化监控方法的实时性不足, 不能够及时地反映出文件的变化, 更不能监控文件的读写行为, 运行效率也不高.赵帅的研究不够深入且文件比对的方法应用场景狭窄.2013年, 刘北水[3]研究了Fuzz测试方法在macOS系统漏洞挖掘方面的应用, 但未进一步对漏洞利用的防护技术进行研究.同年, 汪方[4]给出了macOS系统上数据泄露防护的实现方法, 使用了函数劫持、代码注入、Kauth子系统和VFS访问控制等方式来实现文件读写的监控功能.但是基于函数劫持和代码注入的方式监控进程操作的缺点是劫持注入操作的行为可能会破坏原有进程的稳定性, 针对不同的进程还需要不同的实现, 在通用性上效果不佳, 难以实现对整个系统的监控.2014年Vilaça[5]对Mac OS X(macOS之前版本的命名)系统的rootkit技术进行了研究.在此研究中对系统调用表的地址获取技术进行了创新.但是全文侧重于rootkit技术, 没有从安全防御的角度在系统调用hooking利用方面进行更深入的研究.同年,Wardle[6]对Mac OS X系统恶意软件驻留技术进行了研究.2016年, Vincent[7]在Vilaça的内核研究基础上, 利用系统调用hooking技术实现了基于函数使用频率检测恶意软件方案.但是对系统调用hooking技术的强大功能利用还不够充分.

以上的研究都属于macOS系统安全的基础技术研究, 相比于国内的研究, 国外安全研究技术性更强, 但是对macOS系统调用hooking技术的扩展应用研究不够, 还没有完全发挥出该技术的应用潜力.hooking技术在其他平台的安全防御技术研究上发挥了巨大的作用, 比如, Windows平台上安全产品经常使用的SSDT hooking技术, Windows通用API hook工具Detours库, 以及被誉为Android平台神器的Xposed框架等.

基于上述原因和研究现状, 本文对macOS系统下的系统调用hooking技术进行了深入研究, 开发了一款可配置的系统调用监控框架雏形.该框架可以根据用户需求, 选择性地对目标系统调用进行拦截, 并将截获数据输出到监测日志, 还实现了几种常见安全扩展策略.

本文研究的创新性和意义体现在以下几个方面:1) 目前国内还没有对macOS系统调用hooking技术应用研究的文章;2) 本文提出的通用框架具有一定实际应用价值, 可配置的系统调用监控日志功能可以为macOS平台恶意软件安全分析工作提供底层系统调用的原始数据支持;3) 在此研究的基础上, 安全研究人员通过对框架策略功能进行扩展, 可以开发完成更多的安全防御功能;4) 系统调用hooking技术属于系统底层技术, 为以后macOS平台的安全研究打下基础.

本文实验部分给出了该框架基础应用的实例, 通过实验验证了该监测技术和通用框架的有效性.

1 系统调用hooking技术 1.1 macOS系统调用机制

为了维持系统的稳定和安全, 现代操作系统在设计实现时都采用了分层的思想, 核心功能由内核层提供.系统调用是操作系统内核向用户层提供内核服务的接口.系统调用位于用户态和内核态之间, 用户程序通过系统调用向操作系统内核请求服务, 操作系统内核处理完成服务后, 将结果返回给用户进程.这种机制提高了系统的安全性和应用程序的可移植性.

macOS系统内核XNU继承于UNIX系统.在Intel架构的64位系统中, 应用层调用SYSCALL指令进入内核态, 调用hndl_syscall中断服务分发例程, 通过该例程来决定调用哪一号中断服务, macOS系统内核XNU中系统调用类型之一的UNIX系统调用对应0x80号中断服务, 通过unix_syscall64例程来选择执行用户请求的UNIX系统调用, 并将结果返回给用户程序[8].

随着XNU内核版本的更新, 系统调用总数逐渐增加, 同时保持向前兼容.最新版的XNU内核中, 系统调用的总数已经超过500个.

系统调用表在XNU中被称为sysent表, 这是内核处理系统调用时使用的关键数据结构.该表中的每一项是一个结构变量, 该结构变量的名字也叫sysent, 不同的内核版本实现稍有差别, 其基本的定义如下:

  struct sysent {  /* system call表 */

  sy_call_t *sy_call;   /* 实现函数地址 */

  …

  int32_t sy_return_type; /*返回类型 */

  int16_t sy_narg;   /*参数数目 */

  uint16_tsy_arg_bytes;

  };

其他类UNIX平台的系统调用hooking方法通常是对系统调用表中系统调用服务例程的地址进行替换[9].在macOS系统中进行系统调用hooking就是对表成员sysent结构中的sy_call变量进行替换.该变量指向该系统调用服务例程的地址.所以sysent表的地址获取技术成为了实现hooking替换的关键技术.

1.2 sysent表地址的获取技术

苹果公司出于一些安全原因不导出该sysent表的符号, 获取sysent表的地址主要的方法有:

1) 基于变量nsysent的符号与sysent表之间的距离来确定sysent表地址[10].通过变量nsysent地址计算出sysent表的地址.但是如果两个地址的相对距离发生改变, 那么此方法就会失效.所以此方法兼容性不够好.

2) 根据sysent表结构特征搜索内存来确定sysent表地址[11].该方法在获取了nsysent的地址之后不是通过距离来计算sysent表的地址, 而是进行内存特征搜索来确定sysent表的地址.因为sysent表项中连续几个sy_nary变量的值是顺序相对固定的确定值, 所以通过对比多个连续的内存值就可以确定sysent表的地址.该方法比第一种方法具有更好的兼容性.

3) 在第二种方法的基础上, 根据x86体系结构特点, 利用IDT表来获取syscall handler地址, 继而获取整个kernel的内存地址, 以此地址结合第二种方法中介绍的sysent表的特征值搜索方法进行暴力搜索.此方法摆脱了对nsysent变量地址的依赖[5], 具有更好的兼容性.

本框架采用的是最后一种方法.

1.3 hooking系统调用表

在进行系统调用表hooking时, 使用自定义系统调用处理函数的地址对系统调用表中sysent结构中的sy_call变量地址进行替换, 就可以在执行系统调用之前先执行本框架的监控代码, 原理如图 1所示.

图 1 hooking系统调用原理 Figure 1 System call hooking

图 1中使用hooking函数1的地址替换了system call 1号函数的地址.

整个hooking操作的步骤如下:

步骤1:使用汇编指令sidt获取IDT表的地址;

步骤2:根据IDT表的地址, 计算出0x80号中断处理例程syscall handler的地址;

步骤3:根据syscall handler的地址向上搜索内存, 匹配Mach-O文件头特征, 找到内核kernel的基地址;

步骤4:从kernel的基地址开始, 使用特征匹配向下搜索内存, 直到找到sysent表的地址;

步骤5:在内核模块的hook_syscall函数中, 保存原始sysent表到kernel_functions数组中, 将需要hooking系统调用项的sy_call地址替换成自定义函数入口hook_functions的地址, 这样就实现了系统调用的hooking;

步骤6:在自定义函数中截获系统调用后, 进行自定义处理, 调用原始的系统调用, 完成原始系统调用的功能;

步骤7:结束系统调用hooking时, 在内核模块中调用unhook_syscall卸载函数, 将kernel_functions数组中的原始地址恢复系统调用表中, 这样就可以解除hooking.

2 通用监测框架的设计与实现

在系统调用hooking技术的基础上, 本文实现了一个原型框架, 整个架构如图 2所示.

图 2 通用监测框架 Figure 2 Monitoring framework

整个框架设计遵循的原则是:1) hooking模块接口保持尽量高的通用性; 2) 设计简单, 对系统影响尽量小; 3) 易于扩展和添加功能.

2.1 Syscall hooking模块

“Syscall hooking模块”的功能是负责实现核心的hooking功能, 并向用户层的“事件处理模块”发送截获的信息.模块工作在驱动层, 是一个kext驱动.该模块的核心工作原理已经在上一节中进行了描述.

本框架最显著的功能特点就是可以根据用户需求进行系统调用hooking的选择配置, 动态地进行系统调用的监控, 而不是一次性hooking所有的系统调用, 将所有数据发送到用户层再来过滤出想要的数据.macOS的系统调用有接近500个, 作为具有可配置功能的框架, 可以根据不同的监控需求动态设置hooking哪些目标系统调用, 这样做的优势在于:一方面, 相比对所有系统调用都进行hooking来说, 自定义配置hooking可以显著减小不必要的系统性能开销, 提高框架性能; 另一方面, 可以减小日志信息量, 便于后期处理分析, 提高工作效率.

实现可配置hooking需要提供给用户设置hooking对象的接口, 为此本框架在代码中维护一个数组tohook[n], 成员个数n等于系统调用总数.每个成员变量对应相同序号的系统调用.成员变量为0则不进行hooking, 否则进行hooking.“策略配置模块”通过发送KERNCON_SETHOOKTABLE控制信息来对该数组进行更新.更新tohook[n]数组后重新启动一次hooking操作就可以完成动态监测的目标更新.

因为sysent结构变量的定义在不同版本中的实现有所差别, 所以本框架在进行sysent表特征搜索时和进行hooking替换时通过version_major变量来获取系统的版本信息, 针对不同系统版本做了相应的处理, 这样就保证了该框架的兼容性.本框架在最新的El_Capitan, Yosemite, Mavericks等版本上都能正常运行.

“Syscall hooking模块”的基本工作流程如图 3所示.

图 3 Syscall hooking模块工作基本流程图 Figure 3 Syscall hooking model working flow

发送监控数据这一步骤是核心模块在完成hooking监控后需要进行的操作.在启动了系统调用hooking之后, 被监控的系统调用每一次调用时都会发送一次数据包, 包含调用的基本信息:pid, ppid, 系统调用号和进程名.

核心模块除了完成基本的hooking功能和向应用层发送数据外, 还支持一些必要的功能策略.

a)黑白名单策略

核心模块支持进程名过滤.对黑名单中的进程进行监控,对白名单中的进程进行过滤.将该功能放在内核层完成可以减少内核层向用户层传递的数据量, 降低对系统性能的影响.另外本框架作为一个包含用户层模块的程序也会使用到系统调用.如果不进行进程名过滤, 将会导致严重的循环监控问题.即在应用层模块中,监控消息在后期被处理时,会使用到系统调用,这样又会产生新的监控消息,此新的监控消息又将被应用层模块处理,不停循环导致消耗大量系统资源.

过滤方法:1) 实现黑白名单数据结构, 并初始化;2) 由系统调用给出的进程信息参数struct proc *p通过函数proc_pid()获取进程pid;3) 利用进程pid通过函数proc_name()获取进程名字符串;4) 与黑白名单进行比对过滤.

b)父子进程关联策略

恶意软件经常通过调用shell或创建子进程的方法来完成特定的恶意行为, 本框架提供了针对目标进程的相关父子进程的监测策略.

实现方法:1) 由系统调用给出的进程信息参数struct proc *p通过函数proc_pid()和proc_ppid获取进程pid和ppid;2) 通过pid和ppid构建的父子进程关系表来分析目标进程的父进程或子进程, 从而进行关联监测, 一并输出数据.

c)部分系统调用参数信息的输出

除了发送基本监测的信息之外, 一些特殊系统调用函数, 还需要向用户层发送更多的参数信息.因此针对这部分系统调用需要做出单独的处理,如下面一段代码所示:

  if (syscallnumber == SYS_open){struct open_args* oa=(struct open_args*) a; error=copyinstr((void*)oa- > path, (void*)argstr, MAXPATHLEN, & dummy);

  if(!error){

xcheck_post_message(syscallnumber, pid,

    ppid, strcat(processname, argstr));

  }

}

这段代码针对open系统调用, 将参数结构中path路径信息进行发送操作.这样应用层模块在接收消息时, 就能知道这次open系统调用服务打开文件的具体路径.

2.2 策略配置模块

“策略配置模块”负责接收存储用户输入的配置信息, 向“Syscall hooking模块”和“事件处理模块”发送配置信息和控制信息.

hooking监控的配置信息、开启和关闭消息, 都是由“策略配置模块”来发送的.该模块使用一个tohookconfig[n]数组来保存系统调用hooking的配置信息.使用KernelControl类的实例方法进行设置.比如对59号函数进行hooking设置:

[KCinstance SetHookMap:59:1];

然后将配置信息发送到“Syscall hooking模块”, 通过setsockopt函数来进行配置消息的发送:

setsockopt(sock, SYSPROTO_CONTROL, KERNCON_SETHOOKTABLE, tohook_functions, sizeof(int)*(SYS_MAXSYSCALL+1));

在实现的时候, 要注意数据控制信息要与驱动层保持一致.因为不同的系统版本的系统调用总数不一样, 还需在系统版本的兼容性上进行相应处理.否则可能引起系统崩溃.

2.3 事件处理模块

“事件处理模块”负责接收“Syscall hooking模块”发送的消息, 并根据配置输出日志.打印输出的基本信息如表 1所示.

表1 日志记录输出信息项 Table 1 Log output information items
记录项 记录项内容
time 该条记录生成的时间
syscallname 系统调用的名称
pid 进程ID
ppid 父进程ID
processname 进程名
arginfo 系统调用参数信息(特定某些系统调用会输出此项, 如open和execve)

除了输出日志功能以外, “事件处理模块”还包含策略处理功能.如2.1节所介绍, “Syscall hooking模块”在内核层支持一部分策略.但是有些策略的实现需要在应用层主程序来完成.应用层的“事件处理模块”负责实现其他策略功能.具体而言, 该模块在接收底层数据的基础上, 进行数据的分析处理等应用层处理, 完成更多的策略功能, 提供给用户使用,比如:

a)新文件生成判断策略, 该模块接收到文件操作的事件之后, 利用文件属性的添加时间来判断是否为新建的文件.

b) plist文件分析策略.此功能应用在launch启动项分析中, 能对plist文件进行分析, 提取启动项信息.详见后面的3.2节的实验介绍.

c)高频系统调用统计策略.该模块通过对指定系统调用的次数进行记录, 计算规定时间内的系统调用次数来进行统计预警.

2.4 用户层和驱动层的通信

macOS提供了多种用户层与驱动层之间的通信方法,如Mach消息, RPC-Mig, BSD syscall和内存映射等.本框架根据监控消息的多发性, 选择了system socket这种轻量级的方法.该方法简便高效, 是一种数据从内核层到用户层的可靠传递途径.如图 2中所示, 内核kext模块可以使用kernel event API的SYSPROTO_EVENT协议广播事件消息到用户层, 在用户层通过socket来接收.

同时, 用户层的“策略配置模块”使用kernel control API的SYSPROTO_CONTROL协议将配置和控制信息发送到内核的kext模块.这样就实现了双向交互通信.

3 实验与分析

实验环境为VMware Fusion 8.1.1 +macOS 10.10.3.

3.1 可配置的系统调用hooking实验

本实验的目的是对本框架的基本功能(系统调用hooking)进行测试, 同时验证框架的可配置性.实验通过配置功能对包括目录操作类和文件操作类系统调用进行监测.

有两种查看输出数据的方法:1) 使用系统自带的Console程序查看system.log文件的调试信息输出;2) 手动查看在桌面目录中主程序生成的日志文件.这两种方法的不同之处是system.log文件中包含更多的调试信息.正常情况下任意采用其中一种方法就可以进行验证.

3.1.1 目录操作类监测

使用本框架对目录类系统调用进行监测, 在实验虚拟主机上进行随机目录操作, 观察输出的日志是否包含目录操作的行为记录.

框架会在桌面目录中输出日志文件, 实验中的信息节选如下:

time; syscall name; pid; ppid; processname;

22:0:25, 877174;SYS_rename; 972; 1; quicklookd;

22:0:25, 877943;SYS_rmdir; 972; 1; quicklookd;

22:0:25, 878351;SYS_chmod; 972; 1; quicklookd;

22:0:25, 878700;SYS_unlink; 972; 1; quicklookd;

22:0:25, 880122;SYS_access; 42; 1; fseventsd;

22:0:25, 881602;SYS_access; 42; 1; fseventsd;

实验生成的日志表明, 本框架成功对指定的目录操作类系统调用进行了hooking, 并按预期格式输出到日志文件.证明该框架基础可配置hooking功能有效.

3.1.2 文件操作类监测

使用本文开发的测试程序进行文件操作类监测.该程序首先新建一个文件, 然后进行数据写入, 数据读取操作, 最后删除该文件.重复此过程1 000次.使用本框架对4个系统调用进行监控, 实验结果如表 2所显示.监测到的次数与实际调用次数相同, 没有遗漏.

表2 文件操作监测结果 Table 2 File operation monitoring results
系统调用号 名称 实际调用次数 监测到的次数
3 read 1 000 1 000
4 write 1 000 1 000
5 open 1 000 1 000
226 delete 1 000 1 000
3.1.3 稳定性实验

对250个常用系统调用进行1小时的监测, 随机运行程序, 启动, 关闭监测.观察框架运行的稳定性.

实验过程中主机系统正常运行, 框架的日志输出正常.说明该框架实际工作性能是相对稳定的.

3.2 基于策略的安全模块构建实验

该组实验分别针对启动项拦截策略, 新建进程监测策略和高频文件操作预警监测策略进行了实验验证.选择这三个策略, 是因为对应的文件操作.进程操作和频率使用行为特征都是典型的恶意软件常见行为特征.该实验一方面可以验证策略的有效性, 另一方面可以证明该框架在安全应用方面的具体应用价值.

3.2.1 启动项拦截策略实验

大多数恶意软件通常使用macOS系统的launch机制来实现驻留自启动.该机制分为daemons/agents两种, 这都是由launchd进程负责启动的后台作业.创建一个daemon或agent并不复杂, 只需要创建一个普通的二进制可执行文件作为启动目标, 然后将属性列表文件(.plist文件)放置到daemon或agent相应的配置目录中, 配置目录如表 3所示.

表3 plist文件存放目录列表 Table 3 Plist file directory list
目录 用途
/System/Library/LaunchDaemons 系统本身的守护程序
/Library/LaunchDaemons 第三方程序的守护程序
/System/Library/LaunchAgents 系统本身的代理程序
/Library/LaunchAgents 第三方程序的代理程序
~/Library/LaunchAgents 用户自有的代理程序

要实现对配置目录的监控, 需要对表 4中的3个文件系统操作的系统调用进行hooking劫持.

表4 启动项拦截实验系统调用列表 Table 4 List of system calls for monitor startup items
系统调用号 系统调用名
5 open
128 rename
227 copyfile

“事件处理模块”将会收到文件操作时的系统调用事件信息, 该信息包含具体的文件的路径, “事件处理模块”根据该路径进行分析.策略功能可以判断新的plist文件是否带有启动项, 如果有就进行预警弹窗, 提示用户选择是否拦截, 若用户选择拦截则将新生成的plist文件删除就可以阻止启动项的添加.本实验使用了表 5中列出的3个于2016年发现的最新恶意软件样本进行实验.

表5 启动项拦截实验所用样本 Table 5 Malware samples
恶意软件名称 简介
Eleanor 2016年7月发现, 基于PHP的木马
Mokes 2016年9月发现, 传统的OSX木马
Komplex 2016年9月发现, 俄罗斯木马, 曾用于APT 28/FancyBear攻击

结果显示本框架策略成功监测到了启动项的添加, 并弹出了预警框让用户进行选择是否进行拦截.实验证明了策略功能的有效性, 具体拦截的启动项信息如表 6所示.

表6 启动项拦截实验结果 Table 6 The startup intercept results
名称 启动项 结果
Eleanor /Users/~/Library/LaunchAgents/com.getdropbox.dropbox.usercontent.plist 成功拦截
Eleanor /Users/~/Library/LaunchAgents/com.getdropbox.dropbox.integritycheck.plist 成功拦截
Eleanor /Users/~/Library/LaunchAgents/com.getdropbox.dropbox.usercontent.plist 成功拦截
Mokes /Users/~/Library/LaunchAgents/storeuserd.plist 成功拦截
Komplex /Users/~/Library/LaunchAgents/com.apple.updates.plist 成功拦截
3.2.2 新进程创建监测策略实验

恶意软件在第一次启动时通常会涉及到创建进程操作, 在其运行的过程当中也可能会有创建进程的操作行为, 通过策略配置, 本框架可以实现对新进程创建行为的监测.59号系统调用execve是创建新进程时最常使用的系统调用.在本实验中, 使用新进程创建监测策略, 对表 7中的3个系统调用进行hooking, 将启动参数也就是指向可执行文件的路径发送到“事件处理模块”进行分析.结合白名单和其他信息, 比如可执行文件所在目录, 文件大小等进行判断, 就能实现对可疑新进程的创建行为进行预警.

表7 新进程创建监控的系统调用列表 Table 7 System call hooking list for monitor new process creates
系统调用号 系统调用名
59 execve
244 posix_spawn
380 __mac_execve

表 7中的系统调用进行拦截后, 使用bash, sh, finder等工具启动新进程, 另外还使用了一款有创建新进程行为的恶意软件样本KeRanger进行实验.实验结果如表 8所示.

表8 新进程创建预警实验结果 Table 8 Monitor new process creates result
创建方式 实验结果
sh 成功预警, 拦截到ls命令的执行
bash 成功预警, 拦截到chown命令的运行
Finder 成功预警, 拦截到Photos程序的启动
KeRanger 成功预警, 拦截到恶意进程kernel_service的创建
3.2.3 高频文件操作预警策略实验

勒索软件的爆发是2016年信息安全界的一个热点, macOS系统上也出现了勒索软件[12].针对勒索软件对文件的高频次操作特点, 本框架通过对文件和目录操作的系统调用进行监控, 对操作的序列和频次进行分析.如果发现包含高频次的目录浏览、文件读写和删除操作符合勒索软件的加密操作特征就进行预警.

表 9中的3个系统调用进行监控, 使用macOS系统上第一款勒索软件KeRanger样本进行测试, 当文件操作频率过高时, 进行预警.

表9 高频次文件操作预警监控的系统调用列表 Table 9 System call hooking list for high frequency file operation monitor
系统调用号 系统调用名
3 read
4 write
226 delete

本实验成功对KeRanger的高频文件操作进行了监测预警.验证了该扩展策略的有效性.

3.3 性能开销

本框架的性能开销与监测时选择的系统调用数量和使用率有关, 数量越多, 被监控的系统调用使用越频繁, 计算机运行的时间开销就会越大,CPU的占用率就会越大.

在实验主机中开启safari浏览器随机播放一段网页视频, 使用系统自带的Activity Monitor工具观察system用户和User用户的CPU整体占用率情况, 对比关闭和开启hooking监控250个常用系统调用时的CPU整体占用率.占用率越高说明此刻CPU工作越繁忙, 框架工作对系统影响越大.

结果如表 10所示, 该框架在进行hooking工作时对系统性能影响较小.普通用户基本感觉不到系统运行速度的变化, 系统整体运行速度在可接受范围内, 且该数据采集自虚拟机VMware Fusion中.若使用真实主机, 性能开销还会更小.

表10 性能开销结果 Table 10 Performance overhead results
%
操作模式 System CPU User CPU
启动监测 8.68 19.54
不启动监测 8.14 18.52
4 结论

本文设计并实现了一套macOS系统的系统调用监测通用框架, 除了提供基础的可配置系统调用监测日志功能外, 还在核心功能之上实现了几种安全策略配置功能, 可以根据用户需求启用相应的安全策略, 在可配置性及扩展性方面做出了创新设计, 最后通过实验证明了macOS平台上系统调用hooking技术的可行性和该框架的有效性.

本框架是在macOS系统调用hooking技术的理论研究基础上开发的实验性框架, 很多功能还有待进一步研究完善.下一步的研究可以考虑从下面几个方向进行:

1) 研究macOS底层各个系统调用的详细功能, 弄清系统调用和应用层行为的关系.进一步加强框架核心模块的功能, 提供更多, 更灵活的接口;这样更易于进行二次的开发或者调用, 形成新的功能组件.比如, 研究应用层对底层驱动的调用接口; 对接口数据进行分析研究, 实现对关键数据修改; 开发针对内核模块的fuzzing工具, 在内核漏洞挖掘方面进行应用.

2) 研究macOS系统各类恶意软件的系统调用行为特征, 通过系统调用的行为特征对恶意软件进行检出和拦截.可借鉴参考Windows和Linux相关的论文, 技术报告, 工程实例等.比如通过系统调用的组合使用集, 调用频率, 调用序列等特征检测和判断方法来进行恶意软件识别.

3) 对框架通用性进行改进.本文实现的框架比较简单, 其目的更多的是验证性的.为了增强通用性, 还需要进行改进, 特别是在应用层模块.如果开发成动态链接库的形式, 提供稳定的接口, 就更易于其他程序加载使用,如同Windows平台的Detours和Andriod平台的Xposed框架一样.

参考文献
[1]
CARBON BLACK. The Most Prolific Year in History for OS X Malware[DB/OL].[2016-12-18].https://www.carbonblack.com/files/2015-the-most-prolific-year-for-os-x-malware/.
[2]
赵帅. 苹果操作系统下应用程序的安全性研究[D]. 上海: 上海交通大学, 2012.
ZHAO S. Research on Security of Mac OS X Applications[D].Shanghai:Shanghai Jiaotong University, 2012(Ch). http://cdmd.cnki.com.cn/Article/CDMD-10248-1012018897.htm
[3]
刘北水. Mac OS X系统安全性研究[D]. 西安: 西安电子科技大学, 2013.
LIU B S.Mac OS X System Security Research[D].Xi'an:Xidian University, 2013(Ch). http://d.wanfangdata.com.cn/Thesis/D365092
[4]
汪方. Mac OS X终端数据泄露防护研究[D]. 武汉: 华中科技大学, 2013.
WANG F.Research of MacOS X Endpoint Data Leak Prevention[D].Wuhan:Huazhong University of Science and Technology, 2013(Ch). http://d.wanfangdata.com.cn/Thesis/D411052
[5]
VILAÇA P. Revisiting Mac OS X Kernel Rootkits[DB/OL].[2016-12-26].http://phrack.org/issues/69/7.html.
[6]
WARDLE P. Methods of Malware Persistence on Mac OS X[DB/OL].[2014-10-26].https://www.virusbulletin.com/virusbulletin/2014/10/paper-methods-m-alware-persistence-mac-os-x.
[7]
VINCENT V M.Behavioural Detection and Prevention of Malware on OS X[DB/OL].[2016-09-29].https://www.virusbulletin.com/virusbulletin/2016/09/beha-vioural-detection-and-prevention-malware-os-x.
[8]
LEVIN J. Mac OS X and iOS Internals:To the Apple's Core[M]. Indianapolis: Wiley Publishing Inc, 2013.
[9]
JOSEPH K. Designing BSD Rootkits:An Introduction to Kernel Hacking[M]. San Francisco: No Starch Press, 2007.
[10]
LANDON F.Fixing ptrace on Mac OS X 10.5 Leopard[DB/OL].[2008-02-17].http://landonf.org/code/macosx/Leopard_PT_DENY_ATTACH.20080122.html.
[11]
CHARLIE M, DINO D Z. The Mac Hacker's Handbook[M]. Indianapolis: Wiley Publishing Inc, 2009.
[12]
CLAUD X. New OS X Ransomware KeRanger Infected Transmission BitTorrent Client Installer[DB/OL].[2016-03-06]. http://researchcenter.paloaltonetworks.com/2016/03/new-os-x-ransomware-keranger-infected-transmission-bittorrent-client-installer/.