本文的所有内容与作者的日常工作无关,其观点也仅代表作者个人意见,与作者的雇主无关。

为解决网络安全问题构建数据模型的时候,我们很难找到只用一个端到端的模型就可以解决问题的场景。我们不妨用钓鱼页面检测为例,除了准备和清理足够的输入数据等数据工程工作,它也需要识别页面中例如 logo 等关键图像元素,还需要结合其网页代码的特征与预测结果,有时候还需要结合 javascript 的渲染并对抗一些脚本反制的手段,最后还得提供足够支持运营的证据以及运营策略。这些例子常常让数据科学团队和公司管理层都很困惑,明明每个安全公司都做钓鱼检测,怎么我的这个问题越做越大,越做越难呢?要知道这个问题这么难,当初为什么要做啊?随着时间推移和资源投入的压力,团队和管理层逐渐产生了倦怠甚至悔恨,于是我们看到不少虎头蛇尾浑身补丁的数据模型项目匆忙上线,以及它们带给运营团队无法偿还的技术债。

网络安全领域里问题的复杂属性来自于其对信任(trustworthy)的极高要求,一方面因为其高强度对抗的动态环境,另一方面也因为其验证和错误成本较高。每一个模型预测出的高危告警都需要投入人力运营吗?模型提供的情报 IoC 我敢在防火墙里阻断吗?传统的网络安全求解方法把受过训练的人放在流程中以人的经验保证每一步的信任,但是攻击者也理解这一点,他们除了想出千奇百怪的绕过检测的方法,设计出让防守方能够检测但疲于应对的攻击也是攻击方法研究的一个方向。“如何在信任的链路中减少昂贵的人力”成为了现代网络安全求解方法的一个研究方向,其中用多个独立模型交叉验证的模型框架是其中较为有效的一种方法,简单来说就是用多个独立数据源独立特征向量的模型组成拼图一同解决一个问题。这种方法也可以降低对组合中个体模型的质量要求从而包含尽可能多的弱模型以提高模型涵盖问题的范围,有机会可以单独谈谈,在此不需赘述。这里需要解决的问题是,如何有效的组合多个独立模型以支持信任呢?

结合以上两点要求,我们可以从系统设计角度考虑这个工程问题:既然从头设计一整套模型和工具并且组合多个模型解决某个问题导致的成本太高,不如构建一些领域内的通用模型,它可以解决领域内一批问题中相通的部分,此部分可以是功能模块也可以是问题的抽象部分。通过重用这些模型并构建针对特定问题的特定模型,再加以适当组合,我们可以有效的规模化的解决多个复杂问题。这种方法在网络安全领域内求解复杂问题已被证明十分有效,在别的领域也多少看到一些类似的想法。这些领域内的通用模型可以称之为“有用的无用模型”。

“有用的无用模型”这个名字来自于我和同事的一次谈话,他们说,别的团队都是一个问题用一个模型解决,你们搞的这些模型既不能解决实际问题,做了几年也只有几个模型,不像别的团队每周都能上线两个新的,这几个模型甚至连个准确率误报率都不能提供,这不就是没有用么?作者借由此文向同事们有创意的命名方法表示感谢。

什么是有用的无用模型

“有用的无用模型”是设计解决特定领域问题中相通性部分的一类模型,只有在极其幸运的条件下,它才能立刻解决一个实际的领域问题。

它们有时候被称为奠基石模型。在 Bommasani et al “On the Opportunities and Risks of Foundation Models”*这篇长论文里讨论了图像、视觉、自然语言等领域里深度神经网络的基石模型及其应用方法和效果。深度神经网络可以学习特征的表征(representation),并在多个相似问题中可以迁移其预训练的模型,这让预训练的神经网络只需要较少的代价进行微调(fine tuning)即可将训练结果迁移到同一领域的不同子问题。正如计算视觉领域中利用 ImageNet 小猫小狗图片集训练的基于 ResNet 模型可以通过输入肺部 X 光图片作微调即可有效检测肺结核,网络安全领域中利用 PHP 脚本数据集训练 TextCNN 的 Webshell 检测网络也可以通过微调检测 Powershell 这一 Windows 脚本的恶意行为,这两个迁移任务都使用了深度神经网络对于问题局部特征的有效表征,而“局部特征”是这一类问题的共性部分,所以预训练模型加微调的方法在这两个看似不同的任务中均有良好的表现。当然,微调方法只是预训练模型的一种使用方法,Zero-shot,few-shot 以及最近的热门话题 prompting 也是预训练模型的使用方法。同时,基于网络层权值的微调也是微调的多种方法之一,例如 Transformer/BERT 类的模型其微调也与其注意力机制相关,请读者小伙伴们自行探索,在此就不赘述了。

