前言
这几天爆火的ChatGPT到处刷屏,又是写诗又是刷leetcode,加上之前打败柯洁和李世乭的AlphaGo,以及在TI上打败人类职业DOTA选手的OpenAI Five,让我们不禁反思,会主动不通过图灵测试的人工智能什么时候会诞生?
2018年华中科大的邹德清教授课题组第一次提出了使用深度学习进行漏洞检测,算是敲开了基于深度学习的漏洞检测领域的大门,自此各种新的方法被全世界的研究者们提了出来。
那么我们最关心的问题也随之被提了出来:深度学习是怎么识别并检测漏洞的?
安全领域中深度学习的现状
软件安全关乎到未来软件行业市场发展,依据目前的挑战和机遇,应制定多层次、多维度、多方位的信息安全策略,提高信息安全保障水平。因此,在严峻的安全形势下,研究安全自主可控的软件安全漏洞检测技术是大势所趋。
深度学习在图像处理、视频实体识别、自然语言处理等领域中已经取得了长足的发展和突出的成果,这自然驱使着安全研究员们将神经网络引入到安全领域中。
区别于相对成熟的CV、NLP等领域,面向源代码的漏洞检测目前没有与之非常契合的神经网络进行特征抽取或表征学习。那么退而求其次,能不能寻找一种合适的源代码表征方式使得现有的、成熟的神经网络来找找漏洞呢?
答案是可以的。
——注:本篇只讨论面向源代码的静态漏洞检测。
基于深度学习的漏洞检测方法论
其他领域中的特征表征方式
利用深度学习的关键步骤之一是需要神经网络能够学习到所输入源代码的特征。在图像识别中,作为输入数据的图像可以以灰度的形式被神经网络所接受。
以手写字识别为例。
该图像为28*28像素的灰度图,每个像素点上的灰度即为我们要输入到神经网络中对应神经元的值,称为activation。这些灰度值通过flatten和concat成为包含784个属性值的向量后,在神经网络中逐层计算传递,最终会激活输出层对应的神经元从而达到识别手写字的目的。
或者以NLP中情感识别为例。
考虑句子
“I am so annoyed”,
将其进行分词变为
“I”, “am”, “so”, “annoyed”,
然后将文本或单词映射到实数向量(embedding)。如词袋(BOW),通过预定义的字典统计句子中的词汇,0表示该词汇不存在于字典中,1表示存在于字典中。如预定义的字典中包括
”happy”, “sad”, “annoyed”, “pissed”, “very”, “little”, “so”,