本文的所有内容与作者的日常工作无关,其观点也仅代表作者个人意见,与作者的雇主无关。
近年来网络安全从业者纷纷神往机器学习的魔力,加之深度学习在图像、NLP等领域的成功,大家都想在此寻求一发银弹。不过作者在安全业界没有看到太多如虎添翼的机器学习案例,更多的是对生产环境里金玉其外的模型效果的失望,“模型误报太多了,运营没法处理”,“就这两个独检结果还不如我写两条规则”,“PPT上说深度学习、自我演化,实际都是 if-else”等等。为什么机器学习解决网络安全问题总是失败呢?
机器学习模型在解决网络安全问题时效果不好的原因大致可以归结为这几类:
我们先从特征空间和样本标记谈起。
图像识别问题的特征就是一张张图里的像素,NLP特征就是文本里的文字,那么网络安全类的特征就是每一条 WAF 攻击记录的字符,每一个恶意软件二进制文件的字节码,这样对吗?
合理的描述问题本质的特征空间可以让模型轻松解决问题,而错误的选择了特征空间会让问题难度成倍上升。不妨看这个例子:如果问大家,心算 5765760 加上 2441880 等于多少,任何一个学过基本算数的人都会毫不费力的答出 8207640。但如果是心算 5765760 乘以 2441880 呢?这几乎可以难倒一片小伙伴。这是因为十进制不是乘法友好的表示方法,因为我们选错了特征空间,所以问题就人为的变难了。对乘法更友好的表示方法是因式分解,如果把题目换成“ 11*12*13*14*15*16
乘以 17*18*19*20*21
“这个等价问题的话,它的答案甚至比之前的加法还简单。
一个异曲同工的例子是 malconv
深度学习检测恶意软件,类似的基于字节码的卷积方法并不能学到正确的特征空间。Raff et al 等作者的 “Malware Detection by Eating a Whole EXE” 使用二进制文件本身作为输入,试图利用卷积网络从 010101 这样的原始字节码特征空间构建一个端到端的恶意软件静态检测分类模型 malconv
,它在自己论文的测试集上可以达到 90% 以上的 AUC。然而,抛开其对新样本和对抗样本检测时极不稳定的表现,“DeepMalNet: Evaluating shallow and deep networks for static PE malware detection” 这篇文章引入新的测试集对比了 malconv
等多个深度模型以及论文作者自建的随机森林模型后发现,通过手工构建特征工程的随机森林模型也几乎可以达到并超过 malconv
的效果。究其原因,卷积网络在原始字节码上并不会学习到合适的特征空间,论文中展示的有效性更多是碰巧的结果。Fireeye 的研究人员 Coull et al 的文章 “Activation Analysis of a Byte-Based Deep Neural Network for Malware Classification”表明了 malconv
的卷积结果其实是把静态二进制文件的文件头信息当作当作主导特征,而由指令跳转组合对模型预测分类的权重极小,其后续改进 EMBER malconv
也延续了类似特性,具体的分析和解释可以参见 Bose et al “Explaining AI for Malware Detection: Analysis of Mechanisms of MalConv”。如果加以使用一定的领域知识工具,比如获取函数导出表、利用一些动态特征比如沙箱采集的函数调用序列,或者使用静态反编译得到指令集序列,将原始二进制转换到这些更能表征软件运行时行为的特征空间当作输入数据集,其机器学习模型的表现比 malconv
类仅用字节码卷积方法的稳定的多,分类效果也更好,请有兴趣的小伙伴阅读相关参考文献并继续调研。
同样的道理,我们也不能期望有一个精准的端到端的模型在不需要切分和筛选 token 的情况下,仅基于原始的 WAF 记录即可预测攻击,也不能期望一个模型学习到 DGA 的字符组合方式并精确分类甚至生成新的 DGA 域名,更不能幻想有一个深度学习模型读入任意 HTTPS 数据流即可精确预测其对应的网站。市面上的机器学习模型在解决这些问题上的失败均证明了选择合适特征空间的重要性:模型在错误的特征空间上可能因为碰巧适应特定数据集而产生所谓“好结果”,但这些结果不够稳定也远不足以支撑生产环境和产品的质量。
大家经常提到的“机器学习”指的是基于样本的统计学习,它学习的结果是样本在其特征空间分布的统计期望。我们可以借用一句古诗“横看成岭侧成峰”来理解特征空间对模型判别的影响。如果特征空间并不能描述造成样本分布的本质原因,其特征的数值分布就不能提供足够的判别能力,直观地说,模型只能“横看”到一连串的“岭”而不能“侧看”独立的“峰”,那么模型顶多在“岭”上大概划分个差不多的样子以适应现有数据集,于是,它“不识庐山真面目”的丢失了“峰”所代表的实质特征。
特征空间与样本标记方法也有关联。基于样本的统计学习有一条实战经验,再好的模型也只能尽可能学会人工的标记。网络安全从业者常常认为,“模型只能学会我规则标记的样本,要这破模型有何用呢?” 据本文作者观察,很多模型的工作均掉入“标记样本仅为标记原始样本”这一误区,而有经验的数据科学家会标记与表征空间对应的样本,它可以是原始样本在新空间的映射,比如各种关联图模型里学习到的向量表示,也可以是原始样本的拆分,比如基于汇编码区块的恶意文件检测等,这些合理的样本选择和标记跳出了原始样本的局限,并使用更简单可靠的模型解决问题。
有些特征显而易见,有些特征需要绞尽脑汁。“岭”和“峰”的区别不仅限于同一个数据集里的特征选择或者特征超平面的转换,更重要的抛开“显而易见”“想当然”的特征,寻求能够描述样本分布本质原因的特征。一个典型的例子是前一篇博客“为什么 LSTM 检测 DGA 是无用功”里提到的一类 LSTM 检测 DGA 的算法,它们的特征空间为每个域名的相邻字符串组合,LSTM 模型事倍功半的去拟合可以产生这些相邻字符组合模式的未知函数,这远远超过了 LSTM 这个浅模型的学习能力。事实上,现在还没有一个足够聪明的网络结构可以在小数据集上学习到包含异或、移位等复杂操作的函数。多数 DGA 的本质特征为由 DGA 算法产生域名序列,按照多个域名的序列映射到嵌入空间或利用其共同出现的概率可以更好的对其行为建模,利用简单的图嵌入模型或者邻接矩阵计算即可达到很好的 DGA 检测效果。
寻找正确的特征空间并没有一劳永逸的办法,暂时也没有更高的人工智能的辅助或自动化,它需要的是数据科学家对现有模型的分类原理有深入的理解,也从数据模型的角度对安全领域的基础知识有根本的认识。因为本文作者看到过太多建立在错误的假设和特征空间的工作,所以建议数据科学家在头脑中保留这个问题并在解决问题过程中反复提醒自己:
”这个特征空间可不可以表征问题的实质?“
网络安全方向的数据算法模型不像机器视觉类问题有清晰直接的样本定义。它更像语音和空间控制类的问题:它要求该领域的数据科学家对领域知识有更深入的了解,探寻 可以表征问题实质 的特征空间,并聪明的将问题从其表面映射到实质的特征空间。加以合适的样本标记方法描述这些特征的分布,而非迷信深度学习带来天降神力,我们可以找到更合适办法去解决问题。
本文分析的是网络安全方向的建模在算法方向上失败的主要原因,我们还有若干话题,比如从系统上理解和处理模型的脆弱性等等,这些在以后的文章里都会谈到。不只是网络安全从业者,很多领域的研究人员和工程师也过分专注于模型本身,而忽略了建模是个系统工程问题,寻找更多更好的样本、更能描述本质的特征、对预测错误的处理等都是这个系统里重要的步骤。本文作者希望由此提起大家对系统和工程的关注,让机器学习和其他人工智能算法在网络安全领域发挥真正的作用。
领取专属 10元无门槛券
私享最新 技术干货