如果推广预训练神经网络模型的方法到更加一般的情况,我们也可以寻找特定领域所需要的一般特性。例如在分析攻击行为模式时,攻击者做了动作 A 之后还做了什么动作,攻击者在执行动作 A 之前做过哪些动作等,这些原子行为的序列特性是这一领域的一般特性,而序列特性独立于特定分析问题之外,而只依赖于产生序列的数据源,比如命令行日志之间的父子进程关系,或者 IP 外联日志或者 DNS 请求日志记录的 IP 或域名的序列,于是我们可以对每个可以产生序列的数据源均构建行为序列模型,再将其应用到具体的分析问题中。这就是之前文章中提到的 domain2vec 模型的建立方法,它作为一个“无用的模型”通过神经网络学习到域名的稠密向量表示并通过余弦相似度计算出任意两个域名 A 和 B 之间基于访问序列的统计关联。这种关联可以应用到:

  • 发现潜在 DGA 族群:DGA 域名之间有很强序列关联,对访问量长尾部分域名的向量作谱聚类即可;
  • 发现网站背后的 CDN 域名:网站主页与其 CDN 站点也有很强的序列关系,对每个主页域名的向量搜索其高余弦相似度的其他域名即可。
  • XcodeGhost* 与供应链攻击:应用程序的主次域名之间的相似度集合相对稳定,维护此集合的历史并作异常检测即可发现类似 XcodeGhost 等供应链攻击的 C&C 域名。

等等场景,因为篇幅所限不再枚举。domain2vec 模型作为多个场景的基石可以将看似困难的问题转化为简单的计算,这是因为它提供了行为关联的量化计算函数,而这一函数是解决这样一类问题的关键。当然基于序列的行为模式不仅限于域名的稠密向量,它可以是子图模型,也可以是 IP、URL 等实体,而行为模式也不仅是序列这一种。

一些领域内的工具以及构建在此类工具上的模型也可以带来解决问题所需要的一般特性。比如说图数据库和知识图谱等,以及构建在此之上的算法模型,比如排序、链接预测、子图搜索等,在之前的博客文章里也涉及了它们的应用场景。构建这些趁手的工具需要较多的工程资源,与其临阵磨枪,不如未雨绸缪。

总的来说,解决网络安全领域的复杂问题需要奠基石,它可以是特定领域的预训练模型,也可以是更为一般的提供某种特性的计算函数,也可以是趁手的工具及部分解决问题的算法。越来越多的奠基石不仅可以有效的降低解决复杂问题的门槛,也可以鼓励拥有奠基石模型武器库的数据科学家仅付出较小的失败代价即可勇敢的探索解决问题的新方法。从系统工程的角度来看,每个“无用模型”都可以长期投入足够的数据仓库和工程优化资源,并交由优秀的工程团队开发支持其在生产环境的质量。作者本人也很惊讶于 domain2vec 这个 2014 年创建的模型保持维护和后续开发,在六七年后的今天仍然持续发现新的威胁情报,并不断有新的应用场景架设在它的基础之上。

寻找和使用“无用模型”的方法

虽然有的模型可以靠灵光一现来发掘,但灵感不是想有立刻就能有的。这里有一些科学方法上的建议供大家参考。以下提到的科学方法都是研究工作中的常规方法,作者在此用网络安全领域的案例介绍给大家重新认识一下。

归纳和演绎

归纳(Inductive reasoning 或 Induction)和演绎(Deductive reasoning 或 Deduction)是科学方法的核心之一。归纳可以通过对客观世界事物的观察总结出一般的概念,例如多数入侵事件都需要侦查、武器化、分发、利用、植入、C&C和执行等步骤,人们归纳出网络杀伤链(cyberattack killchain)的概念;演绎从逻辑判断出发逐步拓展到解决问题的模型,例如 C&C 行为出现在利用和植入之后,那么对 C&C 的检测之后需要寻找时间线上有利用和植入特征的更早的行为,我们通过构建含时间属性的事件知识图谱并通过链接预测的方法自动完成该任务。

在广泛涉猎并深入理解领域内的问题后,归纳可以帮助我们有效的发现问题的某些相通点,如果足够深入(同时也有一些运气)的话,归纳甚至可以找到多个问题间的根本相似性。例如上面提到的 domain2vec 域名序列关联模型,它基于的观察事实是:

  • 多数网站使用固定编码的 CDN 域名,随着首页的加载, CDN 域名的请求也会发送到 DNS 服务器
  • 使用 DGA 算法的恶意软件会批量发送多个 DGA 域名请求
  • Chrome 等现代浏览器会提前缓存页面上的部分链接,它也会发起多个 DNS 请求
  • 恶意软件的 C&C 域名一般不会和别的合法域名有上下文关系(并非完全)

