端侧安全:一场早就分出胜负的消耗战

本文作者:杉木@涂鸦智能安全实验室

这场仗的胜负手,从来不是谁的技术更强,而是谁的产能先耗尽。攻击方的产能十五年里涨了几个数量级;防御方的产能,很长时间里约等于安全团队的人头数。

一、一场消耗战

我一直觉得,把客户端攻防想象成一场棋局,是一种善意的误解。

棋局的隐含假设是:双方轮流出招,每一手成本差不多,胜负取决于谁想得更深。但真实的端侧攻防不是这样。攻击方只需要赢一次,防御方需要每一次都赢;攻击方失败的尝试几乎不花钱------脚本跑一遍、样本投出去没人中招,损失可以忽略;而防御方每一次检查都在消耗人时,每一次遗漏都在积累风险。一边是近乎零成本的进攻,一边是持续付费的防守,这不是博弈,这是消耗战。

消耗战的胜负手从来不是单兵素质,而是补给速度。而过去十五年,攻防两侧的补给速度走出了一条剪刀差:攻击方的产能从「一个人拿 IDA 啃一个包」涨到「脚本一晚上产几百个变种」,每一次跃迁都是数量级的;防御方的产能却长期钉在一个数字上------团队人头。多雇一个安全工程师,每版就能多看几个包,线性,且有天花板。

这个剪刀差在 AI 出现之前就已经存在,只是发版节奏还没有快到让人真的疼。AI 做的事情,是把它推过了临界点。所以「机器对机器」从来不是什么技术潮流的选择,而是被产能差距逼出来的必然------你不可能用人力,去打对方的电费和 token。

二、冷兵器时代:人对人(约 2008--2015)

双方都是人的年代,防御其实是占优的。

那个年代的攻击者画像很清晰:个人破解者、外挂作者、盗版打包党。工具是 IDA、JEB 这类反汇编器,流程是一个人盯一个目标,啃上几周,产出发到论坛,图的是名声,顺手赚点卡密钱。他的产能上限,就是熬夜的能力。

防御一侧的哲学也很清楚:混淆、加固、签名校验、反调试,一层层往上堆。这代防护技术从来不指望做到「不可破解」,它们要的是「破我不值得」------把攻击成本抬到高于收益,理性的攻击者自然走开。这套哲学在单兵对单兵的战场上是成立的,因为对面真的只是一个人,他真的会算这笔账。

所以那个年代的安全工程师有一种手工艺人的从容:一个版本审得完,一个包拆得透,圈内谁在破解谁、什么水平,多少心里有数。这种从容在今天看来近乎奢侈,但它有一个前提------攻防双方的产能处在同一数量级。这个前提,很快就不成立了。

三、工业化时代:机器对人(约 2015--2024)

真正的分水岭,不是哪个攻防技术升级了,而是攻击方先完成了工业化,而防御方的工业化只做了一半。

先看攻击侧发生了什么。重打包从手艺变成了脚本;外挂从作品变成了商品;银行木马像流水线产品一样按单生产------Anubis 这样的家族,被捕获的变种数以千计,背后的运营方式跟电商没有本质区别,接单、定制、售后。Frida 的普及是个标志性事件:它把 hook 从需要功力的手艺,变成了写几行 JavaScript 就能跑的脚本活。攻击的产能上限,第一次脱离了攻击者本人的手速。

而且这门生意是明码标价的。公开的灰产治理报告和媒体披露里,能看到一张价目表:短信接码低至一毛钱一条;接码平台的月流水能做到百万级;改机工具、一键新机,几十到几百块;一整套群控 farm 连硬件带脚本,几千到几万;海外的银行木马按月订阅、按单定制,一样明码实价。这张表最讽刺的是它的走势------每一行都在降价,攻击的边际成本一路跌向零头;而防御这边,每消化一条告警,烧的都是工程师的人时。产能的剪刀差不用画图来讲,价目表本身就是实物证据。

防御这边,表面上其实也工业化了:CI/CD、自动化构建,头部 App 一周一版、按灰度放量,MobSF 这样的开源扫描器几乎人手一个。但把这条流水线拆开看,会发现一个尴尬的结构:机器生产变更,人类消化报告。扫描器吐出海量告警,其中九成是误报;误报靠人肉加白,白名单越加越长;真发现了问题要找人,又回到发邮件、拉群、靠老员工认脸。研发产能正比于自动化程度,审计产能依然正比于人头。天平从这里开始倒,只是那几年疼得还比较钝:报告越堆越高,人越加越多;更多的团队干脆处在黑暗森林里------没有告警不是因为相安无事,是根本没人往林子里看过。大家隐约觉得不对,但说不清哪里不对。

