那一夜,城被删除了 书架

第 06 章 / 共 15 章

第6章 · 木马:一次社会工程学攻击

攻城的正确姿势,几千年来其实只有那么几种:撞门、爬墙、挖地道、把城围到里面人饿死。它们有个共同点——都在跟墙较劲。墙是防御方最贵、最硬的那道投资,攻方要么砸穿它,要么翻过它,要么绕过它。这是一场关于物理强度的比赛。

特洛伊木马的诡异之处,恰恰在于它不参加这场比赛。它一根木头都没往墙上招呼。

先把这匹马讲清楚:它到底是什么

先说一件老实话:特洛伊(Troy,传说中位于今天土耳其西北海边的一座城)和那场十年的战争,主要记载在荷马史诗(相传公元前8世纪盲诗人荷马编成的两部长诗,讲的是几百年前青铜时代的战争传说)里。史诗不是史实——里面有神下场帮人打架,有刀枪不入的英雄。木马这段,其实还不在荷马最有名的那部《伊利亚特》里,而是后世诗人补的。所以严格讲,"木马"是传说,不是考古挖出来的铁证。

但传说之所以能流传三千年,往往是因为它抓住了某种真实的机制。我们这一章要拆的,就是这个机制——哪怕它包在神话的壳里。

传说是这样的:希腊联军攻了十年攻不下特洛伊,于是假装认输撤退,在海滩上留下一匹巨大的空心木马,说是献给神的祭品。特洛伊人把它当战利品拖进城里,欢庆胜利。夜里,藏在马肚子里的希腊士兵爬出来,打开城门,城外假装撤走的大军杀了回来。一夜之间,攻不破的城破了。

用大白话说:希腊人没有攻破那道门,而是骗特洛伊人自己把门从里面打开了。攻击不是发生在墙上,而是发生在特洛伊人的脑子里。

这是一次"社会工程学攻击"

软件工程师对这个词不陌生。社会工程学攻击(social engineering attack)指的是:黑客不去硬破解你的密码、不去攻你的防火墙,而是打个电话冒充IT部门,骗你把密码告诉他。系统再硬,也架不住有人从里面把门开了。

木马就是青铜时代版本的社会工程学。我们把它拆成攻击的几个标准步骤,你会发现它和今天一封钓鱼邮件的结构一模一样:

  1. 找攻击面。墙是硬目标,攻不动。真正软的地方是人——是防御方的判断力。攻击者把矛头从"墙"转向了"守墙人的决策"。
  2. 伪装载荷。载荷(payload,攻击真正要送进去的那个危险东西)是马肚子里的士兵。但它被包装成一件人畜无害、甚至值得高兴的东西——一份献给神的祭品、一个战利品。伪装的关键,是让危险的东西看起来符合你本来就想要的。
  3. 骗过检查。特洛伊人不是没检查。传说里有人警告过、有人主张烧掉它。但恐惧神明的心理、胜利的狂喜,压过了警惕。攻击者要做的,不是让检查消失,而是让检查失效
  4. 由内触发。最狠的一步:门不是希腊人从外面撞开的,是特洛伊人自己拖进来、再由内部的人打开的。攻击者只提供机会,动手拆墙的是防御方自己。

你看,整套流程里没有一步是"变得比防御方更强"。攻击者始终比守方弱——不然直接攻城就行了。木马的全部威力,来自于把防御方的力量掉转过来对付它自己。城墙越厚,特洛伊人越信任这道墙,就越松懈,越容易上当。防御越强,反而放大了这次攻击的效果。这是社会工程学最反直觉的地方。

为什么这种攻击防不住?因为它攻的是信任

上一章我们说过,信任是系统能高效运转的原因,也是它最大的攻击面。木马正好落在这个攻击面上。