等等。通过思考和理解我们发现这些事实相通的部分在于,DNS 请求序列有一定的关联,而市场上缺乏描述和计算此类关联的函数,如果可以提出这一计算函数,我们可以解决很大一批问题。这就是通过归纳得到 domain2vec 模型需要解决的问题的过程。聪明的小伙伴们可能已经想到,IP、URL 是不是也遵循类似的规律呢?是的,这也是“演绎”的一个例子,在推广到 ip2vec url2vec whatever2vec 模型的过程里,也请留意特定实体行为的特性。当然,演绎可以应用于多个方向,比如,有没有别的问题也可以用到该关联计算函数?该计算函数的频谱特性会不会带来别的应用场景?有没有别的关联计算函数可以带来别的频谱特征?等等问题。归纳和演绎两种方法在思考过程中可以反复迭代,这是一个很有意思的过程,更多的练习留给各位聪明的小伙伴自行探索。

值得注意的是,归纳得到的只是概念,这导致了它可能十分主观和务虚,例如缺乏科学训练的人往往喜欢把事务都归结到他们听说过的几个基本原理,而黑体辐射、人性与热力学第二定律的结合并不是个可以应用到解决网络安全问题的合适模型(不是开玩笑,我真见到有人这么做!)在归纳过程中试图演绎可以保证了归纳的正确尺度和方向,毕竟 More is different *(多者异也,不同尺度和规模的问题需要不同的解决方法)。正如费曼关于如何发现新的物理理论时说的,”首先需要发现它,然后尽可能的推广它,并用实验事实证伪”,只有可以推广并走向解决问题的方向的模型才是归纳的合理尺度。同样,归纳的结果也有可能是只适用于小范围内的经验,演绎可以通过推广这个经验直到其失效以测试其适用范围。

一点补充说明,这里的归纳并非“数学归纳法”。事实上“数学归纳法”并不是“归纳”而是演绎推理的一种方法。

ab initio 与思想实验

即使每天身处于需要解决的问题之中,我们也不能保证可以轻易的归纳这些问题的相通性,毕竟现代科技和社会组成造就了这些复杂的问题。这里有一个实用的建议:“ab initio”。“ab initio” 是量子物理专业中切入解决问题的一种方法,大家可能对它最近的热词化身更为熟悉:第一性原理(First Principle)。无论它叫什么名字或者从哪头开始,其方法在于排除不必要的假设

在求解问题时,拥有足够必须的假设可以有效的限定问题的求解范围,但是有些假设并非必须,它们可能是由历史经验带来并混淆与其他假设之中,往往会对解决问题造成阻碍。当人们在商业模式中提到第一性原理时常用的例子是,硅谷钢铁侠马斯克利用第一性原理分析发射火箭的成本,然后发现回收火箭其实是可行的,只是因为历史上对航天局发射模式的成本考量使得对回收的研究不足,于是他就开始回收火箭。在网络安全领域里,多数厂商将检测恶意样本作为其首要功能,针对恶意软件检测的对抗也持续了几十年。而在云计算的时代,很多攻击行为开始使用无文件攻击等方法,迫使传统厂商仓促的增加更多的检测目标。能够成功捕获恶意软件样本固然重要,但云平台可以收集更多日志种类并针对相关行为模式的建模,“依赖捕获恶意软件”逐渐成为不必要的假设,这也让云计算时代的安全走向行为建模为主的道路。另一个有意思的例子还是来自于 domain2vec 模型,它脱胎于 word2vec 这一 NLP 模型,但是作者观察到该模型里“使用自然语言作为输入”是个不必要的假设,于是将其替换为“DNS 请求的域名序列”并加以调整优化。这些例子都是勇于排除不必要的假设的成功案例。当然,如果发现去掉某些假设导致问题更难了,这也有可能是发现了必要的假设,我们也可以围绕该假设继续探索。

在排除不必要的假设之后,我们可以将多数复杂问题化繁为简,那么对比这些问题的简化版会更加容易去发现其相通性。在前文中提到的工作 “Honeypot + graph learning + reasoning = scale up your emerging threat analysis” 中使用链接预测的办法自动证明两个 URL 有确切一致的恶意行为,其方法也是与上文提到的基于时间线寻找 C&C 与利用/植入特征的方法一致,因为这两个问题都是通过寻找知识图谱中的链路推断关联特性,而其实体类型和实体之间关于时间的偏序关系在这类问题上均为非必要假设。于是我们在这一组问题上总结出”链接预测就是其相通性“,构建并优化一个较为通用的链接预测算法工具包就是合理的选择。