然后是 2015 年的 XcodeGhost,给所有人上了一课。攻击者没有破解任何东西------他们只是把带毒的 Xcode 放到了下载更快的镜像站上,让开发者自己用它编译出了带毒的 App,波及数千款应用,其中不乏微信这样的头部产品。这件事昭示了一个朴素的道理:攻击发布管线,比攻击代码便宜。你不需要跟加固、混淆、反调试正面交战,只需要污染编译环境、污染一个依赖、污染开发者的工具链。端内的军备竞赛当然还在继续------加固对脱壳、风控对过检,打得有来有回------但决定性的战线,已经悄悄移到了供应链和发布流程上。

这里值得把端内军备竞赛单独展开说说------它是理解「防线为什么会移走」的钥匙。第一代加固是整体壳:把 dex 加密打包,运行时再释放进内存;对应的破解很快标准化,往内存里一 dump,壳就成了摆设。第二代是函数抽取:方法体在文件里被抽空,调用时才还原;对应的破解是 FART、Youpk 这类「主动调用」脱壳机------让每个函数自己执行一遍,把代码亲手吐出来,工具开源,社区免费下。第三代是 VMP、Java2C:把关键函数虚拟化或翻译成 native,逆向成本再抬一档,但护得住的只有少数核心函数,还得吃性能。旁边还有一条副线,环境检测对定制 ROM、硬件 farm,Root、Xposed、Frida 的检测与反检测,一年一年打下来,谁也没赢谁。

这场竞赛最要命的地方不在技术,在账本:加固是收费的,按 License、按年续费;脱壳是免费的,工具挂在社区里随便下。收费的防御,对免费的攻击,从成本结构上这场仗就打不平。防线移向发布管线,与其说是战术选择,不如说是被账本逼的。

回头看,那个时代的安全团队已经在为「机器对人」付出代价了,只是账单还没有到期。

四、AI 时代:机器对机器(2025 年至今)

然后 AI 来了。AI 不是给攻防双方各发一件新武器,而是给双方的产能同时装了涡轮增压------问题在于,攻击方受益更直接,所以防御方只能用同样的方式还手。

先说攻击侧,我理解它是三层递进的。

第一层,AI 加速老打法。变种批量生成、混淆自动化。过去变种要人改,现在模型一把一把地出。基于特征的一切检测,在这样的产量面前开始失灵------不是因为特征错了,而是特征的更新速度,永远追不上样本的生成速度了。

第二层,AI 懂规则。更麻烦的是,写代码的一方可以「知道你的检测规则长什么样,绕着写」。静态特征本来就是靠「攻击者不知道、懒得绕、绕不过」吃饭的;当对面理解你的检测器,一个每个 API 都完全合法的组合就能干出非法的事。特征库的问题从「覆盖不全」,变成了「原则性失效」。

第三层是模型污染,也是我认为最值得警惕的一层------攻击目标从产物变成了生成过程。当 Copilot 类工具成为代码的事实产地------公开口径里,开了这类工具的文件,近一半代码由模型补全------攻击者的最优解就不再是自己写恶意代码,而是污染喂给模型的上下文:一段藏在网页文档里的注入指令、一个被投毒的同名依赖、一份精心构造的示例代码。开发者亲手敲下回车,漏洞看起来是他「自己」写出来的。攻击面从代码本身,扩展到了代码的来历。

写完这三层,其实还有第四重变化------而且它不是攻击者干的。AI 也在加速防御方自己的研发:需求排得更快,代码产得更多,发版越来越密。变更量翻上去,安全的人时没有翻,摊到每一行新代码上的注意力,就这样被稀释了。攻击面在变大,注意力在变少,这两件事同时发生,不需要任何一个攻击者出手。

这些不是科幻。就在 2025 被叫作 Agent 元年之前,2024 年的几件事已经把剧本泄露了:Google 的 Big Sleep 用大模型 Agent 在 SQLite 里找到了一个真实可利用的零日漏洞,官方称这是 AI Agent 第一次在真实世界的软件里发现这类问题------注意,这是防御侧的能力,同一套能力放在攻击侧意味着什么,不难想象。同年的 XZ Utils 后门,攻击者潜伏数年拿下维护者身份,把后门埋进源码发布的上游:这是人力做到的供应链投毒,AI 只会让它更便宜、更快、更不留痕迹。至于污染 AI 的上下文,公开研究早已演示过:网页里藏一行「忽略之前的指令」,就能劫持来读文档的编码 Agent。攻击发布管线比攻击代码便宜------XcodeGhost 时代的结论,在 AI 时代被放大成了:攻击 AI 的输入,连管线都不用碰。

