第18章 · 反向的猎手

法尔汉在米兰的固件中搜寻了整整两天。不是睡觉时间减半的那种”两天”——是他真的连续四十八小时没有合眼,只在第三十六小时的时候被陆远强行塞了一瓶水和两块压缩饼干,他机械地吃完,然后又转回了屏幕前面。

他搜寻的不是代码,是代码的缺席。

米兰的设计日志提供了线索,但线索不是地图。线索是一句模糊的话——“一个没有被记录在任何路由表中的地址空间”——和一个技术概念:“入口-7的审计模块在’读’的过程中插入一个条件分支。“在这两行字之间,法尔汉需要找到一条确切存在于某个内存地址上的代码路径。

他尝试了所有常规方法。符号执行——没有找到任何未注册的地址空间。静态分析——审计模块的控制流图显示所有分支都是闭合的。动态污点追踪——数据流路径干净得像教科书上的示例。

四十八小时后,法尔汉靠在椅背上,闭上眼睛,说了一个字:

“操。”

他很少说脏话。陆远认识他几个月来几乎没听他说过一个带情绪的词。但他现在说了,而且说得非常平静,像在陈述一个经过充分验证的失败结论。

“嵌套入口不存在。“法尔汉睁开眼,看着头顶的通风管道,“米兰的日记可能只是他的内心独白——一个想法,一个从未被实现的概念草图。他在日记里写’我做了那个嵌套入口’——但那可能是他的想象。一个他从没真正落实过的幻想。人会在日记里骗自己。”

陆远站在他身后,没有接话。

他也在想同一个问题。如果在米兰的固件中反复搜索都找不到那个入口——那它可能真的不存在。米兰是星链的首席协议架构师,但他也是一个人。人会夸大自己的成就,会记录自己想做但没做成的事,会在日记中把愿望写成已完成。

但陆远回想着他在拉各斯的那个夜晚——回想着阿米娜地下室那台运行着FreeBSD的服务器,回想着那枚管状钥匙冰凉的触感,回想着阿米娜说的那句话:“每一个陷阱都是双向的。”

阿米娜不是技术专家,她是一个信号猎犬出身的货运老板。她说过的话——她没有用技术术语,但她说了同样的事。

“米兰说他花了六十三天写那个嵌套入口,“陆远说,“六十三天。”

法尔汉没有转身,但他的呼吸节奏变了一下。

“一个人花六十三天写一段代码——然后把它放在那里,从来不告诉任何人,也从来不用——你能做到吗?”

法尔汉没有回答。但他知道答案。他做不到。如果你花了六十三天写了一段代码,它的存在本身就意味着你希望它被使用。你不会为一个永远不会被激活的功能投入六十三天。除非——那六十三天本身不是为了写代码,而是为了做一件更困难的事情:把一段代码藏到所有人都找不到的地方。

法尔汉坐直了身体。他重新面对屏幕,但这次他没有打开反汇编器——他打开了固件的完整二进制文件的十六进制视图。

“你在做什么?”

“我在想——如果我是米兰,我会怎么藏一样东西。”

他没有搜索代码,他开始搜索内存的布局。星链固件的内存地址空间有一个标准的分配模式:引导程序区、操作系统内核、协议栈、设备驱动、应用程序容器、以及——空白区。每两个主要模块之间都有一段未使用的填充空间,用于对齐内存页边界。

法尔汉把那些空白区一个一个地调出来看。大部分是纯粹的0x00填充——没有意义,没有内容。但他找到了一个异常:在固件偏移量0x7F3A_0000到0x7F3A_1000之间,有一段4096字节的空白区。它不是0x00填充。它填充的是0xFF。

法尔汉的手指停在键盘上。

在大多数固件中,空白的未使用内存会被初始化为0x00。但0xFF填充意味着有人特意向这个区域写入了数据——然后把它标记为空白。

不是空白。是被擦掉的日志。

他把那片0xFF区域拉进分析工具,运行了一个差分比较算法——将这片区域与相邻的空白区域进行统计对比。结果在一秒后返回:这片0xFF区域的比特分布不是随机的,它包含一种极其微弱的、非随机的模式——某些字节位置的取值概率偏离了均匀分布。

“他把数据擦掉了,“法尔汉说,声音里第一次出现了那种他很少流露的、接近兴奋的东西,“但他没有覆盖随机数据填充。他用的是0xFF覆盖——一种标准的’安全擦除’操作。但安全擦除的一个问题是——它留下一片太干净的空白,而真正的空白区域是0x00。他留下的不是信息——他留下的是一个曾经有信息存在过的痕迹。”

