最后她切进数据库审计日志,把过去四十八小时内所有访问过训练数据集的账号全部拉出来,交叉比对IP、MAC地址、操作时间、查询内容。结果出来了:三个账号异常。一个是离职员工的工号,权限没来得及收回;一个是某个海外港口现场工程师的账号,但他本人此刻正在睡觉;还有一个让她停了更久——一个图书馆公共检索台的账号,权限很低,但那个账号在两周前被用来查询过核心交换机的端口映射表。她不知道对方是怎么拿到这几个账号的,但攻击者的渗透深度比她预估的还要深一层。
她把异常账号全部冻结,权限回收,操作日志打包发给安全审计组。然后在加密语音频道里说:“Vital。”
“在。”
“物理层有动静吗?”
“有。”Vital的声音混着机房空调的白噪音和示波器的滴滴声,“十七楼B区,七号机柜的光模块指示灯在闪。不是正常的数据传输,是有人试图通过光模块的带外管理通道建立反向隧道。还好你让我下来盯着。”他顿了顿,“我正在拔网线。”
“等等。先别拔。我要看看他们往哪个地址回传。”
Vital停住手,光标悬在SSH终端上。他看着光模块的Tx指示灯以一种非标准的频率快速闪烁——不是数据包的正常脉冲,是编码过的。有人在光模块的固件里植入了后门,正试图通过带外通道把什么东西往外送。他看着指示灯又闪了几秒,心跳比平时快,但手是稳的。“地址在跳,像是多重代理。真实IP在荷兰港——妈的,他们走的是我们自己的专线。这帮孙子用的是我们荷兰港的出口节点。”
“抓到了。溯源完成。荷兰港只是跳板,下一跳是法兰克福,再下一跳……”佐伊的声音停了一瞬,键盘声密集地响了一阵,然后停下来。“德国一个叫Lukas Wagner的云服务商,注册地址在汉堡港区。再往下挖,关联到一家叫PMS的芬兰公司。查尔斯去年在奥斯陆见过他们的CEO。最终的IP……在奥斯陆。”
Vital沉默了片刻。商业间谍。不是黑客团伙为了炫技,不是勒索软件为了赎金,是竞争对手有组织、有计划、有预算的攻击。目标明确:偷算法,赶在荷兰三期验收之前。
“Vital。”佐伊的声音把他拉回来。
“在。”
“现在拔网线。七号机柜整排光模块全部物理断开,回滚到本地备份链路。端口映射表已经被污染了,别信交换机自带的拓扑。我刚刚手动重配了核心交换机的VLAN隔离,十七楼B区现在在独立的逻辑子网里。”
“明白。”
他蹲在机柜前面,把光模块一只一只拔下来。动作很快,像拆卸一件熟稔于心的武器。每拔一只,机柜面板上对应的指示灯就灭一盏。光纤端面在机房冷白的灯光下闪了一下,然后暗下去。
与此同时,佐伊打开通讯软件,给后勤发了一条消息:“明天早餐加量。夜班结束的人需要热的——粥、蛋、面包,尽量热。谢谢。”
后勤的回复来得很快:“在准备了。我们康妮老大昨晚已经把未来三天的菜单送过来了。”
佐伊盯着那行字,微微笑了一下。拆了一根棒棒糖塞进嘴里,继续看入侵日志。
第二天中午,攻击方终于暴露出更致命的特征——他们的渗透手法使用了ODIN协议的变种。ODIN是北欧几个技术强国联合开发的一套工控系统安全监测框架,本身不是攻击工具,但它的协议栈可以用来绕过传统防火墙的深度包检测。能拿到ODIN协议栈内部源码的团队,在全球范围内不超过五个。
佐伊把这条信息发给技术中心安全组,不到两个小时,攻击源就被锁定在一个非常具体的范围——奥斯陆地区,一个以提供“商业竞争情报服务”著称的技术公司。这家公司的客户名单里,有三家是全球排名前十的港口运营商,其中两家在过去六年里至少派过三拨人来Beacon的无人码头“参观学习”。
这不是市场行为,是非法窃取。
查尔斯是在事发后第四十小时才接到佐伊电话的。
他当时在悉尼,刚结束一场与澳洲煤炭及天然气供应商的谈判晚宴。手机震动的时候他正站在酒店落地窗前,窗外是悉尼港的夜景,歌剧院在暖黄色的灯光里像一组正在起航的帆。他看见来电显示,接起来。
“查尔斯。”
佐伊的声音从听筒里传出来。和以往每一次一样平稳,但查尔斯听出来了——她的语速比平时快了将近一倍,背景里有键盘声、有人说话的声音、还有某种低沉的嗡鸣——大概是核心机房的服务器风扇。
“Beacon数据库被攻击。我们已经查明了身份。”她开门见山,没有寒暄,没有铺垫,“是一家北欧的商业情报公司,客户里有三家港口运营商。他们用ODIN协议栈绕过我们的防火墙,渗透了将近两天。正在逐步撤退,不过他们的攻击线路、跳板节点、入侵时间戳,还有攻击目标的选择逻辑,数据全部在我们手里,证据链已经固定好了。”
查尔斯站在窗前,看着悉尼港的灯光。他没有打断她。
“接下来我说的话不是技术建议。”佐伊的声音还是那么稳,但里面有什么东西在变硬,“是谈判筹码。”
“他们最大的客户——那家港口运营商,今年冬天有一大批LNG船要从北海航道过。他们的能源合同下个月到期,续约谈判的对手现在正在奥斯陆等回复,而他们的欧洲能源采购网络有超过七成依赖Beacon的航线数据。圣诞节前的两个月,是欧洲取暖油和发电用气运输的黄金窗口期。现在已经11月26日了。”
“告诉他们,管他LNG船还是石油还是煤炭,统统别想从北海过。如果再敢动我们的数据库——不,不用‘如果’。只要他们再来偷鸡摸狗,我就让他们今年冬天自己去劈柴火取暖。航线数据、靠泊窗口、潮汐窗口期算法——这些我们全部可以切断。”
查尔斯沉默了大概三秒钟。然后他开口了,语气和平时在董事会上听到一个出乎意料但极其精彩的议题时一模一样。“证据链够不够硬?”
“够。每一条都有日志佐证。”
“攻击还在继续吗?”
“正在褪去。他们大概已经发现啃不动了。”
“好。”查尔斯把手机从耳边拿下来,看了看屏幕上的时间——悉尼凌晨零点四十一分,“你把证据链打包发我。我这边现在午夜,等天亮我就启动新的谈判。你那边需要我做什么。”
“什么都不用。技术这边我们能行,团队已经守住了。你只管去谈。”
查尔斯听着她的声音。没有“你能不能马上回来”,没有“我撑不住了”,没有“需要援手”。她只是告诉他——事情发生了,已经处理了,现在这件事情是你的筹码,用它去获得我们应有的赔偿。
“佐伊。”
“嗯?”
“你多久没睡了。”
电话那头安静了大概不到一秒。“够了。间隙的时候睡过了,够用。安东尼盯着的。”
“好。”查尔斯没有追问。他知道追问没用,也知道安东尼在,“结束后我给你电话。”
“好。再见。”
电话挂了。查尔斯站在落地窗前,看着悉尼港的灯光在夜色里闪了许久。然后他拿起手机,给许久没有联系过的竞品CEO拨了个电话。
持续四十八小时的高强度对抗,终于开始松动。不是那种“暂时偃旗息鼓、换个马甲再来”的撤退,是那种被彻底打疼了、骨头硌了满嘴血、发现这块骨头啃不动的撤退。他们的攻击流量在四十九小时前后开始急剧衰减,渗透尝试的频率从每分钟上百次降到个位数,最后一条异常请求停留在UTC时间上午10点11分。Vital在核心机房的监控屏前守了整整最后一个夜班,亲眼看着入侵检测系统上的红色告警一条一条熄灭,像台风过后海面上最后一个浪头也终于平了。
佐伊喘了口气,在对讲频道里发通知,在岗的全部回去休息,刚休息好的岗位顶上来,维护12小时,12小时候没有动静的话,解散,恢复日常维护模式,有问题随时电话。
键盘声停下来了,显示器一个一个暗下去。一些躺在折叠椅上休息的人睁开眼,抱着毯子坐起来,把在显示器前揉眼睛的人赶走。走廊里的脚步声密集了一阵,然后慢慢散开,往休息室、公寓、任何一个有平面可以躺的地方。
Vital是最后一个从机房出来的。他的眼睛熬得通红,衬衫领口解开两颗扣子,袖口歪到小臂上。帆布袋搁在一边,里面多了几根用过的光纤跳线和一块坏掉的光模块。佐伊靠在会议室门框上,看着散干净了的走廊,满地的网线和电源还留着,明后天再说。Vital走到她面前,顿了一下,然后他叹了口气。
“复盘报告我来写。”
“不行,硬件侧归你,整体架构归我。”佐伊回了句。
“别以为我不知道你前几天顶夜班,我们其他人轮班轮岗,你TM快六十个小时没睡了,你自己在医院里当医生的时候怎么跟病人说的?”Vital把帆布袋往肩上一甩,“睡一觉,明早再写。jotish那老狐狸早就回去睡了。”
佐伊慢慢转身,往自己的工作室走。Vital跟在她后面。推开门,她没开大灯,只拧亮了台灯。她合衣躺下,扯过毯子盖到胸口。Vital站在门口,帮她掩上了门。