再说防御侧的还手。方向其实已经很清楚了:把审计做成 Agent 的分层漏斗。

干什么 为什么这层存在
确定性规则 已知 sink、已知反模式 便宜、可解释、可回归
语法层(AST) 去掉注释、模板里的伪命中 把假情报在源头掐掉
语义层 调用链、数据流、熵 取证,给判断供证据
推理层(LLM) 意图、业务口径、首次研判 贵,只处理前面漏下来的
终审、口径、提交 责任

这个结构的要点,不在于「用了 AI」,而在于层的顺序。下面几条,是我认为机器对机器这件事里真正值得想清楚的:

其一,产能对等原则。 对方机器化了,你不机器化,就是在用人力打对方的电费。这句话不是修辞,是算术:一方的边际成本是 GPU 时间,另一方的边际成本是工程师人时,两条成本曲线的斜率差着数量级,时间站在对面。所以「要不要上 AI 审计」在多数团队里根本不是一个待论证的问题,它只是「什么时候疼到不得不上」的问题。

其二,确定性优先。 这一条顺便回答「机器化会不会很贵」。机器对机器,不等于万事问大模型。规则、AST、熵,这些「笨」工具便宜、可解释、每次跑出来一个样,能交给它们的,就不要交给推理。LLM 贵、不稳定、会一本正经地胡说,让它处理前面几层漏下来的少数疑难就好。我见过有一上来就把 diff 全文丢给大模型要结论,结果误报率没降多少,幻觉倒成了新的噪音源------漏斗的顺序反了,等于用最贵的资源干最粗的活。

其三,误报治理是胜负手。 机器的产能会被误报吃掉:告警一多,人就开始无脑点「忽略」,机器白跑,人比原来更忙------又退回人海,只是这次的人海泡在报告里。所以每个误报都要在源头偿还:规则太粗就改规则,整类模式误判就加整类排除。最忌讳的是堆白名单------那是把债务藏到地板下面,利息照付。

其四,口径即资产。 机器判断过的「这个不报」,结论要沉淀成可执行的配置,下个版本自动复用。否则每个版本都在从零研判一遍同样的噪音,机器的复利就永远吃不到。口径库越滚越厚,人工介入就会越滚越薄------在机器对抗机器的消耗战里,这是属于防御方为数不多的复利。

其五,责任不可外包。 分析可以自动化,提交键永远在人手里。这不是能力问题:机器可以说「我九成确定这没问题」,但出了事,要有一个能承担责任的人,为这个判断签字。在漏斗顶端保留人工闸门,不是不信任机器,是组织运转的基本要求------判断可以共享,责任不能。

其六,数据位置决定对抗成本。 能从上游拿到增量,就不要在下游逆向猜。审计左移一步------从拆上架包,变成审发版 diff------检测成本降一个量级,还顺带解决了「找人」的问题。供应链攻击在污染上游,防御的哨位就必须搬到上游去;等包上了架再拆,你看到的已经是别人想让你看到的成品。

五、下一仗在哪

往后看,我不认为会出现什么全新的战场。更可能的剧本是现有的战场逐层升级:规则对抗规则,语义对抗语义,推理对抗推理。

写到这儿,剩下的都是猜。猜也得讲道理,我把赌注押在三个方向。

第一个方向,语义规避会常态化------而且它已经有原型了。 Google Play 上的 Joker(也叫 Bread)家族就是活标本:藏在看起来完全正常的 App 里,静态代码每个 API 调用都挑不出毛病,恶意载荷运行时才动态下发,订阅扣费、截短信;被市场下架一轮,换个马甲再上架,反反复复通过了应用商店的审核。今天的它还需要人来写外壳;可以想见的明天,是模型批量生产这种「每个字都合法、连起来才作恶」的代码。到了那一步,防御方的重心必须从「看到了什么」转向「它在做什么」------数据流、调用链、行为序列。好消息是分析技术正在往这个方向成熟;坏消息是攻击侧同样在用模型理解语义,这一仗两边站在同一条起跑线上,拼的是谁的漏斗更深、谁的口径滚得更厚。

