搜索
查看: 3989|回复: 38
收起左侧

[分享] SophosML背后的技术(1)

  [复制链接]
B100D1E55
发表于 2017-9-16 12:27:15 | 显示全部楼层 |阅读模式
前一段闲的时候就随手收集各种ESET miss样本,其间发现了一个有趣的现象:不少VT初期侦测数很低的恶意样本,最初报毒往往都集中在新引擎上(CrowdStrike,Cylance,SentinelOne,Endgame,SophosML,TrendMicro等)。当然从这个现象并不能归纳出这些“新”技术一定就有多少优势,毕竟这里面很多引擎到目前为止都没有在普通用户中普及开,大多情况下也就没什么免杀的意义了。即使真有高侦测,没有相应的误报数字也没法综合判断这些新技术是否真的效果更好。

这些产品大多都是“申请制”,需要用户去申请demo使用。目前为止,仅有CrowdStrike参与了AVC长期测试,并在部分高校进行了部署(例如MIT);Cylance似乎近期有个人端产品的计划,但不知道什么时候开始贩售。剩下几个基本都是针对企业用户,普通人难以接触到。


不过从原理来说,一些基于异常侦测的机器学习算法的确可能在一些情况比传统“拉黑模式”侦测来得更及时(黑客没有针对绕过的大前提下),本文来自Sophos的一篇介绍自家ML技术的文章,应该说对于非专业内人士(包括我)还是有一些阅读价值的

从识别恶意URL说起
假定我们收集到如下样本,该如何有效地在客户端进行侦测?
恶意URL 正常URL
\facebook.com-me12.xy\r\l\c580f098f8cfc54cd872a35192a82ac3\?entrypop=1 graph.facebook.com/10153752105048199/picture
\facebook.com.piihs.edu.bd\ 2cv.facebook.com/
\login.facebook.whats-gratis.com\3849485691b6ff4908136fdcb303ff9f82d07ab4 connect.facebook.net/signals/config/1659451214312211
\login.facebook.whats-gratis.com\SPUkZ\VlQLZ\VPMUZ\ connect.facebook.net/sdk.js
\www.facebook.com.vnomera.com\widgets\like.php www.intern.facebook.com/


最传统的方法自然是拉黑,但是在恶意网页爆炸式增长的大前提下,拉黑的代价就是巨大的黑名单库和严重性能折损。如果是云端查询,网络带来的延迟会进一步劣化用户体验。更根源的问题是:简单的拉黑将杀软置于被动的局面,只能通过不断爬虫收集来完善黑名单库。
稍好的方法是给特征增加一点广谱性,例如用正则表达式进行网址匹配。虽然好的广谱特征可以有效降低暴力入库的工作量,但其对特征分析带来的更高的要求——倘若一条广谱特征不小心将正常网页也屏蔽了,其带来的损失可能难以预计

面对上面这个列表,我们可以设计一些正则特征来匹配恶意URL。
例如,当facebook的第一个.com后面还出现点和其他字符的时候判断为恶意。这可以拉黑上面5个恶意URL中的2个
更进一步,可以侦测在facebook.com之后第一个斜线前的其他句点、连字符等,正则表达式为“/^facebook\.com[\-\.\w\/\?\=]+$/”。这个表达式可以侦测5个恶意URL中的3个。至于剩下的2个URL可以另外增加其他广谱特征进行侦测

假定每条规则需要5分钟来写,那么阻挡上面5个恶意URL就需要10分钟来撰写规则,每条规则还需要额外的5分钟来比对白名单进行回溯测试避免误杀。这样一来,光入库就需要20分钟——这甚至还没考虑进在写特征前鉴定网页黑白的耗时

总体来说,上述方法有四个主要缺点 1)被动响应,被恶意网站牵着鼻子走 2)每条广谱特征能涵盖的样本有限,需要大量广谱特征才能涵盖更多恶意样本 3)特征更新和查询对网络环境和机器性能都有较高要求 4)人工更新特征需要耗费大量人力物力

广谱特征误杀案例学习,来自AVIRA的故事

