Malware Abnormal Detection Based On Sandbox Behavior Log
1. Ransom Detection
0x1:特征工程
1. 在运行生命周期期间向磁盘写入大量相同后缀的文件
1)释放大量相同后缀文件特征
勒索软件的核心目的就是加密受害者磁盘上的文件,并且为了明确标识被加密的文件,勒索软件作者会使用一个固定的文件后缀对原始文件进行重命名。这个行为特征我们将其用抽象化的向量化特征表征出来。
file drop的文件的文件扩展名都集中在某一个特定后缀(占百分比超过90%),且后缀名不是常见后缀(exe、dll、sys)。
b.id , WM_CONCAT('|*|', b.fileext) AS fileext -- 文件扩展名 -- 1. 对应文件扩展名的落盘文件数量比例(百分比)的统计分布 , MAX(b.filedroped_cn_rate) AS filedroped_cn_rate_max , MIN(b.filedroped_cn_rate) AS filedroped_cn_rate_min , MAX(b.filedroped_cn_rate) - MIN(b.filedroped_cn_rate) AS filedroped_cn_rate_range , STDDEV(b.filedroped_cn_rate) AS filedroped_cn_rate_stddev -- 2. 样本运行期间所有落盘文件的扩展名类型数量 , MAX(b.fileext_cn) AS fileext_cn -- 3. 样本运行期间所有文件扩展名的的落盘文件数量统计分布 , MAX(b.filedroped_cn) AS filedroped_cn_max , MIN(b.filedroped_cn) AS filedroped_cn_min , MAX(b.filedroped_cn) - MIN(b.filedroped_cn) AS filedroped_cn_range , STDDEV(b.filedroped_cn) AS filedroped_cn_stddev -- 4. 样本运行期间所有文件路径的的落盘文件数量统计分布 , MAX(b.filepath_cn) AS filepath_cn_max , MIN(b.filepath_cn) AS filepath_cn_min , MAX(b.filepath_cn) - MIN(b.filepath_cn) AS filepath_cn_range , STDDEV(b.filepath_cn) AS filepath_cn_stddev -- 5. 样本运行期间所有文件类型的的落盘文件数量统计分布 , MAX(b.filetype_cn) AS filetype_cn_max , MIN(b.filetype_cn) AS filetype_cn_min , MAX(b.filetype_cn) - MIN(b.filetype_cn) AS filetype_cn_range , STDDEV(b.filetype_cn) AS filetype_cn_stddev -- 6. 样本运行期间所有文件MD5的的落盘文件数量统计分布 , MAX(b.filemd5_cn) AS filemd5_cn_max , MIN(b.filemd5_cn) AS filemd5_cn_min , MAX(b.filemd5_cn) - MIN(b.filemd5_cn) AS filemd5_cn_range , STDDEV(b.filemd5_cn) AS filemd5_cn_stddev -- 7. 落盘文件各个fileext中的filesize_max的统计分布 , MAX(b.filesize_max) AS filesize_max_max , MIN(b.filesize_max) AS filesize_max_min , MAX(b.filesize_max) - MIN(b.filesize_max) AS filesize_max_range , STDDEV(b.filesize_max) AS filesize_max_stddev -- 8. 落盘文件各个fileext中的filesize_min的统计分布 , MAX(b.filesize_min) AS filesize_min_max , MIN(b.filesize_min) AS filesize_min_min , MAX(b.filesize_min) - MIN(b.filesize_min) AS filesize_min_range , STDDEV(b.filesize_min) AS filesize_min_stddev -- 9. 落盘文件各个fileext中的filesize_avg的统计分布 , MAX(b.filesize_avg) AS filesize_avg_max , MIN(b.filesize_avg) AS filesize_avg_min , MAX(b.filesize_avg) - MIN(b.filesize_avg) AS filesize_avg_range , STDDEV(b.filesize_avg) AS filesize_avg_stddev -- 10. 落盘文件各个fileext中的filesize_stddev的统计分布 , MAX(b.filesize_stddev) AS filesize_stddev_max , MIN(b.filesize_stddev) AS filesize_stddev_min , MAX(b.filesize_stddev) - MIN(b.filesize_stddev) AS filesize_stddev_range , STDDEV(b.filesize_stddev) AS filesize_stddev_stddev
在概率密度分布图中还注意到一个很有趣的现象,即cryptencrypt这个api call只存在于黑样本中,也就是说,这个特征具有100%的完全区分性。
但这并不意味着说,我们只用这一个特征就可以解决所有二分类问题,因为这个特征本身对label sample不能做到100%覆盖,可能只有60%。换句话说,这个特征存在40%的漏报。
但是在利用行为数据的时候要注意一个问题,勒索软件写文件的方式和具体开发者的编码方式有关:
1. 打开原始文件 -> 读取原始文件 -> 在内存中进行加密 -> 在同一个目录下新建一个新的文件,并使用特定的勒索文件后缀: 这种行为会触发new file drop行为,同时也会留下writefile api call记录 2. 打开原始文件 -> 读取原始文件 -> 在内存中进行加密 -> 将加密后的内容回写回原始文件,这种行为只会触发writefile api call记录,但不会有新文件drop行为: 这种编码方式的缺点就是如果遇到原始文件句柄被占用的情况,可能会导致写文件失败,进而导致勒索软件crash
2)和感染性病毒的区分性问题
在实际工程中,要注意一个问题,该行为模型预测得到的结果中,可能会包含感染型病毒,因为从行为上看,感染性病毒同样会去修改大量的文件。
为了将感染性和勒索软件区分开来,我们需要找出它们在行为上的更深层次的区分点:
1. 感染性一般修改可执行文件,而勒索一般针对数据文件。 2. 被修改的文件,如果集中在python/email这几个数据目录,可以重点关注为勒索软件 3. 把样本file drop出来的文件的filesize变动情况考虑进来 1. ransom只会改动很少的size 2. 而感染性病毒一般会使原始文件膨胀很多
上图是一个勒索软件运行期间的文件释放情况,可以看到,它对python和foxmail目录下的数据文件进行加密,并且修改成了指定的后缀acc1。
3)和setup.exe安装程序的区分性问题
在实际工程中,我们遇到一种setup.exe安装程序,或者解压程序之类的程序,它同样会有大量的文件释放行为,甚至可能会释放大量的类似.jpg、.ico、.sql文件。对这类case的二分类,我们需要加入以下特征
1. basepath count() 特征,如果是安装包这种程序,它释放文件的basepath应该集中在一个相对较小的范围内,而如果是勒索软件,因为会遍历磁盘,basepath的集合会相对较大。 2. 释放文件数量最多的fileext,以及对应的落盘文件数量:在下游二分类器的逻辑中,需要加入白名单过滤,对存在大量释放.jpg类似这种后缀的样本进行过滤。
2. 敏感API CALL词频词袋模型特征
使用一批已经打标的ransom样本,提取其API CALL调用,进行COUNT频数统计。我们可以得到一个词袋词汇表。
我实验的结果如下,需要注意的,可能存在某些公共API,它们不管在任何样本中都会大量出现。因此对于这份词汇表vocabulary我们需要根据人工领域经验进行feature selection
1. NtOpenFile: 打开文件 2. NtCreateFile: 打开原始文件/新建重命名后的带勒索后缀的新文件 3. NtReadFile: 勒索加密文件前要先打开读取文件内容 4. NtWriteFile: 勒索软件会伴随大量的写文件行为,这个feature的频数从领域经验来看,应该会有比较大的参考意义 1. SetEndOfFile: 设置文件末尾 2. SetFilePointer: 同上 3. SetFilePointerEx: 勒索软件常常会在加密后的文件头或文件尾插入一些meta信息,用于还原使用用。这里就要用到SetFilePointerEx进行文件指针移动 4. GetFileType: 获取文件类型 5. SetFileAttributesW: 修改文件属性 6. GetFileAttributesW: 判断文件类型,获取文件后缀等目的,用于判断是否需要进行白名单过滤 7. GetFileSizeEx: 勒索软件常常会对超过一定尺寸的文件进行过滤,以保证勒索加密效率 8. DeleteFileW: 勒索软件在读取原始文件内容,在内存中加密后,有时候会新建一个带勒索后缀的文件,然后删除原始文件 9. NtSetInformationFile: 删除文件 10. SetFileTime 1. NtQueryDirectoryFile: 枚举目录下所有文件 2. FindFirstFileExW: 开始枚举目录下文件 3. GetSystemDirectoryW 4. GetSystemWindowsDirectoryW 1. LdrGetProcedureAddress: 恶意软件常用的动态获取api address方式 2. LdrLoadDll: 同上 3. LdrGetDllHandle 1. CryptEncrypt: 调用系统原生加密函数进行buf加密操作 2. CryptAcquireContextA 3. CryptCreateHash 4. CryptHashData 1. CreateThread: 启动单独线程进行加密操作 1. LoadResource: 加载释放payload、蠕虫子体、勒索相关资源等都会用到这个api 2. FindResourceExW 3. FindResourceA 4. LoadStringW: 勒索白名单、勒索标语等资源的加载 5. LoadStringA 6. SizeofResource 7. FindResourceW 1. RegCloseKey: 创建mutex,防止重复加密,常常会借助特定注册表项 2. RegOpenKeyExW: 同上 3. RegQueryValueExA: 同上 4. RegQueryValueExW: 同上 5. RegSetValueExA 6. RegSetValueExW 7. RegEnumKeyExW 8. RegOpenKeyExA 9. RegCreateKeyExW 10. RegCreateKeyExA 11. NtQueryValueKey 12. NtOpenKeyEx 13. NtQueryKey 14. NtOpenKey 15. NtEnumerateKey 16. RegEnumValueW 17. NtEnumerateValueKey 1. NtAllocateVirtualMemory: 申请一块内存,进行buf加密处理 1. GetSystemTimeAsFileTime: 获取系统当前时间 1. OpenSCManagerA: 勒索软件常常会通过创建服务的方式实现持久化 2. OpenSCManagerW 3. CreateServiceA 4. StartServiceA 1. GetForegroundWindow: 将焦点聚焦在前台 2. FindWindowExW
在实际进行one-hot词袋编码的时候,我们可以采取feature压缩的方式对相似的api进行归一化压缩,因为实际上windows上的api有很多具有类似的功能,开发者在开发软件的时候,是具有一定的自由度从一组api call里选择任意一个达到相同的目的的。
3. API族群调用序列区间分布顺序 / 成对依赖关系分布顺序特征
对于不同的勒索软件来说,也许不同的开发者写出的代码风格不一样,但是从整体大框架流程的角度来看,所有的勒索软件可能都具备一个框架性的流程,例如:
注册表操作 -> 服务注册/启动相关操作 -> 信息相关信息获取 -> 启动新线程进行加密逻辑 -> 目录枚举 -> 文件遍历 -> 读文件 -> 加密相关api -> /写文件(可能还伴随有文件指针的移动) -> ...
对这部分api之间的大致区间顺序/和成对的依赖顺序,我们可以用api调用所在整个生命周期的position的平均位置特征来表征。
4. 目录枚举行为特征
勒索病毒为了进行全盘加密,会进行大量的目录遍历。这个过程就会调用到windows的findfirstfileXXX的api。
分别查看黑白样本的dir enumeration特征概率分布,从数据特征值空间分布上,还是存在区分点的,也就说,dir enumeration存在差异的这个假设是有效的。
5. 样本基础meta特征
1)bin_size
从领域经验的角度去解释,bin_size也可以作为特征,其中包含的规律是太大的bin_size一般不可能是malware
2)file_ext_top length
ransom释放或者修改的文件后缀,一般倾向于大于等于4bytes
6. 释放文件的ext_top后缀 - one-hot编码
从特征工程的角度看,我们可以根据黑白样本里包含的file_ext_top进行one-hot编码,目的是希望模型能够“学习”到file_ext_top这个维度中包含的假设规律。
但是做这种操作要仔细思考清楚是否有意义,one-hot的核心作用在于“将离散变量转换为欧式空间中的点”,它本身并不提供泛化能力,即在sample中的hot编码要么出现,要么没出现。
从另一个方面,从纯工程的角度,我们应该将人工经验和ML模型相结合,即如果我们已经明确确定某些ext后缀代表的是ransom(这可能表明了该ransom的家族),我们可以直接将这部分的人工经验hard coding为规则,不要再进去ML模型去predict了
Relevant Link:
Copyright (c) 2018 LittleHann All rights reserved