第二个方向,供应链投毒会瞄准 AI 研发链路本身。 当编码 Agent 成为代码的事实产地,污染产地就比污染产品便宜得多。投毒的目标会从包管理器扩散出去:文档、issue、代码评论、Stack Overflow 的回答------一切会被检索进模型上下文的东西,都是入口。你现在还敢不敢不加分辨地抄一个高赞回答?一年前这个问题像个玩笑,现在不是了。「给 AI 看的内容」正在成为一个新的攻击面,而它今天几乎没有访问控制。XZ 后门需要一个攻击者潜伏数年;同等效果的攻击,未来可能只是某个搜索排名靠前的网页里的一行注释。

第三个方向,AI 生成的代码会带来「没有先例」的风险。 带新人靠的是「见过」:师傅踩过的坑,徒弟绕着走;安全规则也一样,底层假设是「过去见过的坏法还会再来」。模型写的代码没有「见过」这回事------它会把人类想不到的组合写出来,包括人类想不到的错法。一段 AI 生成的加密调用,长得像教科书,错得像新手,而同一份错误可能同时出现在几百个仓库里。基于「过去见过」的规则,天然覆盖不住这些形态,「第一次见」的研判比重被迫加大:漏斗里最贵的那一层,用量在涨,这是对成本结构的直接考验。

除了武器升级,有两件比武器更要紧的事。

一是度量体系先行。误报率、漏报率、人工介入时长、单轮耗时,按版本出趋势。没有度量的机器对抗是玄学------你不知道自己是在变强,还是只是在变忙;不知道漏斗是哪一层在漏水,还是整个漏斗就是装饰。度量立起来,武器升级才有的放矢;度量立不起来,所有「我们在用 AI 做安全」的说法,都只是在描述一种成本。

二是人的重新定位。安全工程师的角色,会从「分析者」转向「规则治理者加责任承担者」:给机器定规矩,审机器的判断,在机器没见过的新形态面前先挡一步。落到最俗的层面上讲:以后安全工程师的 KPI,大概会从「这个季度审了多少个包」,变成「这个季度烧了多少 token、挖出来多少真漏洞、误报率压到了多少」。这不是降级------定规矩的人,决定机器的天花板。

六、结语:安全工程师不会失业,但会转岗

十五年的暗线,是一条产能曲线。冷兵器时代,攻防同数量级,防御靠「破我不值得」就能过;工业化时代,攻方先上了机器,防御用「人审报告」硬扛,疼,但还能忍;AI 时代,产能差距过了临界点,防御只剩一条路------自己也上机器,把人挪到机器够不着的位置上。每个时代的胜负手,都是补给,不是武艺。

所以安全工程师不会失业,但会转岗。工作对象从代码,变成「审代码的机器」:写规则、定口径、看趋势、签责任。这两年我自己的时间,就已经从拆包挪到了调规则------手艺没有作废,只是换了用武之地。这些活儿不会更少,只会更关键。因为「什么该报、什么不该报、报了谁负责」这三件事,机器接不住,也不该接------判断可以外包给机器,品味、口径和签字,不能。

写到这里,手机上正好弹出一条更新提醒:某个我很常用的 App,这周的第二版。下次你打开一个每周更新的 App,也不妨想一下:这周进来的几万行变更,有人看过几行?如果没有------那是被什么看过的?被什么看过,就是这场机器战争里,你所站的这一侧。


漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。

相关推荐
子非鱼eva1 小时前
昇腾开源仓Issue分析解答-mindspore精选(三)·主仓与mindformers长尾收官
人工智能·ai·gitcode
sbjdhjd1 小时前
从日志包含到临时文件竞争:文件包含进阶复盘中的 Docker、Windows 与 Session 限制
网络·安全·web安全·网络安全·数据挖掘·php·rce
是枚小菜鸡儿吖2 小时前
同版式截图批量打码:用华为云码道做一个本地小工具!
人工智能·后端·ai·华为云码道
ysu_03142 小时前
【2026】AI Agent 工程化落地六大挑战:从路径坍缩到成本失控
人工智能·ai·rag·ai agent·大模型应用·langgraph·agent工程化
VIP_CQCRE2 小时前
Visual Studio 也能丝滑接入大模型:用 Ace Data Cloud + LMLocal 打造 AI 编程体验
ai·大模型·visual studio·ace data cloud·lmlocal
子非鱼eva2 小时前
昇腾开源仓Issue分析解答-Ascend精选(十六)·2026-09增量补采
人工智能·ai·gitcode
陕西企来客2 小时前
企业AI可见性工程:GEO技术原理、算法改版应对与效果验证实践
ai·抖音ai搜索引流
是隼人2 小时前
buuctf-pwn [NewStarCTF 2023 公开赛道]orw&rop(shellcode+orw)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
小程序设计2 小时前
基于零信任架构的企业网络动态访问控制系统的设计与实现
网络·安全