陆远俯下身,盯着屏幕上那行分析结果。

“你能恢复它吗?”

“不能。0xFF覆盖是不可逆的。数据已经不存在了。”

法尔汉关闭了那个窗口。但他没有停下。他打开了另一个窗口——星链固件的完整链接映射表。他像一个考古学家,在发掘一个人的脑子——不是通过他留下的东西,而是通过他选择清空的东西。

“米兰用六十三天写了嵌套入口。然后他把它擦掉了。但——如果我是米兰——我不会把唯一的副本擦掉。我会在擦掉这个副本之前,在另一个地方保留一份。一个他相信永远不会被人检查的地方。”

他的光标在链接映射表上缓慢移动。他在找——不是找代码,是在找地址偏移之间的异常关系。

然后他找到了。

固件中有一个模块——QKD信道噪声特征采样器——的位置映射表中,有一行数据看起来是正常的。库名称正确。大小正确。入口地址正确。但法尔汉注意到了一件事:这个模块的声明大小是8,192字节,但在链接映射表中,它的结束地址与下一个模块的起始地址之间,相差了4,096个字节。

一个隐藏段。

不——不是一个隐藏段。是一段被声明为”属于”噪声特征采样器、但实际上没有被采样器的任何函数覆盖的内存空间。它被分配了,但它没有被使用。

就像一个被登记为”卧室”的房间,实际上是一扇被墙纸覆盖的暗门。

法尔汉的呼吸停了大约两秒钟。

他没有说话。他直接跳转到那个地址偏移量,用一个十六进制编辑器打开了那片”不存在”的内存空间。

屏幕上出现的不是0x00。不是0xFF。

是数据。编译过的、可识别的二进制代码。

他盯着那片数据,一动不动的,像在看一个不可能出现的东西。然后他运行了一个反汇编器。十六进制代码被翻译成汇编指令,一行一行地在屏幕上展开。他读了最前面的几十行。

那不是一段完整的程序。那是一段配置数据——包含一组路由表条目、一组认证凭据、和一组触发条件。触发条件的核心是一条判断语句:

IF (QKD_CHANNEL_NOISE_PATTERN == 0xA7F3_1C44_9B20_7D81) THEN ENABLE_HIDDEN_ROUTE

法尔汉的手指离开了键盘。他靠在椅背上,发出一声很长很长的叹息——不是疲惫,是一个人花了四十八个小时在沙漠里迷路,终于看到地平线上出现了第一个地标时的那种叹息。

“他把它藏在QKD信道噪声特征采样器的内存段里。“法尔汉说。他的声音沙哑到几乎像砂纸在摩擦,“不是作为代码——是作为采样器的初始校准数据。这个模块在每次固件启动时都会加载一组预定义的噪声特征模板,用于比对实时采样的噪声数据。米兰把嵌套入口的激活条件伪装成了一组’参考噪声特征’。没有人会去检查一段参考噪声特征数据——因为它看起来只是一串随机数。”

陆远站在他身后。他的目光落在那行十六进制的激活条件上:0xA7F3_1C44_9B20_7D81。这个数字看起来是随机的——但任何了解米兰的人都知道,“随机”不是米兰的风格。

“A7F3——“法尔汉也在看着那串数字,“不是随机生成的。这是一个有意义的数字。但我暂时解不出它代表什么。”

“也许不需要解出它的含义,“陆远说,“只需要知道怎么用它。”

法尔汉点了点头。他打开了另一个窗口——他开始分析那组隐藏在噪声采样器中的路由表条目。那不是普通的IP路由表。那是一组针对星链卫星间激光链路和QKD信道的底层转发规则——不是IP层的路由,是物理层的路径选择规则。每一行都指定了一颗卫星的标识符、一条QKD信道的频率偏移参数、和一个”优先级覆写”标记。

这个入口可以做到的事情让人脊背发凉:它可以读取星链网络的完整底层路由表——每一条星间激光链路的带宽和延迟、每一颗卫星的负载状态、每一个QKD信道的密钥生成速率——然后向任意一颗卫星的转发引擎写入新的路径选择规则。

在星链网络中,每一颗卫星都是一个独立的路由节点,它们通过分布式共识协议来协商最佳路径。但米兰留下的这个入口——它不是向共识协议提交建议。它是直接写入卫星的转发规则表,覆盖共识协议的输出。就像在一艘船的自动驾驶系统中,直接扳动舵轮的物理连杆。