特洛伊人为什么会把马拖进去?因为他们在一套自己深信不疑的规则里做判断:敌人撤了(看起来是真的),这是给神的祭品(在他们的信仰里,毁掉祭品是要遭报应的),我们赢了(十年围城终于结束)。每一条单独看都合理。攻击者没有攻破这些规则,而是喂给了这套规则一组精心设计的假输入,让本来正确的规则,推出了灾难性的结论。

这就像一个程序逻辑完全正确,但你给它灌了假数据,它就一本正经地算出一个会炸掉整台机器的结果。漏洞不在代码里,在"它相信输入是真的"这个假设里。

另一侧:董卓也是被"请"进洛阳的

把镜头切到一千三百年后的中国。公元189年前后,东汉王朝的都城洛阳(今河南洛阳,东汉的首都、整个帝国的中枢)迎来了一支不该进城的军队。带兵的人叫董卓(东汉末年盘踞西北的军阀,手握凉州边兵,凶悍而不受朝廷节制)。第二年,也就是公元190年,他一把火烧了洛阳。

这里必须先划清一条线。很多人对董卓的印象来自《三国演义》(元末明初罗贯中写的历史小说,是文学演绎,不是史书),那里面有貂蝉、有连环计,情节精彩但大量虚构。我们要讲的机制,得靠《后汉书》《三国志》(成书更早、更接近史实的正史)这条线。

史实的骨架是这样的:东汉末年,朝廷内部有两股势力死掐——一股是宦官(在皇宫里伺候皇帝的太监,因为离权力最近,逐渐掌握了实权),一股是以大将军何进(当时朝廷军权最高的人)为首的外朝官僚。何进想彻底铲除宦官,但他在京城的力量下不了这个决心、也压不住场面,于是有人给他出了个主意:召集地方上的带兵将领进京,用外来的武力逼宫。董卓,就是被召进来的其中一支。

结果所有人都知道了。宦官狗急跳墙先杀了何进,京城大乱,董卓趁乱带兵入城,捡了个现成的权力真空,从此挟持天子、废立皇帝、火烧洛阳。那个想借刀杀人的人,第一个死在了自己请来的刀下。

两匹"马",同一个漏洞

特洛伊木马是攻击方主动伪装、骗守方开门;董卓入京是守方主动开门、把危险请了进来。方向看似相反,机制却是同一个。我们把它并排放:

说到底,这两件事都不是"敌人太强",而是"我们自己把门打开了"。木马再大,拖不拖进城是特洛伊人说了算;董卓再凶,召不召他进京是何进说了算。攻击者做的,只是给了一个足够诱人的理由,让防御方相信开门是对自己有利的。

一个让人不舒服的结论

工程师最想问的一句是:那怎么防?这一章我先不给答案(后面讲韧性设计时会展开),但我要先把这个漏洞的性质讲透,因为它很反直觉。

你没法靠"把墙修得更厚"来防木马。恰恰相反,墙越厚、防御方越自信"我们固若金汤",就越倾向于把注意力从内部转移开,越容易在信任这一层被击穿。何进手握全国最强的军权,正因为他自信能掌控局面,才敢玩"召外兵进京"这种火中取栗的操作。让他们倒下的,不是能力的不足,而是判断的失误——而且是那种在当时看起来完全合理的判断。

这就是社会工程学攻击最深的一层:它不利用系统的弱点,它利用系统的信任。而信任恰恰是让这个系统之所以强大、之所以能高效运转的东西。你不能为了防木马就谁都不信——那样城市根本运转不起来。于是每一个复杂系统,从青铜时代的特洛伊,到东汉的洛阳,到今天你公司的内网,都被迫留着同一扇门:那扇为"我信任的人和事"敞开的门。

攻击者要做的,从来不是撞开这扇门。而是想办法,让自己变成那个"你信任的人和事"。下一章,我们顺着董卓这条线,把"被请进门的兵"这个结构拆得更细——看清历史真实里的引狼入室,到底是怎样一步步发生的。

那一夜,城被删除了 · 王建硕
面向对世界有好奇心的人 · 费曼式写法 · 由多个 AI 代理撰写与互相审校