周轶把那台笔记本还回来的时候,多说了两句话。
“轶哥,你这电脑是不是该换了?开个Excel都要等半天。”他把笔记本搁在我桌上,顺手拿起我杯子喝了口水,好像我们之间从来没有“用别人杯子前先问一声”这种规矩。
我看了他一眼。周轶这个人,技术部的中坚力量,代码写得不算最好,但胜在嘴甜腿勤,跟谁都能聊两句。他来公司一年半,从初级开发一路升到小组长,速度不快不慢,属于那种不太会引人注意但也挑不出大毛病的升迁轨迹。
“借你用了三天,辛苦了。”我把笔记本拉过来,指尖碰到外壳的时候顿了一下。
“不辛苦不辛苦,帮轶哥干活儿不是应该的嘛。”他笑着拍了拍我肩膀,转身走了,步子轻快得像踩在弹簧上。
我等他的背影消失在工位隔断后面,才低下头,把手掌平放在笔记本的A面上。
凉的。金属外壳,正常的室温。
但我总觉得哪里不对。
这种“不对”不是从今天开始的。三天前周轶来找我借电脑的时候,理由听上去很充分——他的笔记本在做系统升级,IT那边说要等两天才能把环境搭好,而他的项目需要在今天之内出一个演示版本。
“轶哥您那台性能最好,我就用一天,最晚后天还您。”
我当时在赶一个方案,头都没抬,把笔记本推过去,说了句“用吧”。
现在想起来,那天他接过电脑的时候,手比平时快了一点。
我打开笔记本,输入密码,进入桌面。一切正常,图标排列没变,壁纸还是我家猫那张睡成圆形的照片。我点开几个常用文件夹,文件都在,修改时间也没什么问题。然后我打开任务管理器,扫了一眼CPU和内存的占用率。
正常。都正常。
我靠在椅背上,盯着屏幕看了几秒。显示器是公司标配的24寸戴尔,我把亮度调到了40%,因为觉得太亮伤眼睛。此刻那个不算太亮的屏幕上,所有程序都安安静静地运行着,像一个乖巧的、挑不出毛病的好学生。
但我就是觉得不对劲。
这种不对劲很微妙,像你走进自己住了十年的房子,所有的家具都在原来的位置,空气里飘着的也是熟悉的味道,但你就是觉得有什么东西被挪动了一厘米。你说不出来,但你的身体知道。
我闭上眼,回想了一下刚才打开任务管理器时的感觉。响应速度。对,是响应速度。任务管理器弹出来的那一瞬间,比平时快了大概零点几秒。这听起来像是一件好事,但问题在于,我这台笔记本已经用了三年零两个月,装了三十多个开发工具和设计软件,开机时间从来没低于过两分钟。它不可能突然变快。
除非有人替它减了负。
我重新打开任务管理器,这次看得更仔细了。进程列表里跑着的程序和之前差不多,CPU和内存的占用率也都在正常范围内。我看着那串进程名,一个一个地过,像安检员盯着X光屏幕。
然后我注意到一件事。
我的杀毒软件不见了。
不是被关掉了,是从进程列表里彻底消失了。我点开“已安装的程序”列表,下拉,再下拉,那个熟悉的图标不在它应该在的地方。我搜索了一下,结果为空。
杀毒软件被卸载了。
周轶借我的电脑去“做演示版本”,然后顺手把我的杀毒软件卸载了。
我拿起杯子喝了口水,水是凉的。我端着杯子想了三秒钟,然后把杯子放下,打开了系统日志。
系统日志像个不会说谎的监控录像,把电脑上发生的每一件事都记录在案,精确到毫秒。我开始翻这三天的记录,一行一行地往下看,像在一条平静的河里寻找沉入水底的石头。
第一块石头出现在借出电脑当天的下午两点十一分。
系统日志显示,一个名为“sys_update_20251104.bat”的脚本在那个时候被执行了。执行者是周轶的登录账号。这个脚本做的事情不多,日志里只留下了几条记录:关闭Windows Defender,修改组策略,关闭防火墙。
我看着这几条记录,手放在鼠标上没动。
关闭杀毒软件可以有很多解释。也许是测试需要,也许是某些破解软件会被误杀,也许是周轶觉得这个杀毒软件太占资源影响运行速度。这些解释都说得通,都是合理的、正常的、不会让人多想的原因。
但接着往下翻。
两点二十三分,又一个脚本被执行了。这个脚本的名字很不起眼,叫“temp_clean.bat”,看起来像是清理临时文件的例行操作。但我看了它调用的系统API之后,整个人从椅背上坐直了。
这个脚本在查询系统的硬件ID。主板序列号、硬盘序列号、网卡MAC地址——所有可以唯一标识一台计算机的信息,都被这个脚本读了一遍,然后写进了一个隐藏文件夹里的文本文件中。
一个清理临时文件的脚本,不需要知道这台电脑的硬件ID是什么。
就像一个人借了你的车去超市买菜,却问你要了车的登记证书和发动机号。
我没有继续往下翻。合上笔记本,站起来,去茶水间接了杯热水。回来的时候路过周轶的工位,他正在跟旁边的同事说笑,看我经过,朝我挤了挤眼睛。
我朝他笑了笑,走回自己的座位,把热水放在桌上,没有喝。
然后我把笔记本接上电源,插上了一个平时不用的U盘,U盘里装着我自制的系统急救工具包。做这行的人,多少都会给自己留几手,我入行十一年,从汇编时代一路走过来,有些东西已经刻在肌肉记忆里了,不需要思考就能做出反应。
重装系统。
不是修复,不是查杀,不是隔离。是彻底的、不可逆的、连根拔起的重装。
我把U盘插进去的时候,手指稳得像做心脏手术的医生。BIOS设置,U盘启动,硬盘全部重新分区,一个扇区都不留。格式化的时候进度条走得很慢,我看着那个蓝色的进度条一格一格地往前爬,茶水从热变凉,工位周围的键盘声和说话声像隔了一层玻璃,全都模模糊糊的。
进度条走到100%的那一刻,我忽然想,也许我反应过度了。也许真的就是个临时清理脚本,也许周轶写代码的时候习惯把各种功能塞在一起,也许他根本不知道自己在做什么。也许我就是个多疑的、被害妄想的老东西,在这个年纪就已经跟不上年轻人的工作方式了。
系统安装程序开始跑的时候,我拿起手机,给我们技术总监老方发了条消息。
“方总,公司服务器的堡垒机日志,我能不能调阅一下?权限好像不够。”
消息已读。没有回复。
我等了三分钟,又发了一条。
“或者我自己去找IT开权限?”
这次回复来得很快,只有四个字。
“先别动。”
我看着这四个字,把手机屏幕朝下扣在桌上。茶水间的方向传来咖啡机的研磨声,行政小姑娘在分发下午茶,空气中飘着一股蛋挞的甜味。公司的一切都在正常运转,没有人知道一个普通工位上的普通员工,正在重装一台借出去三天的笔记本,也没有人知道技术总监在看到那条消息之后,立刻放下了手里所有的事情。
除了那个技术总监自己。
系统重装完成得比我预想的快。Windows的初始设置界面亮起来的时候,我感觉像搬了一次家——所有的东西都打包带走,旧的家具全部扔掉,在这个空荡荡的新房子里,连空气都是陌生的。
我没有急着装任何软件。先做了几件基础的事:更新系统补丁,安装杀毒软件,开启防火墙,然后再次打开系统日志——这次是新系统的日志,干净得像一张白纸。
但我在意的不是新系统,而是那个被格式化的旧硬盘上,到底有什么东西。
重装之前我做了一个全盘镜像,保存在那个U盘里。现在这个镜像文件安安静静地躺在外置硬盘上,122GB,不大不小,刚好够装下一些秘密。
我开始分析那个镜像文件。这不是一个轻松的工作,我花了一个半小时,从下午三点半到五点,几乎没怎么动过。中间有人来找我聊天,有人问我方案写完了没有,有人把快递放在我桌上,我一律用“嗯”“哦”“放那儿吧”打发了过去。
时间一分一秒地过。
五点钟的时候,我找到了那个东西。
它藏在一个被深度嵌套的文件夹里,路径长得像俄罗斯套娃:C:\ProgramData\Microsoft\Windows\Caches\{A1B2C3D4-E5F6-7890-AB12-CD34EF567890}\temp\cache\sys\drivers\update\。
文件名是“wscsvc.dll”。一个看起来人畜无害的系统动态链接库文件,名字和Windows安全中心的服务进程几乎一模一样,只差一个字母。
但当我用十六进制编辑器打开它的时候,里面不是代码。
是一段加密的数据。加密方式不算太高级,我花了大概二十分钟就解开了。解开之后,里面的内容让我的后背在一瞬间出了一层薄汗。
那是一组服务器登录凭证。不是普通的服务器,是公司的核心业务服务器——存放客户数据、交易记录和支付接口密钥的那几台。用户名、密码、双因子认证的令牌种子,全部打包在这个看起来像是系统文件的DLL里,像一个被精心伪装过的万能钥匙。
而这个DLL文件,是在两天前的凌晨两点零三分被写入我的硬盘的。写入者使用的账户名是“SYSTEM”,但操作来源是周轶的IP地址。
不是周轶的账号,是周轶的IP地址。这意味着,无论操作的人是谁,至少操作发生的物理位置,是周轶的工位,或者他用过的设备。
我盯着屏幕看了几秒。窗外天色开始暗了,五点半的北京,十二月的黄昏来得早,雾霾把夕阳遮成了一个月亮似的模糊光斑。公司的灯还没开,工位之间的通道暗了下来,有人在喊“开灯”,然后头顶的日光灯管闪了两下,一片接一片地亮起来。
灯光亮起来的那一刻,我的手机震了。
是周轶的消息。
“轶哥,听说你重装系统了?电脑出问题了?”
他没有问我为什么重装。他问我电脑是不是出问题了。这是两种完全不同的问题,一个关心原因,一个关心结果。关心结果的人,往往已经知道了原因。
我没有回复。手机又震了一下,还是周轶。
“要是有什么不对劲的,您跟我说,我去跟IT解释。别自己弄,万一丢什么重要文件就麻烦了。”
“我去跟IT解释”——这句话的潜台词是,他认为这件事需要解释。一个正常人借了同事的电脑,同事后来重装了系统,这件事需要解释吗?不需要。除非他早就知道,有人在电脑上做了什么不该做的事。
我看着这条消息,忽然觉得有些好笑。周轶今年二十七岁,毕业四年,来公司一年半,平时表现中规中矩,甚至可以说是优秀的。他聪明,好学,待人接物都很有分寸,领导喜欢他,同事也不讨厌他。如果非要从他身上找什么缺点,可能就是有时候太聪明了一点。
聪明到以为别人发现不了杀毒软件被卸载了。
聪明到以为一个普通人不会去看系统日志。
聪明到以为自己做得足够隐蔽,不会被一个干了十一年的老家伙抓住尾巴。
但人往往不是因为笨才犯错的。人是因为聪明过头,聪明到低估了别人,才犯错的。
我拿起手机,给老方打了电话。
电话响了五声,接了。
“方总,我查到了一些东西。公司核心服务器的登录凭证被提取出来了,放在一个伪装的DLL文件里,存在我的电脑上。操作来源是周轶的IP,时间是两天前的凌晨。”
电话那头沉默了三秒。老方的声音很沉,说了一句“你来我办公室”。
技术总监的办公室在走廊尽头,单独一间,门口挂着“技术研发中心总监”的铭牌,铜质的,擦得很亮。我走到门口的时候门虚掩着,能看到里面的灯光是暖黄色的,老方站在窗边,手机贴在耳朵上,正在跟谁说话。他的声音压得很低,我听不清内容,但能看到他的肩膀绷得很紧,握着手机的指节泛白。
他看到我,朝我点了点头,又对着电话说了句“我知道了,马上处理”,然后挂断了。
“进来,关门。”他说。
我走进去,把门带上。老方的办公室我来过很多次,每次都差不多——桌上堆着几摞打印出来的技术文档,白板上画着密密麻麻的架构图,窗台上放着一盆快死了的文竹。但今天这个房间里的空气不一样,像暴风雨来之前的闷热,皮肤能感觉到气压的变化。
“你说凭证被提取出来了,确认了吗?”老方转过身来看着我,目光沉甸甸的。
“确认了。用户名、密码、令牌种子,全套的。只要拿到这些东西,任何人都可以从任何地方登录核心服务器,做任何他想做的事情。”我顿了一下,“而且这个东西在我的电脑里存在了至少两天,这期间电脑被借出去了,对方有充足的时间把这些凭证复制走。”
老方的手放在桌面上,指尖有节奏地敲着桌面,哒,哒,哒,像一个不紧不慢的倒计时。他没有问“你确定吗”,也没有问“会不会是误会”,他是技术出身,知道我说出“确认了”这三个字意味着什么。
他问了一个让我意外的问题。
“周轶平时跟你关系怎么样?”
这个问题在这个时候听起来有些突兀,但我知道他为什么这么问。他在评估动机。周轶为什么要做这件事?是为了窃取数据卖给竞争对手?还是受人指使?或者,有其他更复杂的背景?
“还行,不算特别近,但也没什么矛盾。”我说。
老方点了点头,拿起桌上的座机,拨了一个号码。电话接通后他说了句“你来我办公室一趟”,然后挂断了。前后不过五秒钟,没有称呼,没有寒暄,没有任何多余的字。跟他在技术评审会上永远能用最短的话指出最核心问题的风格一模一样。
不到三分钟,门被敲响了。
进来的人是周轶。
他走进来的时候看了一眼站在旁边的我,然后看向老方,脸上带着一种恰到好处的疑惑表情,像一个被老师叫到办公室但并不知道自己犯了什么错的学生。这个表情很自然,自然到几乎可以骗过所有人。
“方总,您找我?”
老方没有让他坐。也没有让坐的意思,这在技术总监的办公室里是很不寻常的信号。老方这个人虽然严厉,但礼节一向周到,以前叫我过来的时候总会说一句“坐吧”,哪怕房间里只有一把椅子,他也会让给别人坐。
但今天他没有说。
“周轶,你借林轶的电脑做什么了?”
周轶的表情没有任何变化。还是那副困惑的样子,眉毛微微皱起,嘴唇微微张开,好像在努力回忆一件不太重要的事情。
“做演示版本啊,我那个系统升级等不及了,就借了轶哥的电脑用一下。”他顿了一下,看了我一眼,“怎么了轶哥?电脑出什么问题了?”
他在重复。重复“演示版本”这个理由,重复“电脑出问题了”这个问法。语言上他在回应,但逻辑上他在试探,试探我到底发现了多少,试探老方到底知道了多少。
“演示版本需要卸载杀毒软件吗?”我问他。
周轶愣了一下。这个愣是真实的,我能看出来,因为这个问题他没有预料到。他预料到我会发现杀毒软件被卸载了,但没有预料到我会在见到他的第一句话就直接抛出这个问题。
“哦,那个啊,”他很快恢复了状态,“因为我装了一个测试工具,那个工具跟杀毒软件冲突,就先关了一下。后来忘了装回去,是我的疏忽。”
“什么测试工具?”
“就一个压测工具,名字我忘了,已经删了。”
“什么时候删的?”
“还电脑之前。”
“删之前卸载程序有没有提示你要清理依赖组件?”
这个问题很刁钻。一个正常的软件卸载流程,如果它依赖某些系统组件,卸载时会提示是否保留这些组件。如果周轶真的只是临时用一个压测工具,他应该记得这个细节。如果他回答不上来,或者回答得含混,那他的谎言就暴露了。
但周轶没有掉进这个陷阱。
“有的,我全选了清理。”他说,语气很平稳。
老方在这个时候开口了。他说话的速度不快,像在审阅一段代码,逐行检查,不放过任何一个字符。
“凌晨两点在别人电脑上跑脚本,也是在跑压测?”
周轶的瞳孔缩了一下。非常快,快得像眨眼,但我看到了。从这一刻开始,他在我眼里不再是那个嘴甜腿勤的小组长,而是一个在被捕前最后一秒还在试图编造不在场证明的嫌疑人。
“方总,我不知道什么脚本。”周轶的声音变低了一点,语速变慢了一点,身体的重心往后移了一点。这些变化都很微小,但全部指向同一个方向:他进入了防御姿态。
老方没有跟他纠缠这个问题。他从桌上拿起手机,看了一眼,然后抬起头,用一种我从未见过的表情看着周轶。
那个表情里没有愤怒,没有失望,甚至没有任何情绪。像一个人在查看一台出了故障的机器,冷静地、客观地、不带任何感情地,确认了这台机器已经无法修复,唯一的处理方式就是断电、拆解、报废。
“信息安全组的审计报告刚刚出来,”老方说,目光钉在周轶脸上,“三天前,你的账号从林轶的电脑上向一个境外IP地址传输了大约2.4MB的数据。时间点是凌晨两点到三点之间,连续三天,每天都传。”
周轶的脸白了一下。那种白不是比喻,是真实的、肉眼可见的颜色变化,从颧骨开始蔓延到整个面部,像是有一只看不见的手把所有的血色从他脸上抹去了。
“数据内容经过初步分析,是加密的。但加密方式和你放在林轶电脑里的那个DLL文件用的是同一个算法。”老方把手机屏幕转向周轶,上面是一份审计报告的截图,红色的标记覆盖了大半个屏幕,“我们已经在解了,但说实话,不解也知道是什么。”
办公室里安静了三秒钟。空调的出风口在头顶嗡嗡地响,日光灯管偶尔发出一声细微的电流声,窗外彻底黑了,玻璃上映出了三个人的影子,模糊的,站得很开的三个影子。
周轶张了张嘴,没有发出声音。
然后他闭上了嘴,低下头,看着自己的鞋尖。那是一双新百伦的运动鞋,白色的,很干净,鞋带系得很整齐。他来公司一年半,每天穿的都是运动鞋,从来没有穿过皮鞋,老方说过他几次,说见客户要注意着装,他一直没改。
他可能以后再也不用改了。
因为在他低头看鞋尖的那几秒里,门被推开了。进来的是两个人,一个穿深色西装,一个穿保安制服。穿西装的那个我认识,是行政总监老徐,平时在公司年会上负责抽奖的那种笑眯眯的角色,但此刻他的脸上没有任何笑容。穿保安制服的那个我没有见过,块头很大,站在门口像一堵墙。
“周轶,公司安全委员会决定暂停你的一切工作权限,请你配合做一个调查。”老徐的声音不大,但每个字都像盖了公章一样正式。
周轶抬起头,看了看老徐,又看了看门口的保安,最后把目光转向了我。
那个目光里有很多东西。有愤怒,有委屈,有恐惧,有一种被拆穿之后无处可藏的狼狈,还有一种我读不懂的、像是某种决绝的东西。
他对我说了一句话。
“轶哥,你运气好。”
他说这句话的时候嘴角甚至带着一点笑,不是那种释然的笑,也不是嘲讽的笑,而是一种很奇怪的、像是在替我感到庆幸的笑。好像如果不是我运气好,我可能就不是在这里听他说这句话了。
我没有回应。
保安侧身让开一条路,周轶从我和老方之间走过去,经过那张快死了的文竹旁边,经过贴满便利贴的白板旁边,经过那扇永远关不严的办公室门。他走出去的时候,走廊里的灯光打在他白色的新百伦鞋上,照出一种不真实的亮白色。
门在他身后关上了。
老方站在原地没有动,办公室里的空气开始缓慢地流动起来,那种暴风雨前的沉闷气压正在一点一点地消散。他走到窗边,把窗户推开一条缝,十二月的冷风灌进来,带着北京冬天特有的干燥和煤烟味。
他没有回头,背对着我问了一句。
“你说,他到底图什么?”
我没有回答,因为我真的不知道。周轶的薪水不低,小组长的职位虽然不算高,但以他的能力和年龄,再干两年升个部门经理是大概率的事。他不是走投无路的人,不是被生活逼到墙角的人,他有大把的、光明的、体面的选择。
但他偏偏选了这一条。
我走出了老方的办公室。走廊很长,从这头到那头大概要走一分钟。我的工位在走廊的另一头,我要经过财务部、市场部、HR部门口,经过饮水机、打印机、那棵所有人都说快死了但一直没死的橡皮树。
走廊里很安静,大部分人都已经下班了,只有几个工位还亮着灯,键盘声稀稀落落的。我从走廊这头走到那头,打开自己的笔记本——重装过的新系统,清爽得像刚搬进去的空房子。
屏幕亮起来的时候,我看到了一条消息。
是周轶发来的。时间戳显示是五分钟前,也就是他刚被带走的时候。
“轶哥,提醒你一句,你的杀毒软件不是我第一个卸载的。”
我盯着这条消息看了很久。光标在输入框里一闪一闪地跳,我打了几个字,删掉,又打了几个字,又删掉。最后我没有回复,把聊天窗口关掉了。
窗外的北京城在黑夜里铺展开来,万家灯火,没有一盏是多余的。
我把手机翻过去扣在桌上,屏幕朝下,面朝桌面。
然后我把笔记本合上,收拾东西,打卡,下楼。公司大楼门口的风很大,我把外套的拉链拉到最上面,走进那片灯海之中。
全部评论