米兰达·库尔卡尼住在一栋被改建过的水塔里。
阿迪亚第一次听到这个名字是在德赛打来的电话里。德赛说,如果要理解那十三秒指令背后的技术逻辑,他需要找一个“能看到电流的人”。然后他给了一个地址,位于卡纳克普尔老工业区,一座废弃了二十年的纺织厂内。
“米兰达以前是邦政府网络安全部的首席架构师,”德赛在电话里说,语气像是在介绍某种稀有动物,“五年前辞职,原因不明。辞职后她搬进了那座水塔,把里面改造成了一个独立的安全实验室。她接私活,收费高得离谱,但她是全邦唯一一个在模拟攻防中成功入侵过邦电网调度系统的人。那套系统至今还在用她的渗透测试报告做加固方案。”
“所以她是白帽黑客。”
“不。她是那种既不黑也不白的人。她说自己活在灰色里,因为灰色是所有颜色的平均数。”
阿迪亚开车穿过纺织厂生锈的铁门,停在一片长满野草的卸货区。水塔就立在前方,六层楼高的红砖圆柱,墙面爬满了龟裂的水泥修补痕迹。塔顶的储水箱已经被拆除,取而代之的是一圈环形天窗,在夜色中透出幽蓝色的光。
他敲了敲底层那扇用钢板加固的铁门。
门上开了一个小窗,一双眼睛从里面看了他两秒钟,然后门开了。
米兰达看起来三十五岁左右,但她的眼睛比年龄更老。她穿着一件沾满焊锡痕迹的工装外套,头发剪得很短,像刚出院的病人。水塔内部被改造成了一个垂直的空间——螺旋楼梯沿着墙壁盘旋而上,每一层都是不同的功能区:一楼是硬件实验室,堆满了示波器、焊台和拆开的工控设备;二楼是服务器阵列,几十台机器同时运行,散热风扇的声音像一条恒久的河流;三楼是生活区,一张床垫直接铺在地板上,旁边是一台咖啡机和一堆速食面箱子。
“德赛说你手里有个有意思的东西。”米兰达没有寒暄,直接走向四楼的工作站,四台显示器组成一个弧形桌面,屏幕上滚动着阿迪亚看不懂的数据流。
阿迪亚把U盘递给她。“引导扇区里有一段莫尔斯电码。主数据区被覆写了七次,军用级擦除算法。德赛说这不是普通的黑客,是一个有信仰的人。”
米兰达接过U盘,插进一台隔离电脑的接口。她的手指在键盘上敲击的速度快得看不清,屏幕上不断弹出窗口和命令行。她盯着那些十六进制数据看了大概三分钟,然后发出一声短促的笑。
不是嘲笑。是那种看到一件做工精美的工艺品之后不由自主发出的赞叹。
“军用级擦除算法没错。但你知道他用的是哪种具体实现吗?是美国国防部5220.22-M标准,七次覆写。这个标准在民用领域几乎没人用,因为太费时间。除非——”
“除非什么?”
“除非这个人不在乎时间。或者他想要的就是这种效果——让你知道他不是普通的黑客。他用军用标准不是为了擦得更干净,而是为了留下一个签名。‘我来了,我做到了,我走了。’每一层覆写都是一张名片。”
米兰达又敲了几个命令,调出引导扇区的原始数据。那串莫尔斯电码被翻译出来后占了三行屏幕——“清洗已经开始了。”
“这句话有没有让你想到什么?”
阿迪亚从怀里掏出笔记本,翻到德赛标注萨米尔·帕特尔的那一页。“我怀疑这个人十年前在神庙东区事故中失去了妻子,然后消失了十年。三天前,他用一场精确到秒的基础设施攻击制造了踩踏事件。他现在应该还活着,在一个叫‘遗忘之境’的暗网论坛上以ID‘秩序’活动。他已经邀请我们进了核心区。”
米兰达放下手里的螺丝刀,第一次认真地看向阿迪亚。
“你知道你在说什么吗?你要潜入一个暗网论坛的核心区,去找一个可能已经和电网融为一体的疯子?”
“我需要知道他在技术上是怎么做到的。那十三秒指令——德赛说是签名劫持,但密钥存在物理隔离的加密机里。他不应该能拿到。”
米兰达站起来,走到白板前。白板上已经画满了各种图表和公式,她找到一块空白的角落,开始画一条横向的时间线。
“你说事发当晚二十三点四十七分零三秒,调度中心收到一条合法签名的紧急停机指令。十五分钟前,同一条签名在另一台终端上被生成。对不对?”
“对。”
“那我告诉你他真正做的事情。听好,因为接下来的每一句话都是你抓不住他的原因。”
她用马克笔在时间线上画了一条向下的箭头。
“他不需要窃取密钥。不需要破解加密机。他做的事情优雅得多——他在签名生成的瞬间完成了重放攻击。调度中心的控制系统有一个设计缺陷:当一台合法终端生成了一条操作签名之后,这条签名会在内网缓存中保留十五分钟。这十五分钟足够他做一件事——把自己的恶意指令伪装成同一条合法操作的重放包。对系统来说,这条指令不是新的,它只是同一个合法操作在网络延迟下的第二次到达。安全协议不会拦截重放包,因为重放包的数字签名和原始包一模一样。”
“但要做到这一点,他必须实时监控内网流量,在签名生成的一瞬间就截获它。”
“对。”米兰达盯着阿迪亚,“这意味着他在内网里有一个实时监听节点。不是外网攻击,不是钓鱼邮件,不是任何你能想到的传统入侵方式。他在这个系统里植入了一个幽灵——一段沉睡代码,可能已经睡了三年、五年、甚至七年。它在等一个特定的触发条件。当条件满足,它醒了,工作了十三秒,然后消失。”
阿迪亚感到自己在暗渠里感受到的那种寒意又回来了。
“什么样的触发条件?”
“不知道。但以我对这类代码的理解,触发条件一定和神庙有关。比如神庙朝圣季的灯光负载超过某个阈值,或者朝圣人数达到某个数量级。一旦触发条件被满足,幽灵就会开始行动:监听内网流量、截获签名、注入重放指令、抹除所有痕迹。”
米兰达放下马克笔,回到电脑前,调出一张她过去做渗透测试时绘制的邦电网拓扑图。
“他说得对。”她指着图上的几个节点,“现代城市的每一个开关都在网上。电网、供水、天然气、交通信号——所有这些系统的控制指令都走同一条工业协议。你不需要炸掉一座变电站来让城市瘫痪,你只需要向其中一台控制器发送一个恶意梯形图指令,让它把断路器合上。就这么简单——一次过流,一次短路,整片区域陷入黑暗。而负责继电保护的装置会忠实地记录下‘设备故障’,没有人会想到是有人在键盘上敲了一下。”
“他说得对——你说的‘他’是谁?”
“你追的那个人。他用的不是暴力。他用的是电力工程的基础知识加上一个被忽视了十年的系统漏洞。他不是在破坏系统,他是在和系统融为一体。你知道吗,电网调度语言里有一种叫做‘状态估计’的东西——系统实时计算每一条线路的电压、电流、相位角,预测下一秒会发生什么。而他做的事情,是在系统的状态估计中加入一个人类变量的扰动项。一个不可预测的、有意志的扰动项。”
米兰达停下来,看着阿迪亚。
“在工程学里,这种扰动项被称为‘幽灵节点’。一个本不该存在的变量,却实实在在地影响着整个网络的运行。你要抓的,就是这个幽灵。”
水塔的天窗外,卡纳克普尔的夜空被神庙的灯火映成暗金色。远处的钟声敲了十下,声音穿过纺织厂的废墟,穿过水塔的红砖墙壁,在服务器阵列的嗡嗡声中变成一阵微弱的震颤。
阿迪亚在笔记本上写下一行字。
“幽灵节点——七年前,神庙SCADA系统首次上线。七年前正是系统源代码被最初编写的时刻。萨米尔·帕特尔在离职前的最后三个月,正好被调去参与该系统的基础架构设计。他在十年前离职前的最后三个月里,有机会在核心代码中埋入任何东西。”
他停下笔,抬头看向米兰达。
“你要多少钱?”
“不要钱。”米兰达关掉显示器,屏幕的蓝光从她脸上消失,“我要看结果。一个能在内网里植入幽灵节点的人,他的代码是我见过的最干净的东西。干净到可怕。我想亲眼看到写出这些代码的人。”
她转过身,用一种近乎饥渴的眼神看着阿迪亚。
“别死。你的笔记本上还有三十页空白。在他填满它们之前,你也不能死。”


暂无评论,来抢沙发吧!