在得到一系列解决相通问题的“无用模型”后,数据科学团队不仅有足够的信心解决当前的问题,甚至会有足够的勇气去探索新的问题。在使用这些模型的时候,我们不仅有来自灵感的好主意,也可以使用思想实验(thought experiment)的办法寻找更为可行的好主意。思想实验也是物理专业常用方法之一,简单来说就是将抽象简化的事物在想象力里运行起来并观察其运转,例如“薛定谔的猫”就是最著名的一个思想实验。在网络安全领域里,思想实验的例子也有很多,例如在前文中提到的,攻击者需要通过实验 N 个漏洞对应目标中 K 个利用方法,总结若干轮的失败实验并得到正确的漏洞利用顺序,其思想实验可以是,有编号 1 到 N 的小球按照顺序扔进 K 个坑,由其反弹的方式判断错误的类型,由此使用不同的策略以期望尽可能少的反弹,如果用主动学习的办法怎么扔,如果用 mastermind 的策略该怎么扔,如果用 multibandit 的策略该怎么扔,它们分别会遇到哪些反弹方式,哪些策略可能更好?这些都可以由思想实验的方式在脑中自我对弈并总结出后续思路。

在使用“无用模型”的框架时,我们可以利用思想实验在想象中模拟 A 模型与 B 模型以及 C 模型等的组合方式,并引入特定领域问题的一些假设,由此规划出问题求解的方案。“Honeypot + graph learning + reasoning = scale up your emerging threat analysis” 这个工作的标题通过加号表达了这一思想实验的过程:“无用模型 A”图嵌入模型可以得到两个 URL 在 HTTP 流量中序列和 host 等关联特征,相当于两点之间虚线连接;而“无用模型B”推理模型可以寻找任意实体节点中可能存在的推理链路,相当于在图中绕了一圈路取道多个其他节点得到的实线连接;加上蜜罐数据的筛选限制了图谱中实体的类型降低了搜索成本和推理时产生歧义的风险,“寻找实线连接证明虚线连接的模型组合”即为求解方案,于是这些组合凑到了一起解决了这一领域问题。在这里必须提到的是,这些奠基石模型的组合提供了巨人的肩膀,我们也需要针对问题的特殊性在肩膀之上构建符合该问题的输入数据和后续模型以完善解决方案。

当然,ab initio 和思想实验等不仅限于以上的使用方法,这些方法本身也没有智力门槛也并非高深的武功秘籍,只要多加练习,大家都可以熟能生巧。同时,聪明的小伙伴可能已经发现了,ab initio 和思想实验以及其他相关的办法也是归纳演绎这一基本方法的实践套路,当我们反复实践探索这一方法,我们也会形成更多适合自己工作领域的套路。

技术之外的建议

“无用模型”从来不是自上而下设计得出的,它需要数据科学家和安全研究员深入理解领域问题并在解决问题的过程中归纳演绎得出。得到这些模型需要时间成本,构建这些模型往往需要较多的工程成本,所以作者在此有一些技术之外的建议。

寻找你的第一个“无用模型”的路程可能会比较艰难,从业界已有的例子中学习可能是个好方法,多看不同行业的论文并与脑海中保留的业界问题碰碰运气,也许会有不错的结果;几乎没有一个“无用模型“会在一开始就达到完美的状态,所以不用着急过早的工程优化,在模型初期可以考虑多找一些领域内的问题并试图解决其一小部分,这已经是很大的胜利了;每一个“无用模型”都需要找到一些有用的样板问题以阶段性展示其有用的一面,这不仅会帮助我们更深入的探索,也可以帮助这个模型寻找到可持续的资源投入。

总结与后记

网络安全团队常面临这样的两难境地,一边是一堆解决不了的问题,一边是绞尽脑汁想不出来新的办法去解决问题,作者希望本文能够从科学方法的角度带来一些启发。复杂问题的复杂来自于多方面,本文通过构建通用模型部分解决相通部分的方法试图解决的是由规模和多样导致的复杂,同样,本文的方法也不是解决这类复杂性的唯一有效办法,更多的解决其他复杂性的其他办法留待各位继续探索。

关于构建可以部分解决问题的领域通用模型这一想法来自于作者在若干年前与 360netlab 关于域名关联模型 domain2vec 以及其他图模型的一次谈话,好友宫一鸣将这个脱去 NLP 的外衣应用到网络安全领域的思路称之为“跨界”,这启发了作者将这一“跨界”思路延伸推广的探索工作,在此感谢 360netlab 团队的讨论以及宫一鸣老师请吃的铁锅炖大鱼。授人以鱼也是可行的!

参考文献