凌晨三点二十分。 沈砚盯着手机屏幕上那条短信,呼吸不知不觉放轻了。"别去季成蹊办公室",加上号码归属地显示"未知",那七个字就像一粒冰珠子,沿着他的脊椎慢慢滚下去。 他原本已经把整理好的线索材料锁进抽屉,准备睡两个小时再去找季成蹊当面汇报空调外机非原厂模块的事。手机推送标题里的策划组变动,加上方睿那些记录异常,一环扣一环地指向五月十三日凌晨——那个服务器卡顿的夜晚,那个监控画面凭空中断的时间段。现在这条短信来了。 他慢慢把手机扣在桌上,屏幕朝下。房间里只有笔记本电脑散热风扇嗡嗡响,从百叶窗帘缝隙挤进来的路灯灯光在墙壁上拉出一道窄窄的橙黄色光带。他坐在床边,右手拇指无意识地按着手机背面那块冰凉的金属壳,脑子里转过三四个念头。 发短信的人是谁?能拿到他的私人手机号码,说明至少是公司内部的人,而且层级不低。信息系统部门能调取员工通讯录的人很多,但这条信息的时效性太精准了——正好卡在他调查出模块、准备次日去季成蹊办公室之前。这意味着对方实时掌握着他的调查进度。另一层更让他后背发凉的是,这条短信里用的是"别去"而不是"别查"。 季成蹊办公室和他手上那份线索材料之间有什么联系?空调外机里的非原厂模块安装在通风管道靠近楼层隔板的夹角里,供电线接到外机的主控板上,取电位置极其刁钻。他当时用手机闪光灯照亮缝隙的时候就看出来了——那根白色扁平线缆裹着黑色热缩管,从外机底部的检修口伸进去,绕过散热鳍片,最后接在主控板边缘一个扩展接口上。标准的硬接线方法,专业电子工程师的手笔。 那个模块能做什么?数据采集、信号中继、音频捕捉、或者远程唤醒触发。但安装在中央空调外机里,最优选的用途是温湿度补偿和环境噪声掩蔽——用压缩机运转的恒定低频噪声做载波,把采集到的信号调制上去,再通过原有线路往外传。 整个设计思路非常像他在上一家公司做过的边缘计算节点部署方案,低功耗、长待机、伪装成设备故障。 他拿起手机翻过来,屏幕亮起,锁屏界面上三条未读短信叠在一起。第一条:别去季成蹊办公室。第二条:空调外机已修复——这条应该是运维的自动推送,说明方睿那边有人动了设备。第三条:凌晨四点四十分,刚才那条警告的发送时间戳。 他把这三条短信截屏保存,然后打开备忘录新建一个记录,把接收时间精确到秒打上去。做完这一切,他忽然觉得脊背中间那块肌肉绷得发硬,站起来活动了一下肩膀,膝盖骨咔嗒响了一声。宿舍的暖气片滋滋作响,空气干燥得让人鼻腔发紧。 他决定还是先不去季成蹊办公室。但不去不代表什么都不做。 沈砚把笔记本电脑重新打开,插上电源,将那份整理好的线索汇报材料复制到一个新文件夹里,重命名为"备份0516"。然后他打开OA系统的外部访问界面,输入自己的工号和密码。六位动态验证码发到手机上,他输进去,页面跳转进内部工作台。凌晨时段的OA系统加载特别快,页面上几乎没有其他用户的访问记录。 他点开五月十三日凌晨零点到三点之间的日志查询窗口,选择"高权限操作记录"和"系统配置变更"两个筛选维度。回车键按下去的那一瞬,查询结果弹出来——三条记录。 第一条:五月十三日零时十七分,用户"系统管理员_zhangwei"执行了次声波预警阈值变更操作。原设定值:48dB,新设定值:62dB。备注栏空白。 第二条:零时三十三分,用户"值班工程师_lizp"发起OA登录请求。登录IP:10.0.3.28。结果:失败——账号密码错误三次。 第三条:零时四十一分,用户"系统管理员_zhangwei"再次执行系统配置变更,这次是监控终端刷新策略——从实时同步改为"时段缓存模式"。 沈砚盯着第三条记录看了大概有十五秒。他的注意力落在那个"时段缓存模式"上——这是运维系统里一个极少启用的特性,专门用在网络带宽不足的灾备场景下。启用后监控摄像头会把视频数据按十五分钟为单位缓存在本地存储卡里,等网络恢复后再批量上传。但IT中心那几条主干光纤全是双路冗余,带宽峰值利用率不到百分之四十,怎么可能需要启用缓存模式? 除非有人需要监控画面延迟上传。 零时四十一分启用缓存模式,从这时起,A座所有摄像头的画面都会在本地存满十五分钟才向中心服务器推送一次。如果有谁在零时四十一分到零时五十六分之间进了A座某个地方,那么监控画面要等到零时五十六分之后才会出现在中心系统的记录里。而如果有人趁着那十五分钟把本地存储卡上的数据抹掉或者替换掉,那这一段监控就永远消失了。 他之前只查到监控中断,没深究中断的机制。现在这三条日志串在一起,画面就清晰了。 先调高次声波预警阈值——让震动监测系统的灵敏度降低,这样如果有人撬动空调外机或者打开外墙检修口,低烈度的震动不会触发警报。然后制造一次OA登录失败记录,把"李振鹏"这个账号挂到异常行为列表里,让后续追查的人先把注意力集中在值班员未到岗这件事上。最后启用监控缓存模式,给自己留出十五分钟的操作窗口。 这三个步骤之间的时间间隔只有二十四分钟。意味着执行这些操作的人非常了解A座夜间巡检流程——知道零点之后安保岗会有一轮固定巡查,知道中央空调系统在凌晨一点之前会有一次自动除霜循环,知道外墙侧那个位置处于三个摄像头的共同盲区。 沈砚把这三条记录截屏,粘进备份文件夹里的一个新文档。他给这个文档起名叫"0513时间线"。然后他继续向下翻日志查询页面,想看看有没有五月十三日凌晨之后对这个缓存模式的恢复记录。滚动条拖到最底部,页面显示"查询结果:共3条记录"。 没有恢复记录。 也就是说从五月十三日凌晨零时四十一分到现在,A座的监控系统一直运行在缓存模式下。十五分钟延迟上传从未被解除。如果有人在这三天里从A座带走什么东西、放进去什么东西,监控画面都会晚十五分钟出现在中心服务器上,只要在这十五分钟内擦掉本地存储卡,就完全没有痕迹了。 沈砚靠在椅背上,手指停在键盘上方。空调外机里那个非原厂模块的安装时间现在有了一个清晰的指向——五月十三日凌晨零时四十一分到零时五十六分之间。 他拿起手机,给方睿发了一条微信:"你上次说的夜班记录异常,李振鹏那个登记,能确认他当晚几点打卡的吗?" 消息发出去之后,对话框显示"对方正在输入…",然后停了,又显示,又停,反复了四五次。最后回过来一段文字:"打卡机记录显示他二十三点五十九分打卡进园区,但闸机门禁记录里没有他。打卡机的时间戳被人修改过,我查了打卡机本地的操作日志,五月十四日上午九点十七分有一条管理员操作记录,执行了'校正时间'指令,把打卡机时间往前调了七分钟。李振鹏的打卡记录二十三点五十九分实际上是校正后生成的伪记录。" 沈砚的眉头慢慢拧紧了。打卡机时间是被人为调回去的,目的就是制造一个"李振鹏值了夜班"的假象。那么李振鹏本人呢?他到底有没有来? 他回复方睿:"李振鹏本人我问过,他说他那天晚上发烧请假了。你那边有没有他的请假审批记录?" 方睿这次回得很快:"没有。五月十二日到十四日之间,他的考勤申请栏是空的。" 这就对上了。有人伪造了打卡记录,但没有伪造请假审批。因为请假审批需要部门主管电子签名,那个链条太复杂,串通成本太高。所以那一边只伪造了打卡机数据,让考勤系统的自动统计把李振鹏算作"已签到",然后在OA里挂一条登录失败记录把注意力引向"账号被尝试破解"——这样追查的人会先怀疑外部攻击,等排除外部因素之后再把目光转向内部人员,那时候李振鹏的"打卡记录"已经成了一个死证据。 这个局做得非常细。但再细的局,细节之间总会露出缝隙。 沈砚把方睿发来的那段话也截屏保存。然后他忽然想起方睿之前说过空调外机电路图的事——他给方睿发消息:"电路图的事,你找到了吗?" 方睿回:"找到了。A座中央空调外机型号是格力GMV-2240,控制板接口定义图我从设备科拷出来了。明天上午九点,你来设备科办公室找我。" 沈砚看了一眼时间。凌晨四点零二分。离九点还有五个小时。 他正准备关电脑躺下睡一会儿,忽然手机震了一下。新短信。他点开。 号码依然显示"未知",内容只有五个字:"别查了。" 那条短信在屏幕上亮了几秒,然后自动标记为已读。沈砚盯着那三个字,忽然觉得宿舍里太安静了。暖气管的滋滋声、笔记本风扇的嗡嗡声、他自己心跳的咚咚声——所有声音都变得格外清晰。 他慢慢站起来,走到窗边,把百叶窗帘的叶片拨开一条缝往外看。宿舍楼下是一片空停车场,路灯照在几辆落灰的私家车顶棚上,停车位之间的白线被雨水冲得模糊。没有人。对面A座的窗户黑漆漆的,只有五楼靠西那一间亮着灯,那间是——沈砚在心里换算了一下楼层和方位——那间是季成蹊办公室斜对面的小会议室。 凌晨四点还在亮灯的会议室。谁在里面? 他退回床边坐下,把手机放在膝盖上。屏幕已经暗下去了,但他闭上眼还能看见那五个字在眼前闪。别查了。发短信的人既然能随时掌握他的调查进度,那多半也知道他刚才打开OA查了日志。说不定他现在住的这间宿舍、窗外的停车场、甚至这台笔记本,都在某种监控范围之内。 沈砚把笔记本电脑的WiFi开关拨到关闭。他拔掉电源线,合上屏幕,然后把手机调成飞行模式。 他坐在黑暗里,耳朵竖起来听走廊里的动静。隔壁房间没有人,这一层宿舍一共住了六个人,其他五个都不在。走廊尽头的安全出口指示灯亮着一圈微弱的绿光,透过门底缝渗进来,在地板上划出一条细线。 他在那条绿光和橙黄色路灯交汇的暗影里坐了十分钟。脑子里翻来覆去只有一个问题:季成蹊办公室到底藏着什么?为什么有人要阻止他去? 而发短信的人,究竟是在保护他,还是在拖延他? 凌晨四点的停车场起了风,A座外墙那片被撬过的空调外机百叶窗在风里发出一阵轻微的金属颤音,从楼下传上来,钻进沈砚耳朵里。那声音像是有人用小螺丝刀在轻轻敲打什么金属管件,又像是某个秘密被风吹松了螺丝,正一点点地、一点点地往外漏。