## 第五十章:钟离在暗网上警告闻人屿——有人悬赏"Silence"的真实身份
周三早上闻人屿到公司的时候,桌面上那杯水还在原处。他坐下来先看了一眼那盆绿植,叶片在显示器侧面的冷白光下呈均匀的翠绿色,盆土表面平整,没有被动过的痕迹。他伸手碰了一下最上面那片叶子的边缘,然后把手指收回来,打开了终端窗口。
上午的工作正常推进。两条工单陆续处理完,九点半前后他去茶水间接了杯水。端着杯子往回走,走廊里遇到副主管,手里夹着一个文件夹,两个人错身时各自点了一下头。回到工位坐下,把水杯放到桌面上的时候,口袋里的手机震了一下。他等了两三秒才掏出来看,加密通道一条新消息,发送者钟离。
内容比平时任何一次都短,只有一行字:"你那边有没有收到一个暗网上的新悬赏?"
他放下水杯,在输入框里打了一个"没有",发出去。
钟离的回复大约两分钟后才到,比平时慢。内容是:"有人在一个中等流通量的暗网信息板上挂了一条悬赏,内容是'Silence'的真实身份。赏金金额不低。悬赏方的署名方式用的是一组旧编码,和你之前在'废墟'论坛上见过的某个名字的编码一致。"
闻人屿把这行字读了两遍。他放下手机,拿起水杯喝了一口,水温已经降到接近室温,舌面几乎感觉不到温差。他重新拿起手机:"悬赏帖的发布日期是什么时候。"
"昨天深夜。大约凌晨两点左右。"
"帖子的访问量呢。"
"据我截到的时间窗口内的数据来看,浏览量不超过十次。目前处于低关注度区间。但这个区间不会持续太久。"
"悬赏方的署名编码是哪一组。"
钟离隔了比刚才更长的时间才回。那串简短的字符序列发过来之后,闻人屿在本地记忆中进行匹配——那组编码和他在"废墟"论坛上见过的一个旧ID的注册时间戳尾段完全吻合。那个ID在他停用Silence旧密钥之后不久就注销了,发帖量极少,但他对它的注册时间戳有印象,因为它和他在空帖发布前最后一次使用旧密钥登录的时间点之间存在一个精准的对应关系:那组编码的注册时间戳比Silence密钥的最后一次活跃记录晚了不到二十四小时,且尾段格式完全相同。注册者使用的硬件序列号生成规则,和他那台工作站停用之前最后一次更新系统日志时使用的序列号哈希截取方式一致。
他把手机放在桌面上,靠着椅背坐了一会儿。一个在暗网信息板上挂出Silence真实身份悬赏的人,使用了一组编码规则完全复制他旧密钥最后活跃窗口内产生过的硬件序列号。这个人手里有那台工作站的完整硬件数据,而且已经完成了从设备指纹到系统日志的跨层关联,现在正在把这种关联转化为对当前活跃身份的公开报价。
他重新拿起手机:"那个帖子我目前看不到,因为我不再通过任何Silence关联过的接口访问暗网。你能持续监控它吗。"
"能。帖子的访问记录和评论都会经过我设置的一个被动读取节点。"
"好。"
他把手机放进口袋,站起来去茶水间接第二杯水。走廊里天光和上午一样,冷白色的,在瓷砖地面上铺成均匀的亮层。茶水间那扇窗朝北,窗外的云层压得很低,城市天际线在灰色光线下显得比晴天平一些,像是整座城市被一层滤网压低了对比度。他站在窗边把第二杯水喝完,没有立刻走回去,在窗边多站了一会儿。楼下街道上的车流声被双层玻璃压成一层模糊的底噪,频率均匀,听不出高低起伏。
走回工位后打开内通系统,给南宫珩发了一条消息:"暗网上有人挂了一条关于Silence真实身份的悬赏。发布时间昨天深夜。悬赏方的署名编码和我之前使用过的工作站的硬件序列号签名模式一致。"
南宫珩的回信比平时快:"你收到这条信息的时间是几点。"
"刚才。钟离发来的。"
"悬赏帖的流通量呢。"
"低关注度。浏览量不到十次。"
"发布者使用的那组编码,除了硬件序列号签名模式一致之外,还包含其他可追踪信息吗?"
"包含注册时间戳。和我旧密钥的最后活跃记录时间差不到二十四小时。"
"他是在那段时间里采集了你的硬件指纹,然后把指纹转化成了悬赏方的署名标识。"
"对。"
"你现在不能通过任何Silence关联过的接口访问那条帖子。钟离的监控节点是当前唯一的主动跟踪渠道。"
"对。"
南宫珩那边停了几秒,补了一条:"你现在的设备完全脱离旧密钥和旧通道。你在悬赏帖的发布者看来,是一个和Silence没有当前连接的人。"
"但悬赏帖本身的存在,意味着有人正在把Silence的历史活动和当前活跃账号之间的关联作为商品出售。高关注度只是时间问题。"
"那条帖子在低关注度区间里的流通窗口还能持续多久。"
"取决于暗网信息板的每日活跃用户数和浏览模式。如果浏览量在接下来二十四小时内每周期的增量不超过一定数值,它就不会被推进到更高层级的推荐算法里。"
"那二十四小时是我们目前的可操作窗口。"
"对。"
闻人屿把手机放在桌面上,看着屏幕上最后那行字。二十四小时,从今天上午钟离的预警发出时开始计,到明天上午截止。这条悬赏帖一旦进入高关注度区间,就会被更多暗网用户看到。那些用户中有可能有人同时掌握着他当前活跃账号的某些间接信息,或者有人会把这条帖子和之前关于Silence旧入口监控脚本的活跃记录串联起来,形成一条完整的人物关联链。他需要在二十四小时内做出选择:继续保持完全静默,让悬赏帖因缺乏可关联的后续信号而在低关注度区间里自然下沉;或者通过一条不关联旧密钥的新通道向悬赏帖的发布者发送一个间接信号,让对方意识到自己的目标正在被某个第三方关注,从而扰乱发布者对当前跟踪路径的判断。
他没有立刻决定。先把手机放回口袋,把上午剩余的两条工单处理完,十一点左右站起来去了核心机房。第三组机柜前的操作台上小灯亮着,但没有人坐在前面。他把笔记本从帆布包里取出来接上电源,在本地环境里打开一份新文档,把刚才收到的所有信息按时间线排列了一遍——悬赏帖发布时间、编码匹配关系、钟离的监控节点位置、二十四小时窗口的起止点、以及当前所有可用的行动路径。每一条下面留了一个空白区间,用于标记可能的行动方向。
他在操作台前坐了大约二十分钟。键盘上没有落指,屏幕上的文档也没有再增加新行。那二十分钟里他没有执行任何外部操作,没有产生任何系统日志记录。机房深处的空调出风口发出一层持续的低频嗡鸣,噪声曲线平稳,没有波峰。他的视线落在文档最底部那条空白区间上,脑子里把所有可能性来回走了两遍,没有发现新的变量。
他关掉了文档,没有保存。合上笔记本放回帆布包里,站起来走出机房。走廊里依然没有人。回到工位坐下来,从口袋里掏出手机,加密通道里有一条新消息。钟离发来的,内容只有一行:"悬赏帖在二十分钟前被一个人点开并停留了大约七分钟。停留时长超过普通浏览。"
"那个人的访问方式有什么特征。"
"访问用的节点是公开跳板,但跳板末尾的物理终端特征码和我之前在一组历史数据里见过的某个配置一致。那组历史数据来自你移交工作站之前最后一次活跃的记录。"
闻人屿看着这行字。一个访问者点开了悬赏帖,停留了七分钟,使用的物理终端特征码和他移交之前的工作站最后一次活跃的记录中的某组配置一致。那个配置和他那台工作站上运行的最后一条脚本的日志残留中的终端标识码段完全匹配——那条脚本是他用来清理旧密钥所有关联路径的最后一次操作,执行时间点正是移交工作站的当天上午。访问者使用的物理终端特征码和这条清理操作的日志残留中的终端标识码段完全一致,意味着这个人不仅拥有那台工作站的硬件数据,还拥有那台机器在最终停用之前产生的最新操作日志的访问权限。他手里的数据不限于硬件指纹,还包括Silence最后阶段的全部活跃记录。
他把手机收进口袋,伸手碰了一下桌面上那杯水的杯壁。杯壁温度和室温一致,不热也不冷。窗外的天光在上午向中午过渡的时段里呈现出一种稳定的冷白色。他坐在那里,手指搭在杯壁上,感觉到皮肤温度和杯壁温度之间没有温差,热量没有向任一方向传递。
午休时他没有下楼。从抽屉里翻出一片早上带来的面包,撕成小块慢慢嚼完,把包装纸揉成团扔进垃圾桶。拿起水杯喝水的时候手机震了一下,南宫珩的消息:"我刚才通过一条不关联任何历史通道的路径做了一次对悬赏帖所在信息板的底层结构扫描。扫描结果显示,那条帖子的发布时间戳后缀中嵌入了一组缩写码,缩写码对应的工作日是我移交工作站之后的某一天。这个帖子是在我发给你之后才生成的。"
"你看到那组后缀了。"
"看到了。"
闻人屿盯着屏幕上的那行字。如果发布者在生成悬赏帖时才嵌入那组缩写码,说明他在发布前最后一次接触这批数据的时间点远晚于采集硬件指纹的时段。这不再是一次性的历史数据泄露——发布者手里的数据集是活的,他在持续维护它。
"你是在看到后缀之后才决定扫描信息板底层结构的?"
"是的。"
"扫描到了什么。"
"重组者的归档格式中有一组文件名后缀的结构特征,和顾言舟在会议中打开过的那份空白文档的标题命名规则一致。他在同一套系统里工作,用同一套规则来处理同一组数据。而那组数据和Silence有关。"
闻人屿把这段话读完。他坐了很久,久到窗外的光线从冷白转为偏灰,久到桌面水杯里的那层水面因无人触碰而彻底静止成一面没有波纹的圆镜。他的手放在桌面上,没有握任何东西,指腹贴着桌面材料的表面,能感觉到一层极轻微的颗粒纹理。
悬赏帖的发布者、顾言舟、旧入口监控脚本的运维者、以及那组文件名后缀的结构特征——四条线索在完全不同的时间点从完全不同的方向切入信息空间,但它们所用的数据处理规则出自同一个人的操作习惯。"重组者"这个标签现在可以贴在一个具体的人身上了。他在用顾言舟的工作习惯重组Silence的数据。
他把手从桌面上抬起来,重新拿起手机。南宫珩的那行消息还停在屏幕中央。他对着那行字又看了一遍,然后拉动对话框往上翻,把整段对话重新读了一次。钟离的预警、硬件指纹的匹配、七分钟访问者的终端特征码、南宫珩的底层扫描、后缀中嵌入的缩写码、文件名命名的结构特征——每一条信息都指向同一个方向,指向同一个仍在活动的人。
他放下手机,站起来走到窗边。窗外的云层比上午更低了,灰色的,压在城市的天际线上面,没有雨,但光线被云层滤掉了一层强度,照进走廊的时候边缘变得模糊。他站在那里没有动,两只手垂在身侧。走廊里偶尔有人经过,脚步声从一端响到另一端,然后消失。没有人停下来和他说话。
他回到工位坐下来。手机屏幕已经自动锁了,他按亮看了一眼时间,下午两点不到。钟离的监控节点仍在运行,那条悬赏帖还挂在信息板上,浏览量没有显著增长。二十四小时窗口目前还剩大约二十个小时。
他重新打开笔记本,连上电源,但没有打开任何通信工具。他在本地环境里新建了一个空白文档,这一次他保存了。文档里什么都没有写,只有一个文件名,用的是他之前在那份排列了所有信息的文档底部预留的空白区间旁边想到的一个命名规则——和任何旧通道无关,和任何已知的命名习惯无关,是一组在他脑子里刚刚生成的随机字符。他把这个空文件放在桌面上一个不起眼的文件夹里,然后关掉了笔记本。
他没有通过任何渠道向那条悬赏帖发送信号。那个动作还没有发生。但他确定了动作的方向、时机和载体形式。它不需要是一封消息,不需要是一条回复,不需要在悬赏帖的评论区留下任何可以被计数为访问量的记录。它只需要在悬赏帖底层数据流经过的低关注度区间里放置一行极其微弱的信号变更,缓慢抬升发布者收到反馈时的感知角度。就像一辆停着没有熄火的车,在空挡状态下被人轻轻拨了一下方向盘的边缘,不需要行驶就能产生一次肉眼不可追踪的修正。他不需要那辆车开动,只需要它停在原处时,底盘朝向偏了一度。发布者在下次检查这辆车的时候,会注意到它似乎和记忆中的停放角度不太一样,但又找不到被移动的痕迹,于是他会花更长的时间来重新确认它是否安全。而这多出来的确认时间,就是闻人屿需要的那一点空隙。
他坐在那里,手指搭在键盘边缘,在桌面下方的暗处停了一拍。他没有伸手去碰键盘。那道修正还没有执行,但它开始的位置已经确定,就在他指腹下方这片静止的空气里。下一步要做的是等——等一个精确到秒的窗口,等钟离的监控节点返回下一次数据流扫描的结果,等那个七分钟的访问者会不会再出现。他把这些可能性的次序在心里过了一遍,然后把手从键盘边缘移开,放回桌面上。
窗外的天光移动到了偏西的位置,在桌面边缘收束成一道窄窄的亮线。水杯里那层水面依然静止,倒映着天花板上日光灯管的轮廓,一条细长的白色光带,没有抖动。他感觉到自己体内那个"不知道它是什么类别"的信号旁边,多了一个他能清晰命名的东西——那是他在比对重组者的数据处理规则和顾言舟的工作习惯时,发现两者之间的重合度已经覆盖了超过一半的操作特征。剩下那一半他没有证据,但他也不需要证据来做出下一步的判断。发布者是同一个人,这一点在他的判断系统里已经完成了从"可能"到"确定"的跃迁。他现在只需要证明它,而证明的方式不是收集更多的数据,而是让对方在回看那条悬赏帖的时候,觉得它从始至终都只值那个低关注度的位置。
他靠回椅背,两只手平放在桌面上,手掌朝下。走廊里的脚步声又响了一次,由远及近,然后停在了某处,像是有人走进了茶水间。然后又是安静。他坐在那片安静里,没有看手机,也没有看笔记本的屏幕,只是坐在那里,等那个窗口出现。那条悬赏帖还活着。那个重组者还活着。但闻人屿坐在那把椅子上,手指维持着放松的姿态,没有多余的动作,他的判断已经完成了,剩下的只是执行和等待。
水杯里的水面持续静止着。那道窄窄的亮线在桌面边缘停留了大约二十分钟,然后缓慢地移出了桌面的范围,落到了地板上。下午的光线在移动中逐渐变灰变薄,城市的轮廓在窗外收成了一层剪影。闻人屿没有去开灯。他在逐渐变暗的工位上坐着,手指依然平放在桌面上,呼吸平缓,视线落在水杯的杯壁上。杯壁上没有凝结水珠,因为水温早就和室温一致了,透明玻璃的表面在暗下来的光线里呈现出一种几乎察觉不到的微光,像一层薄薄的釉。
他知道那行信号变更会在什么时刻放置下去。那个时刻还没有到,但它的坐标已经在他的时间轴里被标记出来了——在他把新文档保存下来的那个瞬间,他脑子里已经生成了一组时间参数,和文件名中的随机字符绑定在一起。接下来的几个小时他什么都不需要做,只需要让现有的一切保持原样。不访问任何异常路径,不生成任何新日志,不在任何设备上产生任何可以被归类的操作信号。他的存在在数字层面上变成一条平直的水平线,没有任何起伏。而那条悬赏帖下方的低关注度区间里,有一个极其微小的数据位会在预定的时刻翻转一次,幅度轻到连信息板自身的监控算法都不会把它标记为异常,但发布者如果足够仔细,会在下一次手动查看帖子时察觉到那一点偏离。
他坐在那里,等那个时刻自己靠近。