## 第十一章:闻人屿的选择——不揭发,不沉默
周六醒来时,手机屏幕上躺着一封新邮件。屏幕亮度刺得他眯了一下眼。邮件来自"废墟"论坛的系统通知,内容是"您关注的匿名帖子已被删除"。他没有点开,那封代码信早已过了二十四小时自动清除的期限,这封通知不过是系统例行的确认回执。他把手机搁回枕头边,闭眼躺了一会儿才坐起来。
窗外的天光比上周六暗一截,云层压得很低,像要下雨又还没下定决心。他起床洗漱,烧了壶水冲了杯速溶咖啡,端回桌前慢慢喝。咖啡的苦味在舌尖铺开,他低头看着杯口的热气往上走,脑子里把今天要面对的几件事重新过了一遍。
上周那条线走到今天,已经形成三条清晰的路径。顾言舟那条在收缩,机房留下了指向闻人屿工号的授权令牌,顾言舟又用新账号回头修补自己之前留下的痕迹。南宫珩那条在推进,行为模式分析排除了闻人屿的直接嫌疑,但真凶还没锁定。神秘短信那条在模糊——发件人知道"写入通道"的存在,并且出手阻止外人碰它,发送时间和顾言舟的行动节点有重叠。
三条路径的交点都落在他身上。他如果再动一步,任何一方都能顺着那道轨迹追踪到他的位置。但完全不动也不行,闻人正阳的倒计时只剩四天,顾言舟下一次出手的窗口随时可能弹开,南宫珩那边对他的评估还悬在"尚未排除但也不是嫌疑人"的灰色地带里。
他需要一个办法,在这块灰色地带里放进一样东西——一个足够精确的信号,让南宫珩看见之后能自己识别出"顾言舟"这个答案,但又不暴露闻人屿掌握完整情报链的事实。更关键的是,这个信号的制造者必须是一个"按理说不该知道这么多"的人。而如果南宫珩把这个信号和Silence重叠在一起,那条线索反而自己长出了合理性。
他喝完最后一口咖啡,杯子在水龙头下冲了冲,打开工作站。
先调出那把刀的运行日志,把顾言舟的入侵行为链从头到尾捋了一遍。时间戳,操作指令,数据包流向,授权令牌的生成方式和调用记录。然后是那条路径重定向指令的部署痕迹,再是他通过嗅探工具捕获到的加密通讯脉冲的时间点和基站位置编码。所有这些合在一起,已经构成了一条从顾言舟到机房、从机房到后门脚本、从后门脚本到加密通讯同伙的完整证据链。
他不会把这条链完整地亮出去。
新建了一个空白代码文件,光标在标题栏里闪了两下。他想了想,在文件开头敲了一行注释:/* silent witness */。然后停下来,喝了口水,重新开始敲。
写的是一段看起来像系统诊断工具的脚本,功能是遍历指定目录下所有日志文件,提取和"凌晨维护窗口"、"外部跳板IP"、"授权令牌签发"相关的关键字,生成一份汇总报告。代码本身干干净净,像一个普通运维人员随手写的排查工具。
但在变量命名里,他埋了另一样东西。
每一组日志读取操作的前缀变量,他依次用了三个字母的组合:第一组用"vy",第二组用"an",第三组用"zy",第四组用"ou"。连起来是"vyanzyou",去掉中间两个多余音节,剩下的是"vanyou"。"言舟"的拼音在键盘上对应的键位组合是"yan zhou",经过一次凯撒位移和一次位序调换之后,恰好会变成"vanyou"。
这段脚本在正常阅读层面只是一个技术工具。但任何一个看过十二年前那场对局日志片段的人,如果足够仔细地拆解变量命名的规则,就会看到一个人名浮出来。南宫珩手里有那份日志的完整副本。
他写到最后一行,从头到尾读了一遍。逻辑完整,语法没毛病,输出的报告格式也是标准样式。一个技术主管看了会想"这个实习生写了个实用的工具",而南宫珩看了会多拆一层。
保存时用的文件名和"天枢"毫无关联——"network_diag_tool_v2.py"。然后他打开内部通讯系统,找到南宫珩的对话框,发了一条消息过去:"我写了一个日志排查的工具脚本,可以帮你筛出凌晨维护窗口期间所有异常操作记录。你要看一下吗?"
他发送的时候扫了一眼时间:周六上午九点四十七分。这个钟点发工作消息在旁人眼里显得稍微积极了点,但不会超出"实习生想在领导面前表现"的正常范围。他要的就是这种普通的、主动的技术支持提议。
南宫珩那边没有立刻回。闻人屿把对话框最小化,站起来把窗户推开一道缝透风。冷空气从缝里灌进来,桌上的便签纸掀了一下角。窗外确实在飘雨了,很细,落在窗台上只留下一层看不分明的水痕。他站了大约一分钟,把窗户重新合上。
十点零二分,内通系统闪了一下。南宫珩的头像旁边弹出一条消息:"发过来。"
他把脚本打包成压缩文件,通过内通文件传输通道发了过去。传输条走了几秒就走完了,对面接收后对话框安静了大约六分钟。六分钟里他盯着那个黑色方块头像,没动,也没切窗口。雨丝在窗外斜着落,有几滴粘在玻璃上,慢慢往下淌。
六分钟后南宫珩发来一行字:"脚本写得很干净。变量命名有点特别。"
闻人屿看着这行字,手指在键盘上停了大约两秒。南宫珩注意到了变量命名。"有点特别"这个表述,语气在技术评价和个人观察之间踩着一道平衡线——不显得过于深入,也不像完全没有察觉。据此他判断,南宫珩已经拆出了第一层信息,但还没完全确认那些变量拼在一起指向的具体人名。他至少还需要做一次交叉验证,把这段脚本里的变量规律和他脑中存储的那份旧日志比一下。
他回:"习惯用缩写做命名区分。写多了不好改。"
南宫珩没继续追问变量命名的事。他转了话题:"这个脚本你跑了多少数据量?"
"机房终端机的只读日志做了一遍,大概覆盖了上周一到周五的全部记录。"
"跑之前跟运维组报备过吗?"
"没有,我用自己的只读权限在自己机器上跑的,不影响生产环境。"打完这行字后他顿了一下,补了一句,"如果有问题你可以直接删掉脚本,我没留副本。"
那边停了大概十几秒。弹出来一行:"脚本我留着。你继续。"
对话框安静下来。
闻人屿关掉内通窗口,从椅子上起身。他走到厨房给自己倒了杯水,站在窗边喝着看雨。雨比刚才密了,落在对面楼的空调外机上发出细密的嗒嗒声。空气里的湿度被风裹着从窗缝里渗进来,凉而润。他喝完水,杯子搁在台面上。
重新过了一遍刚才那条消息的措辞。"脚本留着。你继续。"南宫珩没问他"你为什么要写这个",没质疑权限边界,没要求额外解释。他只是收下了那个工具,给了一个"继续"的许可。这个许可本身说明变量命名里的信息已经被接收了,对方正在消化它。
"继续"的意思是在这条路线上保持通讯通道开放,下一次对话会基于这个脚本里提取出的信息展开。而顾言舟的名字会在那场对话里浮上来。
他把窗台上那盒润喉糖拿过来含了一颗。薄荷的凉意和窗缝里渗进来的冷空气混在一起,他微微眯了一下眼。今天是他穿进这个世界以来第一个真正意义上"没有在防守"的白天。他没在防顾言舟的下一步,也没在防南宫珩的突然查问。他做了一件主动的事,把一条线索塞进了一条缝隙里,然后等那头自己的齿轮转起来。
雨下到中午时小了一些,变成朦朦胧胧的雾状雨丝。他煮了碗速食面当午饭,端回桌前慢慢吃完。面条的热气把面前一小片空气蒸得暖融融的,他吃得很慢,每一口都嚼够了才咽。面汤喝完后碗底余了一层薄薄的油花,他把碗洗了,水槽边沿溅到的水渍也顺手擦干净。
下午两点左右,加密消息通道闪了一下。钟离。内容只有一行:"你那个内通对话的内容被扫过一次。来源IP是总部,端口指向技术部的审计专用通道。有人在你和对面说话的时候捕获了那条对话流的元数据,但内容本身是加密的,没泄露。"
闻人屿看着这行字。内通系统对话内容是端对端加密的,元数据被扫描只说明有人在监控总部技术部的内部通讯流量,而不是有人在监听他和南宫珩的具体对话。这意味着总部内部有一个监听层存在,级别很高,高到可以无差别扫描所有经过内通系统传输的消息元数据。
他回:"看到是谁扫的吗?"
"溯源被截断了。但截断的层级在审计通道的上游,不是下游。扫的人权限很高,高到可以调用审计通道的主干带宽。"
闻人屿把这条信息归档。"上游"意味着扫描行为的发起方在审计系统的管理端而不是使用端。能调用主干带宽的人级别至少和南宫珩持平,甚至更高。也就是说,南宫珩集团内部的权力结构并不是铁板一块,存在高层之间的互相监视。这个监视层此刻也注意到了他和南宫珩之间那条逐渐升温的通讯流。
他回钟离:"收到。你那边留意一下这个扫描频率。"
钟离回了一个"嗯",通道自动关闭。
下午剩下的时间他整理了原身硬盘里那份"天枢"架构分析草稿,把最近几天观察到的新信息用注释的形式补了几条进去。草稿的边框被他写满了缩写的箭头和简笔符号,从外面看像一份被反复批注的技术随笔。他把补充内容和那份完整结构图做了合并,生成了一个离线版的综合档案,用三层加密压缩后存进外置硬盘里。
合上电脑后他靠着椅背坐了一会儿,雨又大了些,打在窗玻璃上的声音密度在增加。他想起顾言舟坐在他隔壁工位的那一个月。那个人偶尔会带两份早餐来公司,一份自己吃,另一份放在桌上说"多买了"。闻人屿当时没怎么在意——顾言舟在办公室里一直是那副温吞样子,说话慢半拍,开会坐最后一排,被组长点名时肩膀会先缩一下才开始答。现在回想,那些"多买了"的早餐也许只是障眼法的一部分。人和人之间的远近,有时候藏在一份多出来的三明治里。
晚上七点多雨停了。他从抽屉里翻出一把折叠伞塞进帆布袋侧袋,下楼去便利店买一盒新牛奶和两包速食粥。收银台后面坐了个年轻女孩,低头看手机,不是上周那个中年男人。他扫码付钱时她连头都没抬。拎着塑料袋走回楼道,四楼声控灯亮起时他听到自己脚步在楼梯间里的回响,空荡的,干净的。
进门后把牛奶放进冰箱,粥放在桌上,换了拖鞋。手机亮了一下——内部通讯系统的新消息提醒。他拿起来点开,南宫珩的头像旁边显出一条新消息,发送时间就在三十秒前。
"你那个脚本跑出来的日志里,凌晨维护窗口期间有一条对外访问请求。目标IP的三层跳板路径和上周末我查到的另外一组异常流量吻合。"
闻人屿看着屏幕。南宫珩已经把顾言舟的那次入侵和他之前查到的异常流量连在一起了,但还没提到变量命名拆出的具体人名。他现在需要的不是替他把答案说出来,而是给他一个可以把答案落上去的框架。
他回:"那组异常流量的操作时间段有没有和某个账号的活跃时间重叠?"
"重叠了。有一个账号在两组流量出现的时间段内都有登录记录。"南宫珩停了几秒,补了一句,"账号归属人是技术部的正式员工。顾言舟。"
闻人屿看着屏幕上弹出来的那三个字,手指没有动。没有回"我知道了",也没有回"原来是他"。他只是沉默,在那个名字浮出水面之后安静地停在那里。
南宫珩又发来一行:"你怎么看。"
"我之前跟他同桌坐了一个月。没有发现什么异常。"这是事实。以闻人屿的视角,一个"笨拙的实习生"不会注意到隔壁工位的同事在背后做的那些事。他打出这行字时语气压在了"惊讶但不慌乱"的区间里,不深不浅。
南宫珩没有继续这个话题。最后一句:"下周一到公司之后来找我。总部,四十六楼。"然后头像暗了。
闻人屿把手机搁在桌面上。他看着那个黑色方块头像下面显示的"离线"状态,然后拿起杯子喝了口水。雨后的空气从窗缝里渗进来,凉而润,带着泥土和植物被水浸透后的气息。他靠在椅背上,把今天所有的线在脑中重新排了一遍。
写了一段脚本。脚本里埋了一个只有南宫珩能读出的名字。南宫珩读出来了,顺着那个名字查到了顾言舟的登录记录和时间重叠。现在那个人约他下周一去总部四十六楼,顾言舟的入侵行为已经暴露在了总部的技术视野里。
他没有揭发——从表面上看,他"没有掌握任何证据"。他只是写了一段脚本,变量命名"有点特别"而已。他也没有沉默,因为脚本里的变量排布像一道看不见的声波,穿过了内通系统的加密通道,准确抵达了接收端。
那条路径是干净的。干净到南宫珩在对话结尾用"你怎么看"三个字来问他。那个问句本身就是一个信号:他在征求闻人屿的意见,在把他从"观察对象"往"对话伙伴"的方向移动了一小格。
他站起来去刷牙。水声在安静的房间里流动,他对着镜子把牙膏泡沫吐掉时看到自己嘴角带一个很浅的弧度,几乎看不出来。他用毛巾擦干脸,关了浴室的灯走回卧室。
躺下后侧过身,看着窗帘缝隙里透进来的路灯黄线。雨后的光比平时更柔一些,在地板上画出一道模糊的暖色。他闭了一会儿眼,然后重新睁开,手伸到枕边摸到那盒润喉糖,取了一颗含在舌下。
薄荷的凉意漫开时,脑中最后一帧画面是那个对话框里的"顾言舟"三个字。它在屏幕上静止地亮着,白底黑字,没有任何修饰。他在那帧画面前合上了眼。
糖的边缘在舌下慢慢化薄,滑而凉。他含了一会儿,翻了个身,把脸埋进枕头里一点。外面的路灯黄线在地板上维持着那条暖色的长条,没动,也没灭。雨彻底停了之后,窗外的风安静了很多,只剩下很轻的、从远处街口转过来的车声,隔了几层楼板和墙壁传进来,已经模糊到像另一种频率的白噪音。
他想起今天一整天没看手机上的时间超过三次。这在这个世界里几乎算是奢侈。之前每一天都在盯秒数——顾言舟的授权令牌在什么时间被调用,南宫珩的日志查询在什么时间触发,闻人正阳的倒计时屏幕上的数字又少了几格。今天不一样。今天他在等别人往前走,而不是自己往前冲。
润喉糖彻底化没了。舌根留下一丝薄薄的凉,像被冷水轻轻贴了一下又拿开。他翻了个身面朝天花板,黑暗中能看到天花板角落有一道极细的裂纹,从灯座边缘延伸出去大约二十厘米就停了。这几天他每晚躺下时都会看见那道裂纹,今晚是第一次觉得它可能早就存在了,和最近发生的一切没什么关系。
他闭眼。睡意来得不算快,但来得很稳,像水慢慢涨过一块石头,四面合拢之后就不剩什么空隙了。