## 第二十三章:闻人屿暗中修改防御代码,让入侵者“进来但拿不走”
周五早上闻人屿醒的时候天已经大亮了。窗帘缝隙里挤进来的光线比前几天都白,带着一种入冬前特有的那种冷冽感,落在被面上像一层薄薄的霜。他翻了个身,摸到手机看了一眼,八点四十分。屏幕亮起来的时候眼睛被刺了一下,他眯着眼把亮度调低了一档,没有立刻起来,就那样侧躺着,把昨晚的经过从头到尾顺了一遍。
凌晨两点零二分,抓包完成。四层嵌套加密,文件大小零点几兆,解码预计在今天下午。他花了大约一分钟把这些信息归位,脑子里没有再额外冒出什么东西来,于是坐起来,把脚伸进拖鞋里,去洗手间洗漱。
到总部的时候九点半。大堂里人不算多,周五的缘故,早高峰已经过了。他取出那张临时调令,在闸机上刷了一下,机器发出一声短促的嘀,绿灯亮起来的时间比普通工卡稍短了那么一瞬。他留意到了,但没有停顿,直接穿过闸机。
按照南宫珩昨晚在消息里说的,他去了四十六楼旁边的一间休息室。那间屋子不大,一张灰色布艺沙发靠墙放着,对面是一张小茶几,表面有轻微的划痕,像是被人搁过不少次水杯。墙角有一台空气净化器在低档运行,出风口对着沙发方向,气流带出来的风很轻,不仔细感觉几乎察觉不到,只听到一种细密、平稳的白噪音,像很远处的雨声。
他把帆布包放在沙发旁边坐下,没有开电脑。包里的充电线和笔记本都没拿出来,他就只是靠着沙发背,把眼睛闭了一小会儿。空气净化器送出来的风经过他脸颊的时候带着一点凉意,算不上暖和,但也不至于冷得让人坐不住。
休息室的门隔音一般。走廊里偶尔有人经过,脚步声从门缝下面滑过去,不重,有时候是皮鞋,有时候是软底鞋,走过去之后就消失了,没有多余的声音。他坐在那里呼吸放平,刻意没有去想解码结果会是什么,也没有在脑中推演各种可能性。他只是安静地等,像把一块石头放在河床上,让水流自己从上面经过。
十一点左右,手机在茶几上震了一下。
他拿起来看,是内部通讯系统的一条消息,来自南宫珩。消息不长,他用拇指点开,扫了一遍正文,然后又从头看了一遍。南宫珩写的是:"解码拆了一层。内容是核心机房底层固件的配置文件片段,但其中有一段指向写入通道的授权路径。我不确定它是旧的残留还是新的映射。"
闻人屿把手机握在手里,没有立刻回。他盯着"旧的残留"和"新的映射"这两个选项看了一会儿,然后打字回过去:"那一段的写入时间戳是多少。"
他发出这条之后手机放在膝盖上等着。南宫珩那边隔了大约两分钟才回,时间长到闻人屿下意识地看了一眼信号格,确认通讯正常。"时间戳被伪造过。表面显示是六个月前的一次固件更新,但文件的元数据里嵌了一个时钟偏移标记,偏移方向和之前顾言舟在维护窗口期间用过的手法一致。"
闻人屿看到这一行的时候,手指在手机侧边停了一下。
如果表面时间是六个月前,而时钟偏移的手法与顾言舟之前用过的一致,那这条所谓的"旧文件"大概率不是六个月前留下来的东西。它更像是近期被放入系统,然后反向伪造了时间戳,让它在日志里看起来像一件无关紧要的旧物,混在大量固件更新的历史记录中间,不仔细根本翻不出来。
他打字:"所以他是把自己刚放进去的东西伪装成半年前的旧文件。"
"对。这个伪装手法意味着他准备的不是一次性操作,而是预设了一条长周期的控制通道,可以在未来多个时间点上反复利用。"
闻人屿把这两条对话连在一起看了一遍。顾言舟埋的那个静默标记在今天凌晨传输了一份加密数据,解码后发现是一段伪装成旧固件文件的配置文件,配置文件的路径指向了写入通道的授权路径。这意味着顾言舟在被调离之前不仅埋了一个标记,还同时配置了一条底层授权映射,只是这条映射没有被激活——它处在一种预备状态,等待数据包被成功传输之后才会变成有效通道。
他把这条逻辑链在脑中又跑了一遍,确认没有遗漏某个环节,然后继续打字:"那条授权路径现在是活跃状态吗?"
"还没有。数据包传输完成后,授权路径的映射关系已经更新了系统底层的一个权限表。但更新后的权限表处于'待激活'状态,入口被锁定,需要另一组密钥来打开。"
另一组密钥。闻人屿把"另一组密钥"和之前闻人正阳发来的那条"K已经到了"放在一起。如果两边说的密钥是同一组,那顾言舟预设的通道和闻人正阳那边的交接就会在同一条授权路径上汇合。这也就意味着,顾言舟和闻人正阳虽然处于不同的执行层面上,但他们的最终目标指向了同一个技术入口。
"那组密钥现在在我这边。"他打字给南宫珩,"闻人正阳告诉我'K'已经到了。"
南宫珩这次回得比刚才快,大概只有十几秒:"你拿到具体内容了吗?"
"没有。他说'在拿'的时候是通知我状态,不是给我内容。但根据传递流程,下一次见面的时候我会拿到密钥本体。"
"你把见面时间往前推一下。今天下午或明天上午。"
"我试一下。"
他退出内通界面,打开短信。闻人正阳上次联系他的那个号码还在最近通话记录里,他点开之后打了一行字:"密钥内容什么时候能给我。"
发完之后他把手机放在茶几上,没有盯着屏幕等。他从沙发上站起来,走到窗边。休息室的窗户朝南,外面的城市天际线在云层下面呈现一种偏灰的色调,楼宇的轮廓被中午的光线磨去了棱角,变得不那么锋利。风从玻璃外面经过的时候带起一阵极轻微的震动,他指尖搭在窗台上,能感觉到那股震动隔着玻璃传过来,像什么东西在远处的心跳。
他在那里站了一会儿,听到手机在桌面上震动了一声。他转身走过去拿起来看。
闻人正阳的回复很短,只有一行字,没有称呼,没有废话:"明天下午。老地方。"
他回了一个"好",然后把这条消息截屏,存进了加密笔记里。截图的时候他的拇指在屏幕上压了一下,确认截到的画面只包含那行字和收信时间,没有多余的信息。
重新打开内通对话框,他把那条消息转给了南宫珩:"明天下午。老地方。他会给我密钥内容。"
对面隔了大概十秒才回。先跳出来的是两个字:"知道了。"然后过了片刻又跟进来一句补的,像是发完主句之后想了想又加上的:"解码的工作还在继续,剩下三层拆完了我会把全部内容发给你。"
闻人屿看着这两条消息之间隔着的间歇,把手机放回了口袋里。那十秒的空当不知道南宫珩那边在做什么,但闻人屿没有追问。
中午的时候他下楼去买了一个饭团和一杯热豆浆。饭团是金枪鱼口味的,便利店加热柜里拿出来的,外面裹着的海苔已经有些发软。他坐在休息室里慢慢吃完,热豆浆从杯口溢出来的蒸汽升起来,在窗边的那片光里散开又消失。午间的天光短暂地亮了一小会儿,云层中间开了一道缝,阳光斜着切进来,在地板上铺了一片暖色的四边形,但不到二十分钟那道缝又合上了,云层加厚,颜色从灰白变成铁灰,像是要降温。
他吃完之后把包装纸和杯子收拾好扔进垃圾桶,靠着沙发坐了一会儿。空气净化器的白噪音还在响,他听着那个声音,没有在想什么特别的事。
下午两点多,手机又震了一下。他以为是解码的新进展,拿起来一看是南宫晚棠发来的一张照片。照片拍的是窗台上放着的一盆小绿植,盆是素烧的陶色,叶子不大,但一片片从茎上撑开来,在背光的条件下呈现出一种半透明的翠绿,叶脉的纹路在光里清晰得像一张细密的网。她配了一行字:"今天路过一家花店,看到这盆觉得很适合放在办公室。"
闻人屿看着那张照片,拇指在屏幕上停了一下。他认出那是一种多肉类的植物,但叫不上名字。秋天快过完了,外面路上能看到绿色的东西确实越来越少了。
他回了一行:"你的办公室?"
"不是,我觉得放在你们十六楼茶水间窗台上挺好的。这个季节还能绿的东西不多了。"
他盯着"还能绿的东西不多了"看了片刻。十六楼的茶水间他每天至少去两趟,饮水机在那边的墙角,窗台朝北,采光不算好,但散射光勉强够养活一些耐阴的东西。
他回了一个"确实",然后退出了对话框。没有多打一个字。
下午四点半,他收到了南宫珩发来的一份完整解码报告。正文很简洁,条目式的,没有多余的解释。第一条写着:"原文件包含六段配置数据,其中五段属于常规固件维护参数,第六段指向写入通道的底层权限表。"第二条:"权限表的更新状态为待激活,入口锁定机制与外部密钥配合。"第三条:"文件尾部附带了一段注释,内容为一组坐标编码,解码后对应城西某片工业区的一栋楼。"
闻人屿读到第三条的时候,把手机往自己这边转了转,让屏幕亮着放到膝盖上。城西工业区。他记起之前南宫珩提到过闻人正阳所在的数据服务商同层机房的位置,两个地址隔了大半个城区,完全不在同一片区域。顾言舟在这条信息里留了两条不同的物理地址线索,一条和已知的买方路径有重叠,另一条指着一个完全没出现过的地方。
他打字:"那个坐标地址你查了吗。"
"查了。那栋楼是城西工业区的一个旧仓库改造的办公空间,登记在案的租户是三家不同类型的贸易公司。三家公司的法人信息在工商登记里没有直接关联,但其中一家的注册时间恰好和顾言舟入职南宫集团的时间间隔只有两周。"
两边的距离是两周。闻人屿在脑中把这个时间差搁了一下,没有做任何判断。可能是关联,也可能只是巧合,但在这个系统里,两周的间距一般不足以被称为巧合。
"你打算怎么处理那个仓库地址。"他问。
"先不处理。让那条线先保持原样。如果顾言舟在那栋楼里还有活跃的同伙,我去查仓库会被他们感知到。在那之前,我需要先确认那条权限表被激活之后的完整流向。"
"你准备用明天下午我从闻人正阳手里拿到的密钥来激活它?"
"对。在受控环境下激活一次,看它的流向终点落在哪里。"
闻人屿把手机放在茶几上,靠着沙发背闭了一下眼。明天下午他将从闻人正阳手里拿到密钥本体,然后南宫珩会在受控环境里用这个密钥激活那条权限表,追踪数据流的终点。两个不同的来源在同一条授权路径上汇合。汇合之后的方向只有两种可能:如果终点是那个仓库地址,就证实了闻人正阳的买家和顾言舟背后的势力是同一条线;如果终点去了别的地方,就说明这条链上至少有两组独立的客户在竞争同一条技术通道。
他在沙发上坐了一会儿,然后睁开眼。窗边的光已经从他进来时的角度移开了一大段,在地板上投下一片偏灰色的影区,边缘模糊不清。他站起来收拾好东西,把帆布包的带子搭在肩上,出了休息室往电梯方向走。
经过四十六楼走廊的时候那扇深色木门是关着的。他经过时脚步没有放慢也没有停顿,就只是走过去,脚步声在走廊的地毯上被吸掉了大半,安静得像什么都没经过。
回到十六楼的时候已经快到下班时间了。工位上堆着几条下午积压的简单工单,他坐下来处理完了,内容无非是一些状态确认和权限复核,手指在键盘上敲了不到二十分钟就清空了待办列表。然后他等到六点,收拾东西离开。
走出写字楼的时候天已经黑透了。风比白天冷了不少,刮过来的时候带着一种干燥的、接近冰点的锐利,他从外套口袋里摸出拉链头,把拉链一直拉到领口顶端。快步走向地铁站的时候呼出来的气在面前凝成白色的雾,散得很快。
地铁上人不多不少,他靠着车厢壁站着,没有座位。手机握在手里,屏幕暗着。列车在隧道里穿行,窗玻璃上偶尔映出他的脸,在站点之间的黑暗段变得清晰,经过灯箱的时候又被外面涌进来的光冲淡。那个轮廓在明暗交替中反复切换,他看着自己的影子在玻璃上一次次出现又消失,把明天下午的见面流程在脑中过了一遍。
流程不长。他会准时坐进茶馆二楼靠窗的位置,闻人正阳会来,坐下来,把那组密钥以某种方式交给他。他不会当场验证,不会用任何设备读取,只会收下,然后离开。走完那条街,经过那段被监控覆盖的盲区,回到总部,把密钥交给南宫珩。南宫珩在受控环境里激活权限表,追踪数据流终点。整个过程只需要一次激活和一次追踪,不涉及任何大规模的系统更改,理论上不会触发任何警报。
他在地铁的晃动中把这条流程走了一遍,确认每个节点之间的衔接是闭合的,没有留出额外的空隙。
回到家之后他吃了晚饭。冰箱里还有前一天炒的番茄鸡蛋,他热了一下,就着米饭吃了,然后把碗洗了。水龙头的水流声在安静的厨房里显得比平时更清晰一些,他关掉水龙头之后那种沉默落下来,和空气净化器的白噪音不是同一种质地,更硬、更冷,带着一点金属管道收缩时的细微声响。
他擦干手上的水,走到桌前打开了工作站。
屏幕亮起来的时候屋子里只有那一块光。他没有去碰昨天那些抓包和解码的内容,而是直接打开了核心机房底层防御系统的一个模拟环境。界面加载完之后,光标停在命令行的起始位置,闪着等待输入的绿点。
他在这个模拟环境里做了一件事。他把那条通向写入通道授权路径的"入口"在防御层的匹配规则上改了一个参数,把"允许数据流出"的规则改成"允许数据进入但不允许数据移出"。那个改动本身就只涉及一行条件判断语句。他把原来的"如果身份验证通过则双向开放"重写成了"如果身份验证通过则单向开放——数据可进,数据不出"。
他把这行改动敲进去的时候手指没有停,但速度不快。每敲完一个段落他会停顿一拍,确认那个分支逻辑的走向是闭合的、不会溢出到其他模块上。这条通道在防御层看仍然是开放的,实际上只有出口处多了一个拦截阀,被埋得很深,深到任何常规的巡检都不会把目光停留在那一行上。
他在模拟环境里跑了三次测试。第一次测试模拟的是外部身份验证通过后的数据请求,系统返回了允许进入的信号,但尝试从内部拉取数据时被静默阻断,阻断日志没有被写入任何告警通道,只是在底层的数据包追踪记录里留下了一个未完成的连接标记。第二次、第三次测试的结果完全一致,三次测试的响应时间也完全相同,没有任何一次出现延迟或异常。
确认这个改动不会触发告警、不会在防御日志上留下异常记录、不会影响系统的正常运行之后,他把这个改动以差分补丁的形式植入了真实系统。覆盖操作发生的时候生成了一条标准格式的系统维护日志,类目是"例行优化_参数微调",看起来和任何一次日常调整没有区别。
他把那行修改以差分形式嵌入了防御系统。像一根细针被推入织物的经纬之间,从表面看不出来它改变了整块布的受力结构,只有拉紧的时候才会发现那根线的走向已经不一样了。
做完这件事之后他关掉了工作站。屏幕的光一下子没了,屋子暗下去,只剩下厨房方向漏过来的那一小片暖色的灯。他站起来走过去,从水壶里倒了杯水。水的温度比室温略高,杯壁的热度隔着瓷传过来,握在手里是舒服的。他站在厨房里把那杯水慢慢喝完,经过喉咙的时候瘢痕的位置回应平稳,没有任何牵扯或压迫的异样感。
他把杯子放在沥水架上,杯底碰着不锈钢网的时候发出轻轻的一声响。
走回卧室换了睡衣躺下来。窗帘拉了一半,路灯的黄线照例在地板上画了一道,和昨天晚上一样,窄窄的一条,从窗口延伸到床边。他看着那条黄线,把今天发生的事情从头到尾过了一遍。休息室里的等待和空气净化器送出来的凉风、解码报告里那两条指向不同区域的地址线索、和南宫珩在对话框里确认明天激活操作流程的对话、以及刚才在模拟环境里修改那行判断语句时屏幕光照在手指上的那种凉的触感。
他在最后一步补丁植入完成时没有在本地留任何备份。那行修改现在就只存在于系统的防御层里,以嵌入的方式待在那里,像一块砖被砌进墙里之后,从外面看根本不知道它的位置和周围的砖有什么不同。
明天下午两点,他会坐在茶馆二楼靠窗的位置,从闻人正阳手里接过那组密钥。然后他会走完那条街,经过那个盲区,回到总部,把密钥交给南宫珩。密钥会在受控环境里被用来激活那条权限表,而在权限表被激活的瞬间,防御层里那行被他改动过的条件判断语句会自动启动,把通道出口锁死。进入的信息可以被读取和追踪,但拿不走任何东西。
他在脑中把这条链路走完了一遍,像数完一段没有缺齿的齿轮。
然后他翻了个身,把被子拉到肩膀。在睡着之前的最后几分钟里他想起今天下午南宫晚棠发来的那张绿植照片,叶子在背光中那种半透明的翠绿色,叶脉的纹路细密又干净。他没有去想那盆植物现在放在哪里——十六楼茶水间的窗台朝北,冬天光照不足,那盆东西如果真放在那里,大概也不会死,只是长得慢一些。他记得那个颜色,在下午的光线里显得很安静,像冬天到来之前最后一批还愿意绿着的叶子,被风吹着的时候微微晃了一下。
他闭上眼。
窗外的风穿过楼间的缝隙,传来一阵低沉的、不紧不慢的呼啸。那声音隔着一层玻璃传进来,已经被削薄了大半,听起来像是很远处的什么东西在缓慢地移动。他听着那个声音,呼吸逐渐平稳下来。
被子裹在身上的温度刚好,不冷也不热。屋子里的暗色是均匀的,路灯的黄线照旧在地板上待着,没有动过。