10年的时候某博主在博客上曾经抱怨过自家的Chrome拓展一直被AVIRA报HTML/Crypted.Gen。而且虽然他联系AVIRA解除了误报,但每次更新新版本的时候这些误报又出现了。于是博主运用广大人民喜闻乐见的二分查找法定位到AVIRA只要侦测到脚本中如下几个特征就会报毒:
.fromCharCode
.charCodeAt
for
eval
0,0,0,0,0,0
Math.min

放狗搜索之后博主发现的确有一些特定iframe恶意脚本中包含这些特征。然而,这些关键字却也都出现在所有基于GWT构建的网页程序中(注:GWT是google的一个网页开发框架,开发者可以通过java编程,然后GWT会将其compile为js网页程序)。
博主做了个实验,在google的论坛里发了一个包含上述这些特征的帖子。博主原来估计这下AVIRA肯定会连google页面都报毒了
意外的是,AVIRA没报毒,因为启发在扫描网页的时候就算看到上述特征,如果发现Google这个关键字,就不会报毒
200_s.gif

总之这个简单的案例说明1)没经过认真动脑人肉写出来的启发规则可能比机器学习出来的规则更愚蠢 2)简单的定位手法就可以找到一些广谱特征侦测点并针对性免杀


也正因为上述这些问题,各大安全厂商开始使用机器学习来参与黑白鉴定和特征的提取

机器学习的特征提取

略过一些神经网络的基本介绍,我们先来想想应该给这个网络提供怎样的训练数据(特征)。将收集到的样本转意为机器学习模型能够“理解”的表现形式是机器学习的一大重点,在安软中常见的事n-gram手段
n-gram在DNA序列研究中早已被广泛应用,在这里,我们可以尝试提取“https://sophos.com/company/careers.aspx”的3-gram特征(每个特征节有3个字符):
['htt', 'ttp', 'tps', 'ps:', 's:/', '://', '//s', '/so', 'sop', 'oph', 'pho', 'hos', 'os.', 's.c', '.co', 'com', 'om/', 'm/c', '/co', 'com', 'omp', 'mpa', 'pan', 'any', 'ny/', 'y/c', '/ca', 'car', 'are', 'ree', 'eer', 'ers', 'rs.', 's.a', '.as', 'asp', 'spx']

特征一旦被转换为这类形式之后,要进一步将其转为数字的表达。这个流程可以用简单的哈希算法来处理。例如我们可以建立一个很长的向量,然后用一些哈希函数将这些特征节一一映射到这些位图上

举个栗子:假设我们建立了一个长度为5的特征向量【0,0,0,0,0】,而特征"htt"映射到第三个槽,那么就给这个槽的计数器加一,这时特征向量就变成了【0,0,1,0,0】,以此类推
不仅仅可以提取3-gram,还可以提取4-gram,5-gram,...总之单个样本就可以从中提取大量所谓的“特征向量”。很多所谓机器学习厂商自称说从百万级别特征中进行学习,大多指的就是这种东西了……我囧
cylance-million-feature.jpg
如上图来自Cylance的PR稿件,宣称它们的算法从数以亿计的样本中提取出超过七百万特征进行学习,哇塞

人工神经网络

深度学习一般来说包含如下三个要素以构建高效的预测模型
1)一个人工制定的网络拓扑结构,每一层根据拓扑结构从上一层获取数据进行混合,再输出到下一层网络
2)一个损失函数,来衡量模型预测结果和真实结果的差距
3)优化损失函数和训练数据集的算法

网络的“层”
层的组成单位是神经元(节点),每个层都有一些可微函数,将上一层的输入数据进行一些基础的变换,然后再输出到下一层
一般这些层可以分成两类,一类将一系列输入的权重值进行混合,另一类则独立处理各自输入的权重并输出

其中,前者被称为dense层,常见于两个相邻层之间神经元呈两两互联的关系的时候。这些神经元会先用自身权重混合输入权重(例如点积),然后输出新的单个权重
后者常见于激活层,其和前一层的神经元呈一一对应关系,通过特殊的激发函数(例如softmax, ReLU, tanh, sigmoid, softplus等等)获得新的输出值。
下图展现了dense层-->激活层-->dense层的一个简单例子
ann.jpg


当然,这样一个简单网络的训练结果往往会发生过拟合的现象。什么是过拟合?这里我借用一下CrowdStrike的一些图进行说明

根据人的体重和臀围可以预测这个人的性别,下图中纵坐标是体重,横坐标是臀围;蓝色代表男性,而红色代表女性