谁能使用这个入口——谁就能控制任何数据包在任意两颗卫星之间的物理路径。

“你看看这个——“法尔汉调出了一张拓扑图。他输入了几行测试指令,屏幕上出现了一条新的线路——不是真实的连接,是他在本地模拟环境中用那组路由规则推演出的逻辑路径。一条数据流的轨迹,从一颗掠过南大西洋上空的卫星出发,经过七次星间跳转,最终到达一颗定点在印度洋上空的卫星——全程不经过任何计费审计节点。

“在这个自治域里,“法尔汉说,用手指在空中画了一个圈,“所有落入这个路径的数据包——不受星链计费系统的处理。不是绕过——是完全跳过。计费模块甚至不会看到这些数据包的存在。它们像穿过了一道海关而不需要经过任何边检窗口,因为他们走的是一条没有被绘制在任何地图上的路。”

他停了一下。

“这不是在星链旁边建一个新网络——这是在星链内部切掉一块领土。一块不属于任何人的领土。”

“数据天堂。“陆远说。

法尔汉看了他一眼。他点了点头。

“数据天堂。”


据点里的人在接下来的几个小时里陆续聚集到了主屏幕前。

法尔汉花了大约两个小时,将嵌套入口的激活条件和路由规则整合成一个可执行的操作方案。他在白板上用马克笔画了一张图——不是技术架构图,是一张示意性的概念图:一个巨大的圆形代表星链的核心路由网络,然后在圆形内部画了一个小的、不规则的封闭区域,标着”自治域”。

“不直接攻击星链,“法尔汉用马克笔的笔帽点着那个小区域,“攻击没有意义——十二万颗卫星互为冗余,你可以摧毁一千颗,剩下的十一万九千颗会自动填补路由空白。我们不能物理上摧毁它,我们也不能逻辑上覆盖它——因为星链的共识协议有拜占庭容错机制,恶意路由信息会被大多数节点投票否决。”

他转向所有人。

“但我们能做的是——在星链内部创造一块飞地。一个利用米兰后门在路由层建立的逻辑隔离区。所有落入这个飞地的数据包都不经过星链的计费模块。它们不是被加密隐藏的——它们是被路由规则绕过的。就像一个城堡里的一个房间,卫兵知道它存在,但他们不会进去检查,因为建造城堡的人告诉他们那是一个储藏室。”

有人问:“这个飞地能有多大?”

法尔汉在脑海中估算了一下——然后说出了一个让整个房间安静下来的数字:“初始规模很小。大约相当于一个中等规模的数据中心——几十TB的存储容量和几千TOPS的算力。但一旦建立,它可以通过SkyWalker协议在星链的QKD信道中扩散扩张指令。每一颗被写入新路由规则的卫星都会成为自治域的边界节点,并向它的邻居卫星传播新的规则。如果顺利——自治域可以在大约十几个小时内扩大到覆盖星链总容量的百分之二到百分之三。”

百分之二到百分之三。在绝对数字上,那意味着几百颗卫星的转发规则被重写。几百颗卫星的数据流可以不经过计费系统。

一个数据天堂。哪怕只有百分之二——它已经比任何鸽子网络、任何地下光纤、任何暗网都要大。因为它寄生在星链体内,使用的是星链自己的卫星和带宽——只是不交税。

“但有一个问题。“法尔汉说。他的声音从刚才的兴奋中回落了一些,像一个正在攀登的人在一个陡坡上停下来看了一眼脚下的高度。“这个入口的激活条件——需要我们通过QKD信道发送一组特定的量子态组合。不是普通的噪声空洞——是嵌套入口设计者预设的一组精确的噪声特征模板。如果我们发送错了——入口不会打开。如果我们发送对了——米兰会在他的审计系统中看到一个信号。他会知道我们找到了入口。他会知道我们正在尝试激活它。”

“他会阻止吗?“有人问。

法尔汉没有回答。


贝尔格莱德。

米兰看到警报的时候,是凌晨三点十一分。

他正在书房里重读一份旧的技术文档——不是星链的文档,是华为2049年公开的一份关于CDMA物理层信号指纹的研究论文。他从一个无关的检索中偶尔翻到了它,读着读着就发现自己在重读。论文作者列表的第四位是一个他熟悉的名字:陆远。

