就在最近,一些科技公司对于”机器学习”的热衷程度达到了疯狂地步。他们纷纷表示”机器学习”能解决过去只有人工解决的问题。有些公司甚至直接将其称之为”人工智能”。机器学习对IT安全领域有着特殊兴趣,后者瞬息万变而我们也需要想出妥善的解决方案。
有些公司之所以将机器学习称之为”人工智能”,完全是为了自身的利益考虑。
技术归根结底就是速度和一致性的概念,并没有什么其它技巧。机器学习基于技术,使其容易以人类语言解释。那么,简单来说:我们利用工作算法(基于机器学习的算法)解决一个实际的问题。这个概念其实相当简单,并能带来真正有价值的洞见。
问题:区分有意义的文字和乱码
人类正常写作(Terry Pratchett著作摘选),看起来就像这样:
Give a man a fire and he’s warm for the day. But set fire to him and he’s warm for the rest of his life
It is well known that a vital ingredient of success is not knowing that what you’re attempting can’t be done
The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it
dfgldfkjgreiut rtyuiokjhg cvbnrtyu
乱码看上去则像这样:
DFgdgfkljhdfnmn vdfkjdfk kdfjkswjhwiuerwp2ijnsd,mfns sdlfkls wkjgwl
reoigh dfjdkjfhgdjbgk nretSRGsgkjdxfhgkdjfg gkfdgkoi
我们的任务正是开发能分辨这两者区别的机器学习算法。
尽管对于人类而言再简单不过,但对于计算机而言却是一项十足的挑战,需要花费大量精力和时间将这些区别进行形式化。这里我们要用到机器学习:需要为该算法提供一些例子,让其”学习”如何可靠地回答这个问题,”是人类文字还是乱码?”这就好比现实世界反病毒程序每次分析一个文件时的情形。
由于我们是在IT安全的背景下谈论这一主题,因此反病毒软件的主要目标是在大量干净数据内找到恶意代码,因此我们将有意义的文字标为”干净”,将乱码标为”恶意”。
这对于人类来说实在简单:他们能立即辨认出哪个是’干净’,哪个是’恶意’。但将这种区别进行形式化或向计算机解释却着实是件难事。因此,我们这里使用机器学习:我们给这种算法提供一些例子,让它从中学习,如此便能提供问题的正确答案。
解决方案:使用一种算法
我们的算法能计算某个特定字母跟在另一特定字母后的频率,从而分析出所有可能的配对。例如,第一段话”Give a man a fire and he’s warm for the day. But set fire to him and he’s warm for the rest of his life,”,显然属于”干净”一类,特定字母配对的频率如下:
Bu — 1
Gi — 1
an — 3
ar — 2
ay — 1
da — 1
es — 1
et — 1
fe — 1
fi — 2
fo — 2
he — 4
hi — 2
if — 1
im — 1
为了更简化一些,我们特意省略了标点符号和空格。因此,这段文字中,a后面跟n出现三次,f后面跟i则出现两次,而a后面跟y出现了一次。
在这一阶段,我们知道一段话不足以让模型学习:我们需要分析比这多得多的文字。首先在《飘》(玛格丽特·米切尔著)里计算字母配对—或者更精确地说,在这本书的前20%章节。计算的配对结果如下:
he — 11460
th — 9260
er — 7089
in — 6515
an — 6214
nd — 4746
re — 4203
ou — 4176
wa — 2166
sh — 2161
ea — 2146
nt — 2144
wc — 1
如你所见,碰到he字母组合是an字母组合概率的2倍。而wc则只出现了一次(就是newcomer这个词)。
那么,现在我们有了干净文字的模型?那我们该如何使用呢?首先,要确定一行文字是干净或恶意的可能性,我们需要规定其确实性。我们将利用模型(通过评估字母组合的现实性)明确各种字母配对的频率,随后将这些数字相乘:
F(Gi) * F(iv) * F(ve) * F(e ) * F( a) * F(a ) * F( m) * F(ma) * F(an) * F(n ) * …
6 * 364 * 2339 * 13606 * 8751 * 1947 * 2665 * 1149 * 6214 * 5043 * …
在确定确实性的终值中,我们还需考虑每行文字的符号数量:一行文字越长,则越多的数字相乘。因此,为了让这一数值同等适用于短行和长行,我们运用了一些”数字魔法”。(我们从结果中对”上述行长度减一”程度开方)。
使用模型
现在我们可以得出部分结论:计算出的数字越大,则上述行与我们的模型更匹配—结果是人类书写文字的概率越高。如果这段文字计算出的数字很高,则称其为干净。
如果上述行中可疑地含有大量罕见组合(比如: wx、zg和 yq等),则恶意的可能性更大。
对于我们用来分析的行来说,我们测算出的分数(”确实性”)如下所示:
Give a man a fire and he’s warm for the day. But set fire to him and he’s warm for the rest of his life — 1984 points
It is well known that a vital ingredient of success is not knowing that what you’re attempting can’t be done — 1601 points
The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it — 2460 points
DFgdgfkljhdfnmn vdfkjdfk kdfjkswjhwiuerwp2ijnsd,mfns sdlfkls wkjgwl — 16 points
reoigh dfjdkjfhgdjbgk nretSRGsgkjdxfhgkdjfg gkfdgkoi — 9 points
dfgldfkjgreiut rtyuiokjhg cvbnrtyu — 43 points
如你所见,干净行得分普遍大大超过1000分,而恶意行甚至很难过100分。似乎我们的算法如预想的那样准确工作。
就给段落文字评高低分工作而言,最好的方式是将这项工作委托给机器,然后让它学习。为此,我们需要提交大量真实的干净行并计算这些行的确实性,然后再提交一些恶意行并重复相同的工作。随后,我们就能计算出评价基准。在我们的案例中,基准在500分左右。
现实中应用
让我们再复习下刚才谈到的内容。
1.规定了干净行的特点(例如,字符配对)。
现实生活中,在开发反病毒软件时,分析人员同样要规定文件和其它目标的特点。顺便提下,人工的贡献依然重要:在分析中规定哪些特点需要评估依然是人的工作,而研究人员的专知和经验水平也直接影响特色的质量。例如,是谁说需要分析一对字符而不是三个字符?这样的假设同样需要在反病毒软件实验室内评估。我想说,我们在卡巴斯基实验室使用机器学习选择最佳且具有互补性的特色。
2.我们使用规定的指示器构建数学模型,并基于一整套例子使之学习。
3.我们使用简单的数字模型计算确实性评分。
坦白说,现实生活中我们实际操作恰恰相反:我们计算’恶意’评分。可能看起来并不那么复杂,但可以想象,如果采用另一种语言或字母表的话,文字行在我们模型中的不确实性将达到怎样的程度。但如果反病毒软件在检测到一种全新的文件时,只是因为之前从未碰到过就报错的话,这显然难以被接受。
机器学习的替代方法?
大约在20年前,恶意软件还是稀缺物的时候,”乱码”能很容易因签名(独特分段)而检测到。而在上述例子中,签名看起来可能就像这样:
反病毒程序扫描文件并发现erwp2ij后会猜想:”啊哈,这是第17号乱码。”在发现 gkjdxfhg后,则会标记为第139号乱码。
而在大约15年前,随着恶意软件样本数量的大幅增加,”泛化”检测占据了主要位置。病毒分析员明确了运用于有意义文字的规则,就像这样:
1.一个单词的长度通常在1-20个字符之间。
2.大写字母和数字很少置于一个单词中间。
3.元音字母相对均匀地与辅音字母混合到一起。
等等诸如此类。如果一行文字无法符合大部分这些规则,则被检测为恶意。
从本质上讲,原理大致相同。但在我们的案例中,这套规则必须由分析人员手写,取代数字模型。
之后大约在10年前,恶意软件样本数量呈爆炸式增长,远远超过了此前的想象水平,机器学习算法开始慢慢探索其融入反病毒程序的方式。首先,就其复杂性而言,已远远超出了我们之前作为案例描述的初级算法的范围。但当时,我们积极招募相关专家并扩大我们的专知。结果,我们的反病毒软件在各同类产品中达到了最高检测水平。
如今,任何一种反病毒软件都离不开机器学习。比较各种检测方法,都是将机器学习与一些高级技术(比如:行为分析)配合使用。但行为分析的确在使用机器学习!毕竟,机器学习对于有效的安全保护必不可少。
缺点
机器学习拥有众多优势—但是否就能解决一切问题呢?显然并非如此。如果上述算法能通过分析大量干净和恶意目标而在云或某些基础设施中发挥作用,这一方法就算能有效工作。
此外,这也有助于让专家团队监视这一学习过程,并在每次经验出现不同时予以干涉。
这种情况下,才能将缺陷降至最低— 但也有一个缺点:需要昂贵的基础设施解决方案和高工资的专家团队。
但如果相关负责人希望大幅削减成本并只使用数字模型的话,但就产品方面而言,情况可能会变得很糟。
1.误报
基于机器学习的检测总是需要在检测目标和误报水平之间寻找一个理想点。如果我们希望启用更多检测,则最终导致更多误报出现。使用机器学习,可能会出现在你从未想象或预测到的地方。例如,干净行”Visit Reykjavik”可能会被检测为恶意,在确实性评分中只得到了101分。这也是为什么反病毒软件实验室有必要保存干净文件记录以启动模型学习和测试的原因。
2.绕过模型
不法分子可能会搞来这样一种产品,然后观察其工作方式。犯罪分子是人类,因此比机器更具创造力(如果不是智能),并会不断做出改变。比如,下面文字行被认为是干净,尽管其第一部分明显(用双眼就能辨别)是恶意:”将dgfkljhdfnmnvdfkHere扔进一堆干净文字中,很容易误导机器。”尽管这一算法如此智能,聪明的人类却总能找到方法绕过去。这也是反病毒软件实验室为何需要高反应度的基础设施,对新出现的威胁即刻作出回应。
这三幅漫画很好地诠释了上述数字模型是如何被”愚弄”:有些文字看起来是确实的,但事实上却是”乱码”。资料来源
3. 模型升级
在对上述算法的描述中,我们提到了从英语文字中学习的模型无法适用于其他语言文字。从这一角度看,恶意文件(假设由人类创建,人类显然能跳出固有思维)如同一个不断演变的字母系统。那威胁趋势就会变得相当不稳定。经过多年的研究,卡巴斯基实验室设计出一套平衡方法:直接在我们的反病毒软件数据库内一步步升级我们的模型。这也能让我们在不中断模型日常运行的情况下,进行额外学习甚至对模型学习角度的完全改变。
结论
除了重视机器学习并认同其在网络安全领域的巨大重要性,我们卡巴斯基实验室认为最有效的网络安全方法是基于多级范例。
反病毒软件理应在各方面做到尽善尽美,无论是行为分析还是机器学习,又或是其他方面都应如此。有关其他方面的内容,我们将在下次做详细讨论。