originalset.jpg
假定我们的机器学习算法要分拣红蓝两堆样本,人肉估测之后应该是如下学习结果:
ideal_fitting.jpg
但是很有可能未作特殊处理的机器学习结果会学习出如下“男女界限”
overfitting2.jpg
这样的学习结果虽然对已有数据拟合得很好,但面对新的数据点(例如右下角)就缺乏所谓的“应变能力”,这也是为什么需要极力避免过拟合的原因
这时候就需要交叉验证和正则化来避免这个问题,在上述网络中,可以插入“正则化层”来进行额外处理,或者将这些神经元放置于一些层内(例如L1/L2 regularization)

两种常见的正则化手段是1)dropout 2)batch normalization

其中dropout即给定比率后对层之间的边进行随机丢弃(等效后果就是将一些神经元的某些输入权重清零)。这样可以有效避免让整个网络过分依赖单个神经元
dropout.jpg

左图:dropout前  右图:dropout后

batch normalization则是对输入进行归一化,例如确保每组输入进入这类神经元后,均值为0并且标准差为1。这种手段可以帮助学习算法进一步提高精度并剔除一些偏差样本

此外对输入样本分组进行交叉验证也是避免过拟合的方法之一。例如将输入数据分成k组,训练k-1组,然后和剩余的一组进行验证比对,这样的流程可以重复多次。

(待续)



评分

参与人数 9经验 +20 分享 +2 魅力 +1 人气 +8 收起 理由
诸葛亮 + 1 精品文章
bbs2811125 + 1 版区有你更精彩: )
sfzjn + 1 精品文章
sunnyjianna + 1 除了人气一枚外其他的都无法表达我内心的爱
屁颠屁颠 + 1 版区有你更精彩: )

查看全部评分

cloud01
发表于 2017-9-16 13:06:18 | 显示全部楼层
请问下 像杀毒和机器人都是用的哪些算法。
欧阳宣
发表于 2017-9-16 14:50:00 | 显示全部楼层
我唯一看懂的专业术语就是交叉验证……

光看SOPHOS ML我还以为是VT里面的invincea
欧阳宣
发表于 2017-9-16 14:50:29 | 显示全部楼层
cloud01 发表于 2017-9-16 13:06
请问下 像杀毒和机器人都是用的哪些算法。

你想让作者如何回答?
你发问之前考虑到对方的感受没有?

评分

参与人数 1人气 +1 收起 理由
root1605 + 1 版区有你更精彩: )

查看全部评分

cloud01
发表于 2017-9-16 15:15:18 | 显示全部楼层
欧阳宣 发表于 2017-9-16 14:50
你想让作者如何回答?
你发问之前考虑到对方的感受没有?

开放式回答,我逼你一定要怎么回答了吗?你考虑过我的感受没有!已举报!
191196846
发表于 2017-9-16 15:40:53 | 显示全部楼层
感谢分享~ 虽然看得不是很懂, 学习了!

楼上那位, 你的问题确实需要改下...
ericdj
发表于 2017-9-16 15:56:03 | 显示全部楼层
cloud01 发表于 2017-9-16 13:06
请问下 像杀毒和机器人都是用的哪些算法。

机器学习算法理论上都可以应用
欧阳宣
发表于 2017-9-16 15:58:08 | 显示全部楼层
cloud01 发表于 2017-9-16 15:15
开放式回答,我逼你一定要怎么回答了吗?你考虑过我的感受没有!已举报!

举报啥?我不是灌水不是骂人不是发广告……

你的问题十分空泛,让人不知道说什么好,这你都不能接受么……
JAYSIR
发表于 2017-9-16 16:07:09 | 显示全部楼层
额,AVIRA 那个故事真是。。。
被惊呆了

好不靠谱的感觉

cloud01
发表于 2017-9-16 20:40:42 | 显示全部楼层
欧阳宣 发表于 2017-9-16 15:58
举报啥?我不是灌水不是骂人不是发广告……

你的问题十分空泛,让人不知道说什么好,这你都不能接受么 ...

已举报。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛|优惠券| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 苏ICP备07004770号 ) GMT+8, 2017-10-24 19:18 , Processed in 0.058308 second(s), 8 queries , MemCached On.

快速回复 返回顶部 返回列表