## 第二十四章:南宫珩发现内网被动过——但不是入侵,是"加固"
周日晚上他做完防御系统那行改动之后,把工作站关机,没有再看内通系统。他洗漱之后躺在床上。路灯的黄线在天花板上画了一道窄长的影子,他侧躺了一会儿,看着那道光移过天花板中央,隐入窗帘折叠处的暗面,然后闭了眼。
周一早上他到公司比平时晚了十几分钟。地铁中途停了一站,停的时间比平时长。他在车厢里没看手机,靠着车门边的扶手,目光落在对面车窗的贴纸上,贴纸边缘卷起了一小块。车重新启动的震动传过来之后他才动了一下肩。下车,刷卡进楼。过了闸机他停了一步,因为大堂的电子公告屏上更新了一条新通知:"总部技术部将于今日上午对核心机房防御系统进行例行健康检查,期间不会影响系统运行,各岗位正常作业。"
他看完通知。时间安排是"今日上午",和他预想中"被触发告警之前有一段缓冲期"的状态吻合。但"防御系统"和"健康检查"出现在同一句话里的时候,心里有一个细微的锚点落了下去。
进电梯,到十六楼,在工位坐下开机。屏幕亮起来之后他先扫了一眼工单系统,今天排了三条任务,量不大。第一条处理完之后他去茶水间接了杯水。回来的时候手机屏幕上有一条内通消息通知,发送者南宫珩,内容是一份系统截图的缩略预览。他没有立刻点,把杯子放下,坐下来之后才点开。
截图显示的是防御系统某一行条件判断语句的变更记录。变更的字段描述写着"权限表出口规则·路径匹配条件·修改",修改时间戳显示昨天晚上九点四十七分,修改者字段标注为"系统内置维护进程自动优化"。备注栏为空。
他看完这张截图没有立刻回消息。端起水喝了一口,然后打字:"你看到了。"
"看到了。"南宫珩的回复速度很快,像是已经等在对话框那头了。"你的补丁写得很好。修改时间戳伪装成了系统自动优化,操作源地址重新路由过。如果不是我上周对那行判断语句做了手动备份,这一轮健康检查不会发现它的变化。但备用路径和主干路径之间的那条比较记录里留下了差值。字节级的。"
"你对比了备份和当前版本。"
"对。差值精确到字节,除了你改动过的那一行之外没有别的变化。这不是入侵。这是加固。有人在帮我锁门。"南宫珩的措辞在"帮我"两个字上停了一下——闻人屿隔着文字也能感觉到那个停顿的位置,然后他又补了一句:"你改的是入口规则,把双向开放改成了单向可进不可出。等于把一扇旋转门改成了一道只进不出的活板门。通过这条权限表激活进来的信息流,到出口就被封死了。"
闻人屿看着"帮我"两个字。在对话框中打了一行发出去:"你本来打算怎么处理出口这个问题。"
"我本来打算在激活操作完成后手动切断权限表的对外映射链路。但那需要在激活窗口内并行操作,存在大约三到五秒的并发窗口期。在那几秒里,数据有可能已经向外流出了。"
"现在你不需要那几秒了。"
"对。你把那个窗口关了。"南宫珩回完这行之后停了一下。然后补了一句:"现在我需要确认一件事。你昨天晚上改完那行判断语句之后,有没有在其他地方留下任何相关的操作痕迹。"
"没有。模拟环境里测试了三次才植入真实系统。植入之后清理了本地缓存。没有留副本。"
"今晚之前我不会安排激活操作。我要先让这次'健康检查'的结果以正常状态归档,避免你的修改在系统日志里显得突兀。等归档完成之后,激活操作会在某个自然的时间窗口内进行。"
闻人屿看着"自然的时间窗口"这几个字。南宫珩没有说具体几点,用的是边界模糊的描述。像在对面的监听层有可能正在关注的时候,选择不把精确时间放到可能被截获的通路上。他问了一句:"归档需要多久。"
"今天下午之前能完成。你会收到一份健康检查通过的自动通知,和其他所有用户看到的版本一样。你正常处理你的工单。不要对那条通知做出任何不正常的反应。"
他回了一个"好"字。切回工单系统,处理剩下的两条任务。手指在键盘上落键的节奏和平时一样,但敲到F键区域的时候,无名指的力度已经不再需要刻意的调整了,自然地落在了一个新位置上。比几周前轻一些,比上周略准。那个变化他注意到了,但没有花时间去分析它。
午休的时候他下楼买了饭团和豆浆,站在花坛边吃完。今天的风比周末小一些,阳光在薄云后面透出均匀的冷白色,照在手上只有凉凉的一层亮。花坛边的地砖缝里有一片被踩扁的烟头,他嚼完饭团的时候看了它一眼,弯腰捡起来扔进了旁边的垃圾桶里,然后把包装纸也一并扔了,走回大堂。经过电子公告屏的时候扫了一眼,早上那条"健康检查通知"已经被替换了,新内容是"企业信息安全月活动预告"。通知的切换是自动化的,意味着早上的检查已经完成归档了。
下午两点多他收到一封系统自动发送的健康检查报告。内容标准,结论一栏勾选了"所有检查项通过,系统状态正常"。发件人是总部的自动化运维系统,抄送列表是一长串地址。他确认收件人里确实有自己的账号,标记为已读,关掉了邮件。
他把这条邮件的接收时间记录在加密笔记里,和"防御层修改完成"、"健康检查通过"两条做了时间线对齐。然后继续处理工单。
三点四十分,南宫珩的新消息进来了:"归档完成了。你把那条权限表的出口锁死之后,我在防御层外圈额外加了一层镜像跟踪。任何进入权限表的信息在流向被截断的同时,会在镜像层留下完整的读写副本。副本不占用系统主存储,只存在于临时的缓冲区域里,四十八小时后自动清除。"
闻人屿把这行字读了两遍。这相当于给那条已经被封死的入口再加了一道双录装置,既能追踪信息流向,又不让它们在系统主存储里留下可检索的痕迹。他回了一句:"镜像层的缓冲区域是物理隔离的吗?"
"是。独立于主存储阵列的一块离线缓存,只有这台机器能访问。"
"那你准备什么时候激活。"
"今天晚上。具体时间我不会提前告诉你。你不需要在场。"
闻人屿看着"你不需要在场"这五个字,把手机屏幕按灭了。他把手机放在桌面上,手没有离开,指尖贴着手机侧边的弧形边缘,停了大约三秒才拿开。这三秒里他没有感觉到被排除在外的不安。南宫珩从来不做多余的安排——他说"不需要",就是已经把所有需要发生的事都装进了那台离线缓存机器里,不需要另一个人坐在旁边守着它。他没有再追问具体时间,也没有发一句"好"或"知道了"。把注意力收回到面前的工单界面上,继续处理下午的任务。
下班的时候他收拾东西站起来,走到走廊里脚步放慢了一拍,侧头朝机房方向看了一眼。磨砂玻璃门关着,里面的灯亮着冷白色的光,和平时一样。他收回视线,走向电梯。
回到出租屋之后吃了晚饭,洗了碗。然后坐在桌前。没有开工作站,只是坐在那里看着窗台上那盒润喉糖。今天还没有取过,盒子里的数量还停在"九颗"上。他伸手把盒子拿过来,打开盖子倒了一颗在手心里。又把盖子盖好放回窗台。含着那颗糖坐在椅子上,薄荷的凉意在舌根漫开的时候他微微闭了一下眼。窗外的天色已经暗透了,路灯的光在地板上铺了一层窄长的黄。
晚上九点多他收到一条来自内部通讯系统的新消息。发送者南宫珩,内容比平时任何一条都短——只有一个字:"进。"
他看着这个字大约三秒。然后回:"结束了?"
"结束了。激活操作在八点四十三分完成。信息流进入权限表后,在出口处被你的锁挡了下来。同时镜像层捕获了完整的数据副本。副本内容正在解码中,预计明天早上能看到完整的流向终点。"
闻人屿靠在椅背上。八点四十三分。他在那个时间点正在厨房里洗晚饭的碗,水龙头的声音盖过了手机震动。他没有看到那条通知。但那条通知本身也不是让他"看到"而发的。它是在做完之后用来确认完成的。像一个人走完一段路之后回头看了一眼,确认走过的路还在那里。
他回了一句:"解码完成后通知我。"
对面回了一个"嗯"字。对话框安静了。
闻人屿站起来去刷牙。洗脸。镜子里他的脸被暖色的灯光柔化了一层,他没有多停留,关了灯走回卧室。躺下来之后手放在被子外面,掌心朝上。窗帘拉了一多半,路灯的黄线照例在地板上画了一道窄长的亮条,比前几夜的更暗一些,因为今天的云层更厚了。他闭了一会儿眼。
那条信息现在正在离线缓存里被解码。它经过了闻人正阳手里的密钥、顾言舟埋设的权限表、南宫珩的离线缓存、以及他在防御层里植入的那行单向锁的拦截。他现在不需要在现场见证解码过程,它会在那台机器上自己完成。然后以文字形式出现在明天早上的内通对话框里。
他在脑中把这条链路的完整走向走了最后一遍。从密钥到入口,从入口到权限表,从权限表到出口拦截,从拦截到镜像捕获,从捕获到离线解码。每一个环节都闭合了。
他翻了个身,把被子拉到肩膀。窗外的风比刚才大了一些,把窗帘边缘吹起来又落回去,发出一种很轻的、像翻书页一样的声音。他没有睁眼。在那种声音里调整了一下呼吸的节奏,慢慢沉入睡眠。
第二天早上醒来的时候手机屏幕亮着,一条未读消息躺在通知栏里。他坐起来点开,看到南宫珩发来的解码结果摘要:"流向终点确认。权限表激活后的数据指向城西工业区那栋仓库地址。和顾言舟在固件文件里留下的坐标一致。同步提取了一组备用邮箱地址,域名注册时间为四年前,注册地境外。"
他把这条消息读完,把手机放回枕头边。清晨的光从窗帘缝隙里渗进来,在墙面上铺了一层偏冷的灰白。他坐在床边,手搭在膝盖上。
这条链的终点落在城西那栋仓库上,和顾言舟那条线汇合了。闻人正阳的买方、顾言舟的上级、城西工业区那个地址,现在它们被同一条权限表的激活路径连接在了一起。像三条从不同方向出发的河道汇入同一片低洼地,之后形成了一面平静的、深色的水面。他在床边坐了一会儿,膝盖像是刚刚承担了那三条河道的全部重量一样,有一点点发酸。那种酸感不剧烈,但明确。他扶着膝盖站起来。
去洗漱。水流过脸的时候他感觉到今天早上的水比前几天都凉了一些,季节确实在往更深的地方走了。他扶着洗手台边缘多站了两秒,然后擦干脸。换好衣服,把帆布包挎上肩。出门之前停了一步,从窗台上拿起那盒还剩八颗的润喉糖。他捏了捏纸盒边缘,像是在确认它还在那里,然后放进了外套左侧的胸袋里——那个位置靠近心脏,但隔着两层布料和一根拉链。
他把门带上,楼道里的声控灯亮了,在脚下投出一圈冷白的光。他走下台阶,脚步声在楼梯间里一声一声地落下去,均匀、没有停顿。