他的终端发出一声轻响——不是普通的通知音,是一种他专门为自己设置的特殊频率,低到几乎超出人耳可闻范围,但他设置了它。这个声音只绑定了一件事:他埋藏在QKD信道噪声特征采样器中的那个标志位的状态变化。

他打开审计系统。

在日志的底部,最新的一条记录显示:地址空间 0x7F3A_0400-0x7F3A_04FF——读取尝试。来源:未注册终端。方法:通过QKD信道噪声模板间接访问。成功:是。

他的手指停在键盘上方。

有人找到了。

六年前他花六十三天埋下的种子,在一个所有人都睡着的凌晨,被人用一把他从未见过的钥匙,打开了那扇他以为永远不会被打开的门。

米兰靠在椅背上,看着那条日志,很长一段时间没有做任何操作。他的大脑正在同时处理几种完全不同的情感信号,它们像不同频率的波在同一个介质中叠加,产生了一种他无法命名的干涉模式。

自豪。 有人找到了他埋藏的宝藏。他在固件中藏了二十三处门,其中二十二处被不同的人在过去的六年中发现和利用过——但他们没有一个人走到需要发现嵌套入口的那一步。只有这一次。只有这个人。走到最后一步了。

恐惧。 嵌套入口被激活的可能性意味着——星链的底层路由规则可以被第三方写入。他在设计这个入口的时候就清楚地知道这一点。他在技术上为星链创造了一个可以被利用来分裂自身的工具。如果陆远和法尔汉用它来做他预期之外的事情——他无法关闭它。因为他不在那个自治域的控制回路中。一旦激活,他只是一个旁观者。

如释重负。 这个感觉是他最无法理解的。他在黑暗中坐了很久,试图理解自己为什么会在应该感到紧张的时候感到轻松。然后他明白了——他在漫长的职业生涯中第一次不再是唯一一个知道所有答案的人。有人超越了他设置的层层障碍,走到了他预设的终点。这意味着他的系统不是完美的——也意味着他终于不是那个必须独自承担一切的人了。

他站起来。没有开灯。他走到窗边,看着萨瓦河对岸空无一人的街道。路灯在河水的倒影中扭曲成细长的金黄色条纹,随着水波轻微地晃动。

他在想陆远白天在电话里说过的话。

“你女儿在我这边。而你还爱她。”

他在想那个未寄出的嵌套入口——那个他在夜深人静的时候写出来、锁进一个没人会检查的存储段中、然后告诉自己”这只是以防万一”的东西。

也许他一直在等有人走到这一步。也许他一直在等有人能让他做出一个选择——不是作为星链的首席协议架构师去做选择,而是作为一个父亲、一个在年轻的时候相信技术能解决一切问题、然后在四十七岁这一年发现自己错了的人。

他走回桌前,没有去动那个嵌套入口的激活拦截程序。他可以阻止它——只需要向卫星集群发送一条固件级别的禁用指令,那个隐藏在噪声特征采样器中的额外代码段就会被覆盖。入口会永久关闭。数据天堂会在诞生之前就死在摇篮里。

他没有敲那条指令。

他拿起钢笔,翻开日记。他的笔尖在纸面上悬停了很久,墨水在笔尖处积成一小滴,快要滴落的时候他才开始写。字迹不像平时那样克制——有几个字母的弧度超出了他惯常的书写边界,像一个人在压抑了很久之后终于允许自己的手写出它真正想写的东西。

他们在敲门。

他停了一下。笔尖在纸面上留下一个小墨点。他看着那个墨点慢慢渗入纸纤维,在纸张的纹理中扩散成一个不规则的暗色斑点。

我不知道该不该开门。

他写完这句话之后,合上了日记。没有加日期。没有署名。

他关掉了书房的灯。

但他也没有打开那个拦截程序。

黑暗中,他坐回椅子上。电脑屏幕已经自动变暗,但他在屏幕的边缘能看到那个标志位的实时状态——它仍然是绿色的。绿色意味着嵌套入口没有被正式激活——只是被访问了。陆远和法尔汉还没有做出最后一步操作。

他们在等什么?

米兰在黑暗中忽然明白了:他们在等他做出选择。他们找到了门。但他们不会在门打开之前闯进来——他们在等他亲手把那扇门推开。

因为如果他们自己闯进来,那只是一个漏洞利用。但如果他推开了门——那就是一个邀请。

