佐伊给医务处打电话的时候,是早上八点半。
医务处的办事员刚泡好今天第一杯红茶,还没来得及喝上第一口,电话就响了。屏幕上的来电显示:Zoey Prince,BC0017。办事员愣了一下——普林斯博士从来不和医务处打电话沟通工作,她的排班、学术讲座、资料提交等事宜一向通过系统流程,格式规范,理由清晰,附件齐全,比任何住院总都省心。
但今天她直接打了电话。
“早,我是佐伊。”电话那头的声音很平稳,语速比平时快一点,“周五备班和周六白班我没法值了。请你安排Lisa副主任值周六白班,安东尼主任值周日夜班。周五白班留给艾登,他上周欠了一个,正好补上。周日白班让帕特尔住总跟,她夜班经验还不够,白班再练一轮。所有排班都已经在排班表里更新发你了,你看看。”
办事员张了张嘴,想问一句“为什么要换班”,但还没来得及出声,佐伊已经把电话挂了。
不是不礼貌,是她没有时间。
她已经在技术中心待了将近32小时。不是那种“坐在工位上敲敲代码、偶尔起来倒杯热巧克力”的32小时,是那种“每一分钟都有新的攻击波次、每一秒都有系统在告警、每一个决策都关系到整个集团数据安全”的32小时。
攻击是在周三中午十一点五十分开始的。
佐伊当时正准备回27楼睡一觉——前一夜在ICU顶了Lisa值完夜班,交班的时候还和三床的家属治疗策略调整,签完最后一个病程记录,她脱下白大褂,换上那件深蓝色卫衣,打算去19楼拿一份荷兰三期进度表就回去休息。
她刷卡进工作室,工作站还没完全唤醒,屏幕上突然跳出一串红色的告警——不是ICU后台那个她看了十几年的、稳定的、偶尔才会弹出一个黄色预警的界面,是Beacon核心数据库的入侵检测系统。
满屏的红色。
佐伊只用了大概五秒钟就读完了告警日志的第一页。分布式拒绝服务攻击,攻击源分布在至少七个国家的十几个节点上,攻击流量正在以每三分钟翻一倍的速度攀升——这不是什么脚本小子在练手,也不是勒索病毒在广撒网,这是有组织、有预谋、有针对性的攻击。
目标清晰到不带任何伪装,直指Beacon的港口调度系统数据库。
佐伊一只手搭在鼠标上滚日志,另一只手在拨电话。
第一个电话给Jotish。响了六声,没接。她挂断,发了一条消息:“核心数据库被攻击。我在19楼。”
第二个电话给Vital。响了半声就接了。
“核心数据库被攻击。”佐伊的声音和平时在交班室汇报病例一模一样,“攻击源分布在至少七个国家、十几个节点,流量每三分钟翻一倍。你现在在哪。”
“机房。刚调完南安普顿节点的日志。”Vital的声音从听筒里传出来,背景是服务器风扇低沉的嗡鸣,“我马上到。”
“不要马上。你现在去核心机房,去冷通道,把所有对外接口的物理日志全部拉出来,旁路镜像,不要在线操作,不要在已经被污染的链路上留痕迹。我给你开权限。”
“明白。”Vital的脚步声已经在走廊里响了,“你呢?”
“在工作室。先堵漏。”
佐伊挂了电话,把工作站推到一边,拉过外接键盘,三个显示器同时亮起来。左边是入侵检测日志,中间是核心数据库的实时访问流,右边是她刚打开的应急响应脚本编辑器。
她的手指落在键盘上,和以往数万次敲击一样快、一样稳。但这一次,她不是在写让AGV跑得更顺的调度算法,不是在优化预警系统的假阳性率,她是在打仗。
第一波攻击在十一分钟之后被暂时堵住了。
佐伊临时写了一个流量清洗规则,把异常请求的特征提取出来,写进防火墙的黑名单。但攻击方的反应比她预想的更快——第二波攻击几乎在她封堵完第一批漏洞的同时就开始了,换了协议,换了端口,换了伪装的方式。攻击源从十几个节点扩散到将近四十个,像是有人发现第一脚没踹开门,往后退了两步,然后猛地又撞上来。
佐伊盯着屏幕。她的手指在键盘上停了一下,然后重新落下。
“康妮。”
康妮站在门口,手里提着午饭——三明治、水果切,还有代餐奶昔。她推门进来的时候还想着要提醒佐伊早点回去休息,但看见三个屏幕上满屏滚动的红色日志和佐伊脸上那个表情之后,她把托盘轻轻放在茶几上,什么都没说。
“帮我做几件事。”佐伊头也没抬,“第一,联系总经办,让他们群发通知:技术中心进入紧急状态,所有非核心业务系统暂时下线,恢复时间等通知。第二,给营养科打电话,告诉他们技术中心八十多个人未来至少四十八小时需要持续供餐。三餐两点,凌晨一点加一顿宵夜。餐标和平时给我配的一样。热咖啡、热茶还有能量饮料放茶水间,这48小时不限量,全部走我的个人账户。第三,拉你的后勤与物业团队,支援我们整个技术部的后勤工作,我们需要很多备用网线、接线板,腾出最大的会议室,具体事项我一会儿拉清单给你。最后——”
她停下来,把防火墙规则写入确认之后,才继续说:“最后,帮我把Jotish找回来。告诉他,不管他在哪儿,回来。”
康妮点了点头,转身出去了。走到门口的时候她回头看了一眼——佐伊已经把冲锋衣外套脱了,只穿着那件深蓝色卫衣,围巾还没解,灰色的羊绒在脖子上绕了两圈,末端从肩膀垂下来。她一只手敲键盘,另一只手拿起康妮放在茶几上的代餐奶昔,插上吸管,吸了一口,然后放在一边。康妮轻轻带上门。
到中午十一点,技术中心八成以上的人都已经就位了。会议室已经被迅速改造成了作战指挥中心。
没有人收到正式通知——不是那种群发的、措辞严谨的紧急召回邮件。消息是在技术中心内部的通讯群里炸开的。是软件工程师在群里发了一张入侵检测的截图,配了三个字:“出事了。”
然后Vital在核心机房的照片紧跟着跳出来——他蹲在机柜前面,手里攥着一根光纤跳线,额头上全是汗,对着镜头比了个“搞定了”的手势,但脸色一点都不轻松。
然后佐伊在群里发了一条消息。
没有感叹号,没有“紧急”,没有任何一个多余的词。只有一份在线文档的链接。
她在第一波攻击的间隙花了十五分钟排出来的四班倒值班表。四个班,每班十二小时。A班和B班负责防守——A班盯网络层,B班盯应用层。C班负责维护——保证所有还在跑的系统不因为攻击而连锁崩溃。D班休息——必须在指定区域睡觉,不许回工位,不许偷偷上线。每十二小时轮替一次。八十多个人,每个人的名字、职责、搭档、休息时间段都标注得清清楚楚。
“各班按照排班表执行。休息班的人必须睡觉。我在协调岗,不受此表限制。有问题随时找我。内线1901,或者直接来19楼。”
消息发出去之后,群里安静了大概三秒。然后一个刚入职不久的硬件小兵回了一个狗敬礼的表情包——一看就是从vital那边偷的。紧接着,一串“收到”排着队跳出来,整齐得像一队等待检阅的士兵。
没有人质疑为什么一个系统架构师在指挥一场网络安全攻防战。没有人问“你难道不是医生吗”。没有人觉得那个狗敬礼的表情包不合时宜。因为他们都知道——不管佐伊在哪里,不管她半夜在ICU里签死亡证明还是在19楼改调度算法,当系统出事的时候,她永远是对的,永远是第一个冲上去的,而且永远想得比任何人都周全。
Jotish今天约了体检,几乎一整个上午,手机都被锁在了更衣室的柜子里,下午一点,他换好自己的外套,从口袋里拿出手机的时候,差点被密密麻麻的未接电话吓得当场心梗。
然后这老头板着脸回来了,骂骂咧咧的说居然有人胆敢“动老子的构架”。拖过工作室的键盘,戴上耳机接入内部通讯频道,打了佐伊的内线,“我和维保一起守医疗和能源版块,防着他们侧面进,你们年轻人把港口运输条线顶住。我后台给你们打补丁。有需要的时候叫我。”
“好,知道了。”佐伊回了一句,就切了频道。她没时间寒暄,她还要指挥软件工程的四个小组和硬件的三个班。
会议室里横七竖八拉满了网线,满地的接线板被临时压线板固定在桌面和地面上,会议室外面的走廊里堆满了补给的餐食,后勤执勤与物业的先生们搬了不少桌椅,给大家吃饭和休息。
安东尼收到了调班邮件,医务处并没有说明调班原因。但他很快就通过后台发现佐伊的心率持续在110左右,打电话不接。Vital也不接电话,而且两个人没有回复任何一提条私聊。
他猜测大概是技术中心的事,因此来19楼看看。几乎是踏出电梯门的一瞬间,他就被这里井然有序的紧张震惊了,他的脚步在电梯口暂停了最起码五秒——补给物资、休息睡袋、网线、接线槽、桌椅铺满了平时空荡荡的走廊。有个正在走廊里啃三明治和水果切的硬件工程师认识安东尼,冲他招了招手,“你怎么来了?佐伊在忙,有人打我们老家,技术中心在守塔。”
安东尼没多问,探头看了一眼会议室里横七竖八的显示器,和满墙的时序图,佐伊那个标志性的灰头发身影在会议室门口闪了一下。安东尼转身走了,他知道帮不上任何忙,与其站在这里着急佐伊的心率,不如回去守好ICU。
攻击在第二天的凌晨达到了白热化。
不是探测,是正面强攻。四条攻击向量里,两条是伪装成常规API调用的SQL注入,目标直指调度算法的训练数据集;一条是利用某个三天前刚披露的零日漏洞试图穿透应用层防火墙;最后一条是针对运维□□的暴力破解,字典攻击,词库精准到包含了Beacon内部常用的工号前缀和默认密码变体。佐伊看到那条暴力破解的字典时,手指在键盘上停了一秒。这个字典太精准了,不是外部情报能拼出来的。有人来过。
她把水杯往旁边推了推,开始打字。
她先封了□□的认证端口,把所有远程运维账号全部强制下线,重新签发证书——用了Jotish早年写的一套离线根证书系统,那套系统因为部署太麻烦一直被运维组抱怨,佐伊曾经花了一整个周末把它改成了一键签发版,当时只是为了让自己省事。现在它派上了用场。
然后她在应用层防火墙前面加了一层反向代理,把零日漏洞的攻击流量全部导到一个蜜罐容器里。蜜罐里放的是去年被废弃的初版调度算法,跑起来和真的一样,但核心参数全是乱的。对方如果在分析蜜罐返回的数据,大概需要六到八小时才能发现被骗。六到八小时,够她做很多事。