第九月的夜里有点凉。园区路灯下的法桐叶子还没落,只是颜色淡了半档。凌晨一点过,运维楼三层只剩一格灯亮着。中央空调换风机的声音被听成了背景的一部分,均匀、低频,几乎可以忽略。键盘右下角留着掌根压出的一片温热。林默做完当天最后一轮巡检收尾,照例在关机前把监控大屏整体扫一遍——这个习惯养成于那年算不清来路的间歇掉线,如今加固成了每晚的最后一道工序。
大屏上的绿,比过去任何一个季节都安分。政务云一期运行平稳,二期邀标材料在下周齐套,市里各条线的驻场单位轮流提交的巡检报表一页页滚过去,没有一个红字。王海涛的周报最近也是干的——只有流水,没有刺。整栋楼睡了半个月的好觉。
正是这份安分,让他每晚都多看两眼。前几天他自己也给过解释:可能真没事了。锐科退场留下的空当,被几家大厂稳稳接住,链条上所有的敌意暂时都没有着落点。可是解释归解释,扫描归扫描,这两件事在他的日程里从来不打折——进程性的事一旦打折,改回来就要付双倍的价钱。
今晚这一遍扫下来,视线在大屏右上方停住了。故障视图的角落里,浮着七粒浅黄。颜色调得很低,如果不当场凑近看,很容易当成屏幕图层叠出来的色差。他没有立刻点开,先把室内头顶的灯又关掉一路,让面板的对比度自己擡上来——黄粒还是七粒,位置不动,亮度不闪。
七粒,散布在他职权范围之外的几个方向上。他调出全市政务系统的总体拓扑图。这张图平时锁在网络处的内部分区里,以他如今的牵头上位与技术把关角色,读权限上个月起就有了。灰底大图顺着显示器铺开:十几个委办局的节点密密麻麻,链路纵横交错。全市刷脸办件的总闸在最东头——人社的实名认证接口,日均承载数百万次身份校验;市场监管的登记回流偏西南一角,企业年报与执照变更全走那条信道;交通卡口的数据汇聚压在城北环在线,实时车流与违章抓拍都朝那里集中;郊县的一座数据泵孤悬在外,负责气象观测数据的定时推送,平日无人问津,却牵着一整条防汛预警链。
七粒浅黄,就缀在这四个方向的关节处。他把其中三粒展开,先看各自的单机曲线——每一台单独拎出来都体面得很:延迟峰值多了十几毫秒,离告警阈值隔着老远,值班表上的人扫一眼只会写下「网络略有波动,已关注「六个字。单看,全都无罪。
天枢在这时开口。今晚它的频率放得很低,没有惯常的开场玩笑:【把七条曲线叠到同一个坐标系试试。】
林默把视角切换成分屏叠加。七条曲线落进同一个画面里的一瞬间,那些单机上无关痛痒的小起伏,忽然有了共同的方向。都是出站方向的回包被拖慢。入站正常。节奏也对得上——卡的全是那几个固定的业务时序,像对方熟读过各委办局的日历,专挑数据吞吐的低谷窗口下手。起始时刻仍然在咬合:第一批抖动出现在三天前的凌晨两点四十上下,其后两夜,每小时段的分布进一步靠拢。一粒黄是波动,两粒黄是巧合,七个方向的黄朝着同一个方位倾斜,就是工程。他把手边的笔记本翻到空白页,在这行结论下面画了一道横线。
【同步性成立。】天枢把时间轴拉长到七十二小时,【起点三天前。每天的强度比前一天高一档,白昼自动回落。这不是哪台设备老化出来的样子——是在有人校准什么东西。】
「校准「两个字,林默咀嚼了一下。它不是攻击用语。攻击讲究结果,校准讲究过程。有人正在一张横跨全市的大网上反复测量同一件事,并且每天根据测量结果修正力度。测量弹性的动作做到这个份上,距离真正出手,中间隔着的只是一个日期。
他没有再往下想。当下的每一步推理都得留给证据,这是本月以来他用职位换来的纪律之一。第二天的周会上,会议室里的气氛松快得近乎节日。
陈志远把季度的运行报表摊在桌面正中,纸页边缘拍出一声脆响:「各位看看这数据——告警量环比降了七成,工单平均响应提前两个小时。咱们总算熬出头了!「他环视一圈,脸上的圆润线条全是舒展的,「这段日子大家可以缓缓,身体是本钱呐。「底下一阵附和的笑。几位中层交换着眼神,彼此说了些「应该的「「领导带队有力「之类的场面话。
王海涛坐在斜对面靠墙的位置,全程没有接茬。他低头看着自己的笔记本,手里的笔转得飞快。这支笔转起来的样子,最近成了楼里少数几个人心照不宣的信号——锐科退场之后,他失去了所有外放的锋芒,只剩下这种攥在指缝里的东西。转动的速度和他脸上没有表情的程度成正比。
没有人知道他在等什么。林默也不打算猜。会议议程过半,轮到林默汇报。他站起来,把二期准备工作的三条主线讲完了,数字念得不快,每一条都对着报表上的原始字段。讲到风险预案时,他把北向网关压测窗口错峰的那一条略过了细节——那是给三期准备的,今天场合不到。
念完最后一个数,他说:「以上。「回到座位,翻开自己的笔记本。在上午记事的最下面一行,他顺手画了一个小小的方框,方框里没有写字。那个空框,是给他此刻不便明说的东西留的位置——雷达上真正扎眼的那张全网校准图,还没到能放上这张桌子的时候。
散会人流往外涌。林默没接陈志远那句「缓缓「。
他起身收拾电脑,路过茶水间门口,瞥见走廊尽头陈志远的办公室——门虚掩着一指宽的缝,里面亮着灯。这位老板刚在会上讲完「身体是本钱「,转头又在午休时间里对着银行流水核第无数遍回款计划。手机屏幕上开着计算器,指头按得很慢。林默没有敲门。
有些话必须等到手里有完整的东西才说。空着手去向老板汇报「我怀疑有人在测绘全市政务网「,换来的只能是两个失眠的夜晚外加一场无从下手的高度戒备——高度戒备这件事在没有证据支撑时本身就是消耗,会把全公司的精神都耗在一道稻草人的影子上。而他眼下真正缺的,恰恰是把影子变成实体的那几天。
回到工位,他先调出拓扑图,把最外侧那粒浅黄节点悄悄加了一道访问限速——顺手的事,像给一扇没上锁的门先别了根棍。路过的同事探头瞥见,停住:「林工,这节点……你怎么知道要堵?「林默没擡头:「等证实了再说。「同事「哦「一声走了。屏幕冷光里,周会上那点节庆似的松快,无声无息挨了一下打脸。
接着他做了两件事。
第一件,把昨晚那张拓扑截屏连同七条曲线的原始导出包,全部收进私人分区最深的那一层。目录结构沿用此前定下的规矩:文档名只有日期与序号,没有任何备注。这一层如今躺着四样东西——境外编译指纹、灰夹克的步态记录、胸徽的拓样,加上今天的这套曲线包。四样东西彼此独立,无一句话相连,可它们的密度都在同一个量级上。第二件事他做得更慢。打开一份新建文档,标题敲的是《关于近期跨域流量异常模式的观察演示文稿》。擡头规范、措辞中性、附件列表预置了三格空位。他把已知的现象写了两页,结论一栏只填了半句话:
「建议持续观测至具备交叉验证条件后再行研判。「
写完,存盘,打印了一份纸质稿。他没有把它发进OA,而是折起来放进办公桌右侧第二个抽屉,压在那盒一次性口罩底下——那是他早年存竞品情报用的老位置。这个位置的规矩他很清楚:什么时候三个附件格里都有真货了,什么时候它就走正门出去。宁可晚上报三天,不能交上去一份空壳。
布防那天,走的全是明路。周二上午九点半,他在公司的变更管理系统里提交了一张单子:《政务云二期前置·安全态势感知专项(旁路镜像部署)》。变更内容写得规规整整:在市级汇聚层旁路镜像端口接入态势感知分析设备一台,仅采集拷贝流量,只读模式,双向不改包;作业时段凌晨两点至四点;回退方案两套;影响评估一页。单子往下流转的路径是这样的:公司侧第一签署人是他自己——技术把关牵头,权限范围内签得起;随后送到大数据局运维口的对接岗,再到网信办的备案接口。整个链条上没有任何一环需要他动用旧日的灰色技巧。周三傍晚批下来的红头意见一共八个字:「同意实施,注意脱敏。「
这与一年前那个周六凌晨的情形判若两个时代。那时他在机房里一个人干四个小时,干完连张正经的工单都没有;如今同样的活儿,他只需要一份让人挑不出毛病的前置文档。规矩从来不是束缚——攒够了信用,规矩就是通行证。周四凌晨两点,实施窗打开。
机房的温度比外面低七八度。冷信道灯带映在地砖上,风扇声从头顶两侧灌下来。他带着设备进场,按变更单逐项操作:镜像端口插纤,分析设备上架加电,配置导入,采集基线启动。整套流程走了五十分钟,比单子上承诺的窗口富余了七十分钟。技术上真正的用心不在安装,而在两个细节。
第一处是采样节拍。常规态势感知设备抓包是均匀频率的,一分钟几百次,整齐划一。这种整齐有个副作用:对面若有懂行的对手反向嗅探,一眼就能识别出「此处挂着一只固定的眼睛「。林默把采集间隔改成了不规则串行——相邻两次采样之间的间隔取自一组素数串行,再加进一个随机抖动因子,每一档间隔都在基准值上下浮动百分之十几。落到对面的探测器上,这条采集轨迹不像任何一台标准设备的输出,倒像一片杂乱的自然噪声。眼睛存在,但眼睛没有形状。
第二处在诱饵。布防清单原本要在每个可疑节点上都配齐深度解析模块。林默在最后一步做了减法:郊县那座气象数据泵旁边的防线,他只配了一道粗筛。粗筛的位置做得不高不低,恰好是一套「预算有限的中型单位「会部署的水平——漏洞的形状经过精心裁剪,看上去像是某个项目组上个月的一次版本叠代没有跟上安全补丁所致。
这道口子留着做什么,纸上没写。对方的针每次戳进来,戳到的阻力大小、选取的角度、回撤的速度,都会被外围的镜像层原样记下。一次是噪声,三次是模式,十次足够画出持针那只手的全部习惯。被动挨打和主动喂招的区别就在这里——他把自己摆在了一个可以控场学习的位置上。
收尾时窗外仍是黑的。设备柜门合拢,钥匙归还,机房门禁的最后一次刷卡记录停在三点二十一分。系统日志里多了一条当晚的变更记录,编号、运行人、批准文号一一在列,谁来看都干净。第二天早上,他给自己冲了两杯咖啡。第一杯在工位上喝完,第二杯端着走向茶水间的时候,正好碰上行政小姑娘抱着一摞二期材料的复印件往里走。两个人侧身让了让。她随口聊了一句:「听说咱们的变更好快,昨天网信那边备案秒批。「
「他们也想早点把东西看得更清楚。「林默应了一句,笑了笑,替她扶住将要滑落的一页纸。这句话没有夸张。此次立项批得顺畅,本身就说明了一件事:在更高的层面,有人也觉得这套系统的透明度不够用了。
新布设的探针跑满七十二小时后,第一个真正有分量的发现落了下来。那是周日深夜。林默照例在关机前扫屏,天枢直接把一份数据切片推到了视野前端——不是告警,是一条比对命中提示。
【七天里,对面在回包间隙投放的东西被解析出来了。】它的语速慢了一档,【零零碎碎,拼接条件苛刻,换了三套模型才拼圆。你看。】
画面中央展开一段十六进位串行,旁边并列着它的解码结果。林默逐行读下去,读到第三行时坐直了。那不是一段完整的攻击载荷。它被拆成了许多细小的片段,分别夹在不同委办局节点的回包填充字段里——每一段单独拿出来都是无害的字节,长度不超过协议允许的padding上限,不触发任何深度检测规则。拼装必须满足三个条件:来自同一业务时隙、按特定的偏移排序、并在最后一个校验字段上对齐。也只有守在同一面镜子后面日夜不停地看的分析进程,才有可能把这只千片之兽重新拢出一个轮廓。
这些碎片指向一个源标识前缀。那个前缀不在本地政务云的注册名录里,不在任何一份他经手过的供应商资产清单上。字段编排的语法带着一种陌生体系的习惯:分隔符位置、校验位算法、转义符的处理方式——都是另一套规范训练出来的笔迹,被硬生生借进了本地协议的语境里,像用陌生的方言在别人家的墙上写字,笔画对了,运笔的习惯却是外面的。
