不得不说最近两年, AI 让各个领域发生了很大的变化。它极大的改变了我们的工作方式,同时也让我们能够穿透那些不重要的东西去接触到问题的本质。比如拿编程举例,一些人可能早早就已经意识到学习编程重要的并非学习各种语言的语法,甚至算法与数据结构都没有那么重要,而是一些更加“工程”的东西。但是这个东西是什么?我说不清楚,也许叫架构,也许叫体系,而在各种code agent出现后,大家又用harness称呼。总而言之,由于 AI 的出现,我们比之前任何时候都能更容易的直面问题的本质。
笔者作为一个仍然十分关注免杀领域的安全研究人员,自然也往往会思考终端对抗的本质这种问题。正如当年接触渗透时看到的名言“渗透的本质是信息搜集”那样,在终端对抗领域深入研究后我也意识到,终端对抗的本质是成本的对抗。 AI 会改写这一判断吗?不会,底色仍是成本博弈;但它急剧重塑了攻防双方在成本上的结构与节奏:同样的目标,双方要付出的人力、时间与试错代价,以及这些代价随迭代变化的方式,都已和几年前不可同日而语。
那么终端对抗的成本是什么?
这里的“成本”,主要指时间与人力的消耗。为了避免空泛,我用三个可观察的量来描述成本:第一,开发周期,即从产生需求到第一次能用所需的时间;第二,迭代周期,即从一次暴露或失败到再次恢复可用所需的时间;第三,单次迭代人力,即每轮迭代需要投入多少人、多少工时。而对抗中的“胜利”并未是哪一方更聪明,而是双方在对抗循环中的迭代周期与单次迭代人力发生了系统性变化:当一方能把迭代做得更快、更省人力,它就更可能在长期对抗中占上风。
我们先回顾一下传统的对抗方式。在传统模式里,攻击者首先会辛苦地写一套远控代码。刚开始使用的时候,这套代码通常没有任何问题,但等到使用次数多了以后,这个东西就会被抓到并被检测出来。
安全厂商会针对它提取一些特征,把这个东西标记出来。之后如果攻击者再使用这段代码,就会直接被查杀。
基本上就是这么个逻辑:
- 提取特征码
- 进行标记
- 实施查杀
任何厂商的方法基本上都是围绕着特征码去设计的。当然,也会有一些启发式的查杀,包括机器学习查杀等,但那些都不够准确,也有各自的弱点。核心仍然是特征。在这个时刻,实际上安全厂商是占有优势的。因为开发一套木马所花的时间很长,去测试找到特征并修改也很麻烦,而提取特征码的工作非常短,也很简单。这样的话,比如用户报出来有这么个东西(当时可能不一定是恶意软件,可能就是病毒之类),安全厂商在报出病毒后进行标记,随后就能实现查杀。
在这一阶段,安全厂商的成本更低,安全厂商更有优势。
那么对应的逃避特征码的技术就是内存加载。不管它叫什么,反射也好,sRDI 也好,或者什么 Shellcode 加载也好。其原理就是把你写好的代码进行加密/编码,然后在内存里解密并直接执行,这样规避了静态的特征检测。这样做相当于让原本带有特征的代码只存在于内存之中,让你能够重用原来的代码,从而降低了使用成本或者说免杀的成本。因为在以前,为了免杀你可能得重新写一套不带特征的代码,或者去定位并处理特征码;而现在,你不需要再处理特征,直接在内存里解密运行即可。即便代码本身带有特征,由于它不在磁盘上,杀毒软件也查不到。
所以到这一刻,形势就转变了,变成了攻击者领先,而安全厂商落后。
在写到这儿的时候,我们要再了解一个东西,叫做“安全边界”。
简单来说,就是要画一条界线:什么情况下是安全,什么情况下是危险。
以微软为例,微软明确表示不将 UAC(用户账户控制)视为安全边界。其本质原因在于:
- UAC 的绕过点太多并且由于历史原因难以处理。
- Windows 管理员权限的健全性设计存在不足。
这就导致了他们无法将 UAC 作为有效的安全边界。
在终端软件对抗领域,情况也是一样的:
- 现状:现在的安全软件本质上做不到主动阻止恶意程序的行为。
- 模式转变:它们只能先做到发现,然后进行查杀。
这个我们要从 IDS 和 IPS 讲起:
-
IDS (Intrusion Detection System) 入侵检测系统。它的核心是一套“发现”系统,即通过软件监测并发现设备是否被入侵。
-
IPS (Intrusion Prevention System) 入侵阻止系统或者说主动防御。它倾向于主动防止入侵,比如直接阻止恶意软件的恶意行为。
主动防御系统会在软件执行时监测其行为,当你调用恶意的函数时,它会直接阻止调用,之后再进行查杀。但在现在的时代,要做 windows 上的主动防御其实已经基本上不可能了。这主要是技术层面的限制,或者说权限的问题。微软作为操作系统厂商,并不支持这种做法,也没有提供相应的接口,相反为了安全,微软还极力地防止各种第三方入侵并修改内核。微软现在允许做的是 EDR(本质上也是一种 IDS),即检测设备上是否有被入侵的痕迹。
EDR 跟 HIPS 的区别在于,主动防御会在调用函数的那一刻拦截调用,而 EDR 只会在行为发生后进行处理。那么从主动防御到 EDR,我们可以看到安全厂商的安全边界发生了一次后退。这个后退的具体表现是:从主动阻止软件执行,后退到了“发现并响应”。
因此情况就是这样的:当厂商们发现“主动防御”作为安全边界已经不合理了,所以必须进行安全边界的后退或后移,最终退守到了“发现并查杀”这一边界上。这就是很多 EDR 对勒索软件无能为力的原因。因为勒索软件本质上就是读取文件、加密、然后写回,这种行为很难被判定为完全恶意;但从结果来看,它确实又是恶意的。你很难对这种行为做一个立刻的阻止,通常只能先发现它,然后把该软件标记为恶意。但对于勒索软件来说,当它完成加密的那一刻,攻击者就已经胜利了。所以说,勒索软件的这种胜利是一种结构上的胜利,而不是技术上的。
我们再回到话题,刚刚说到了攻击者开发的内存加载技术,在一定程度上能够逃避特征码的查杀。在这之后,安全厂商也做出了一些改进,接下来的技术进步主要是围绕着内存查杀展开的,包括:
- 栈回溯
- 攻击者使用的 Sleep Mask 技术
- 调用栈检测等一系列技术
- 本地沙箱 / 云沙箱
然后安全厂商会结合各种遥测数据以及大量收集的样本,对样本进行狩猎,就达到了当前的状态。这让对抗又变得相对平衡:厂商难以发现样本,而攻击者难以复用之前的代码。
拿使用 Cobalt Strike 举一个实际例子:
- 攻击者用 Cobalt Strike 做了一个内存加载,弄了一个加载器,刚开始它是免杀的。
- 当攻击者把木马放出以后,它会开始被各种沙箱不断地跑。虽然沙箱对抗是另一方面,但我倾向于认为,不管你做哪些检测沙箱的预备,这在某种程度上都是一种对抗。
- 在这个对抗过程中,我们假设攻击者和安全厂商是势均力敌的,最后攻击者的木马可能会被跑出来,也可能不会。如果是技术水平高的攻击者,那么在1,2,3这个阶段是攻击方更占优势。
但问题在于当攻击者的木马被发现查杀、需要去修改它做免杀的时候,挑战就来了:
- 攻击者还是要去定位特征,然后修改特征。
- 在做免杀的过程中,攻击者就是处于下风的角色,也就是失败的那一方,因为涉及到大量的人力去测试定位特征,研究厂商的安全策略等等过程。
而对于技术不是特别精通的攻击者来说,他甚至整个流程都是处于下风的,因为编写的加载器会被各种机器学习模型捕获,随即被标记。而就算是一个技术精湛的攻击者,没有一套自动化的流程或工具去修改特征、重新生成一套免杀的木马,那么即便攻击者的修改最终能绕过安全软件,最终在对抗上也还是失败的。
但是现在的情况有了很大的转变,在 AI 时代,这个问题有些不一样。AI 的出现导致了一种“Code is cheap”的现象,代码的含金量或者说编写代码的成本大大降低,开发速度也大大加快。当编写代码不再昂贵,编写一套恶意软件的成本也随之降低了,这就导致了一种完全的逆转。
那么现在的对抗情况是怎么样呢?
现在的情况是,攻击者通过 AI 能够快速编写一套成熟的远程控制软件,或者一套成熟的木马。对此,厂商基本没有办法。因为当有了 AI 之后,一套自研的木马程序可以很快地再生。服务端程序不用换,只换被控端的程序就可以了。所以说,当开发的成本大幅降低的时候,攻击者就获得了一种绝对的优势,但是厂商却不能通过 AI 受益,至少说没有那么大的提升,厂商面对的问题是要处理大量的样本,而不是什么开发一套中等规模的软件,而大模型在这块并不能为厂商提升多少效率,计算成本很贵,而样本又太多,也许可以省去一些人工分析成本但是并不解决问题。因此,至少在远程控制软件这块,攻击者已经阶段性地取得了胜利。
那么在这个时刻,我们能够预期安全边界又要向后退了。
也许我们能预见到未来会有这样的言论:“你不能说电脑上有一个向外发送数据的软件,就断定这台电脑是被入侵的”。毕竟网络层面很难判断一个程序是否具有恶意。以 C2 来说,它本身就是一个向外请求并接收指令的程序,而这类程序太多了。基本上很多程序都会有类似的机制,比如自动更新:向外请求最新程序的信息,如果有更新就下载。难道这也能算恶意程序吗?显然不是。
所以,无论是像向日葵(Sunlogin)这类软件,还是其他的远程控制行为,你本身不能直接说它是恶意的。或者说,现在已经没法单纯通过一套规则去判断其属性了。在传统的对抗手段中,无论是特征码还是各类机器学习方法,都有可能被绕过,甚至已经有了非常成熟的绕过技术。
对于安全厂商来说,未来要经历的事情可能就是从 HIPS 到 EDR 这样的一个进化和蜕变。这意味着要再次把安全边界后移,尽管这次的后移看起来是灾难性的。具体要移到什么地方,目前我也不清楚。我只能说,安全边界很大可能将再次后移。当电脑被远控时,很难简单地声称这台电脑就是被攻击了。以后 C2 的问题就会像 UAC 的问题一样,可能厂商会感到无能为力,尽管得去尽量修复,但是永远也修复不完。虽然说之前也是这样,但是这里面对抗的成本发生了巨大的变化。在没有全新的结构或技术出来之前,厂商输掉了现阶段的对抗。
我们可以再深入想一想,未来的安全厂商能在哪些方面重新夺回对抗的主导权?
也许是结构方面的改变,通过在操作系统中引入手机那样细致的权限控制实现安全,隔离各个应用,隔离重要数据,从根源解决这种问题。也许核心是 AI 技术,因为现在是 AI 的时代,也许厂商能够想出一些办法利用 AI 大幅降低成本,从而重新回到双方成本持平的水平。但是现在的问题是如果应用LLM,厂商的算力需求相比于攻击者要大的多。在 GPT 这样的模型出世前,防御方能够使用各种机器学习技术来对恶意软件进行检测,而攻击方受限于形式以及体量是无法利用这些技术的,往往依赖的是攻击者个人的技术。而现在变成了,由于LLM高昂的价格导致厂商并没有办法大规模使用LLM来检测恶意软件,这一点只能期望于在未来会随着计算成本的下降改善。
不过安全厂商也许有这些方向:
-
智能安全工程师的构建
大语言模型目前还不能直接完全接管程序判断,但你可以尝试构建一个“智能安全工程师”。给它一个样本,让它在环境里自动完成分析、调试、逆向并输出结果。这是有可能实现的,完全替代普通的逆向分析人员,但是你不能指望这种 AI 智能逆向工程师去让你处理成千上万的样本,它目前只能分析个别样本,吞吐量是有限的。
而且如果是分析成千上万的样本,它的成本会特别高。如果要处理这种量级的需求,目前最好的方案还是通过沙箱(Sandbox)去批量处理。
-
规则的快速生成
另一个方向是如何利用 AI 快速生成检测规则。假设我现在检出了一个恶意代码,需要针对它设定规则,既要避免对其他正常程序产生误报,又要能检测出该程序的各种变体。
而对于 AI 时代的攻击者来说,核心思考点在于:如何构造出一种 C2 的抽象层,然后通过 AI 快速做出多种不同的实现,从而尽可能缩短被查杀后重新修改、上线新流程的时间。这其实已经不是单纯在精进黑客技术,而是如何在 AI 时代写好代码,本质上更接近于软件工程。总而言之,AI 时代中攻击方和防御方要做的本质是一样的,是如何用 AI 技术自动化自己的流程。
如果是一个有追求的攻击者,现在就不应该着眼于用哪些本质上并无实质差别的技术证明自己又绕过了什么引擎,而是从弱势的那一方思考,有什么方法会导致现在的优势消失。
时代的转变总是带来很多遗憾。
之前研究了那么多代码变异技术、那么多免杀技术,在 AI 时代到来之后,那些技术的价值我觉得至少打了对折。这是属于攻击者的遗憾。
而对于安全厂商的从业者来说,他们的遗憾并不在于无法在攻防成本中占据主导优势,而是安全行业的整体下滑。一方面是 AI 对于就业、对于市场环境的冲击;另一方面又是整个世界经济的下滑,大家都没有钱。安全作为一个附属行业,作为一个不那么必要的东西,它必然是深受打击。
他们的遗憾在于,必须要把精力放在跟客户打交道上,为了把产品推销出去要满足各种奇怪要求,让公司在这个行业寒冬中尽力活下去。哎,学习了那么多,钻研了那么多高深的技术,又有什么用呢?
时代在转变,对吧?这些技术要么变得一文不值,要么变得无处施展。学了那么长时间技术,可能还不如人家一两个月给别人安装 OpenClaw 赚得多。但是另一方面来说,这也没什么要紧的,我的技术是没有意义了,可我的热爱有,过去那些研究技术的日子给了我莫大的幸福。
学习作为一种能力它的价值是巨大的,让你能跟上时代。即使你不能把握住风口,学习也能让你知道如何跟时代靠拢。当新事物出现后,能不能快速了解这个东西,快速运用甚至快速商业化这个东西。有些人看到这个立刻就能去用这个赚钱,去给人装 OpenClaw、去开中转站等等,而有些人甚至到现在都不知道如何用 AI 去加速自己的工作,这就是区别。前者便能够抓住风口,后者则只能期望风吹到自己的位置。
另外我也意识到了,保持活力/有足够的灵活时间是同样重要的,如果你是天天 996,那么你不会有欲望、有精力去研究新事物,你想要的只是休息。只有当你工作不那么繁重,你才有可能有精力、有时间去看、去了解,把一部分时间投入到新事物上。可以说生活的结构一定程度上就决定了你的人生方向。