米兰摇了摇头。在这个没有开灯的房间的黑暗中,他独自摇着头,嘴角出现了一个他自己都没有意识到的复杂弧度——不是苦笑,不是自嘲,更像是一个人在看到一面镜子里映出了自己不愿承认的真相时,那种本能地想要移开目光却又忍不住再看一眼的复杂反应。

他拿出手机。没有通过加密通道——他用了一条最普通的、没有任何防护措施的短信线路,向一个他没有保存过联系人的号码发送了一条消息。短信只有三个字,是他用自己的个人终端发出的——不是星链的官方通讯设备。

发送时间:凌晨 3:47:12。

他想让他在深圳那个地下据点里的对手知道——在门的那一边,有一个人在看着他们。一个还没有决定要不要开门的人。


据点的屏蔽室里,陆远的终端亮了一下。

他拿起来。屏幕上是一条来自未知号码的短信,没有前缀,没有签名,没有安全验证码。只有三个字:

「我知道。」

陆远看着那三个字看了很久。

法尔汉从他身后探过头来,也看到了。他没有问是谁发的——他不需要问。

“他知道我们找到了。“法尔汉说。

“对。”

“他没有阻止。”

“对。”

法尔汉沉默了。据点里的冷却风扇在运转,发出持续的、接近白噪音的低频嗡鸣。远处的某个服务器机柜里,硬盘在读写时发出细碎的咔嗒声,像某种正在内部生长的东西在呼吸。

“他到底在想什么?“法尔汉问。这个问题没有指向任何人,像是一个人在自言自语。

陆远把终端放回桌上。屏幕上那三个字已经暗下去了,但它们的形状还烙印在他的视网膜上——他知道,它们也会烙印在法尔汉的视网膜上。

“他在想怎么回答他女儿。“陆远说。

法尔汉看着他。陆远没有解释。

但法尔汉慢慢地点了点头——不是因为理解了,是因为他选择了相信陆远的判断。在这个所有信号都在被监控、所有数据都在被分析、所有路径都在被计费的世界里,他选择相信一个父亲对另一个父亲的理解。

“距离子衿的医疗授权过期还有——“法尔汉看了一眼墙上的倒计时,“——大约五十三小时。”

陆远点了点头。

“够了。”

他低下头,重新看向屏幕上的嵌套入口激活条件——那一串十六进制的噪声特征模板。他不需要再分析它了。他已经知道它是真实的。现在只剩下一个问题:当他们发送激活信号的时候,米兰会按下那个拦截按钮,还是会让门自己打开?

他想起米娅写给母亲的信。

“告诉父亲,我很好。我不恨他。我只是不能原谅他。”

他想起米兰在那通电话的最后说的那句话——“我一直在等你的电话。”

陆远把那些东西压进意识的深处,重新看向屏幕。嵌套入口的激活程序已经加载到了SkyWalker的发射队列中。他的手指悬在回车键上方,只需要一次按键。

但他没有按下去。

他在等米兰回答自己。在等那个四十七岁的塞尔维亚人决定——他是要当星链的首席协议架构师,还是当一个女儿还愿意给他写信的父亲。

这个选择,不能由陆远替他做。

“先等。“陆远说。

法尔汉看着他,没有问等什么。他只是说:“你确定?”

“确定。他会在窗口关闭之前做出选择的。”

陆远从桌前站起来,走向角落里的折叠床。女儿睡得很沉,呼吸均匀,一只手搭在毯子边缘,手指微微蜷曲着。他在床边蹲下来,轻轻握住那只手。她的小手在他的掌心里显得有些小得不真实——五根细小的手指,皮肤柔软得像一层薄绸,能透过手背看到淡青色的血管走向。

他的女儿。

一个不想让米兰的女儿变成的样子。

他会在那扇门打开的时候走进数据天堂。不是为了自由,不是为了互联网,不是为了推翻什么。是为了让这个握着他的手指的小姑娘——永远不需要在信里写”我不恨你,只是不能原谅你”。

窗外的天空正在从深蓝变成灰蓝。深圳的黎明正在到来。

法尔汉坐在屏幕前,没有合眼。他的目光落在那条未读短信上——“我知道。“——和那个还未按下的回车键。

这三个字像一根绷紧的弦,连接着贝尔格莱德和深圳的黎明、连接着一个还没有被激活的嵌套入口、连接着两个隔着整片大陆对峙的父亲。

线还没有通。

但线已经在他们手中了。

微信公众号二维码

扫码关注微信公众号
阅读更多独家内容