凌晨零点四十一,接收医院行政楼的会议室像被临时改造成了战情室。
窗帘拉死,投影幕布上分成四块:平台侧安全面板、医院侧签名队列、外部链路延迟曲线、取证进度清单。每一块都在滚动,像四条不同速度的河流,汇在同一处暗涌里。
林昼坐在靠门的位置,背后是走廊里断断续续的脚步声――夜班护士推车经过,保安交接班,值班医生在电话里压低声音。医院的夜一直很忙,只是忙的对象变了:以前忙的是病人,现在忙的是规则。
信息安全负责人把硬件令牌放在桌上,令牌外壳磨得发亮,像一枚被长期握住的旧钥匙。他没看林昼,盯着屏幕上的红色提示:“ghostsigner又来了。”
屏幕右上角弹出告警条:
**险请求挂起
类型:freeze.controllerchange
提交方:ghostsigner(未知主体)
来源:海外公共出口(cloudegress)
状态:等待第二签名
风险评分:96100
已自动拒绝:0(原因:待签名)
“待签名”三个字最危险。
待签名不是成功,也不是失败,它像一个陷阱:一旦有人误以为这是正常审批,点下签名,就等于把门闩自己拔掉。
监管联络人从手机里抬起头:“网安那边给了建议,挂起队列必须做到两件事:第一,任何挂起请求一律不在移动端展示,避免误触;第二,挂起请求必须附带‘双人复核记录’,一人看字段,一人看报文样本。”
信息安全负责人点头:“已做。移动端签名通道已关闭,只有两台固定工作站能签,且必须插硬件令牌。”
周负责人也在线,视频窗口里他背后是取证室,桌上铺满了封存介质。他的声音从音箱里出来,依旧平稳:“把ghostsigner的报文样本固化了吗?”
平台协查联系人立即回:“已固化。我们截取了请求头、payload的哈希、tls指纹摘要、以及平台内部解析后的字段映射。还包括同源ip在过去三小时内的重试节奏图。”
“重试节奏图”投上屏幕后,林昼第一眼就看出不对劲。
那不是随机的重试,更像人为编排的节拍:每57秒一次小幅试探,每5分钟一次高峰洪峰,洪峰时连发12次挂起请求,像在压测某个阈值。
信息安全负责人低声骂了一句:“这不是残留任务,这是手工跑的。”
监管联络人语气更冷:“手工跑的,意味着有人在操控。”
林昼没有接话。他只盯着那个节拍,脑子里浮现出同一个场景:有人坐在某台机器前,盯着同样的红点,等着某个疲劳的签名者犯错。只要错一次,控制权就可能被换走,而换走控制权之后,所有冻结与门闩都会变成摆设。
摆设,是他们最想要的状态。
---
零点五十五,平台协查联系人把“报文样本摘要”发到共享屏幕上。
请求头里有一行极刺眼:
user-agent:ghostsigner1.1(linux;x64)
x-client-tag:jenkins-agent
x-trace-hint:routeguardian
“jenkins-agent”。
林昼的心口像被轻轻戳了一下。这三个字把所有人拉回到白天封存的cicd:jenkinsagentpoolab,high_scope_token,audit_ref_optional。现在,幽灵签名的请求头里竟然带着“jenkins-agent”的标签,像一枚刻意留下的指纹。
网安技术支撑人员在视频里开口,声音不高但每个字都很硬:“这个标签可能是伪造的,也可能是复用某个现有脚本。我们看tls指纹。”
平台协查联系人切换到下一页:tls指纹摘要(ja3)与握手特征。
网安人员迅速扫了一眼,问:“有没有对比样本?比如你们从供应商运维网段出来的请求指纹。”
平台协查联系人说:“有,我们做了比对。ghostsigner的ja3与供应商正常运维请求的指纹不一致,但与供应商cicdagentpool在过去三个月里的一类请求指纹高度相似。”
“高度相似”四个字像一根线,把幽灵和管道绑在一起。
周负责人在音箱里说:“也就是说,幽灵签**可能来自那套agentpool或复刻了它的握手栈。”
网安人员补了一句更直白的:“要么是供应商内部有人拿着agent的环境在做事,要么是外部人拿到了他们的agent镜像或证书。两种都严重。”
会议室里沉默了几秒。沉默不是无话可说,是每个人都在计算后果。
如果是内部人,那就是对抗取证的行为升级;如果是外部人,那就是凭据泄露造成的持续攻击,供应商治理责任更重。两种都指向同一个结论:问题不止“历史遗留”,而是“仍在发生”。
林昼终于开口,声音压得很低:“挂起请求能否被自动作废?比如超过十分钟无二签,直接废弃并拉黑源?”
平台协查联系人点头:“可以。我们已经把挂起队列的有效期从默认24小时降到10分钟,并开启源ip的行为评分。超过阈值会触发速率限制与临时封禁。”
信息安全负责人接着说:“医院侧也会做‘签名哨兵’:任何出现controllerchange字样的请求,自动生成一份‘四链核对单’――提交方、审批引用、变更窗口、责任人。四项缺一,永远不签。”
监管联络人看向林昼:“你之前强调的四链,现在成了签名规则。”
林昼点头,却没有一丝轻松。他很清楚,对抗者会不断换皮:今天是controllerchange,明天可能是policyoverride;今天是ghostsigner,明天可能伪装成“平台系统任务”。规则要跟着敌人变,但核心不能变――谁都不能凭空拿到钥匙。
---
一点二十,供应商又来电话。
不是合规负责人,是那位区域总监。电话一接通,对方的语气就像提前排练过,温和里带着强制:“林先生,我们注意到医院内部有人在使用一些极端措辞,比如‘暗门’‘撬锁’。这会误导临床,影响合作。我们建议你们停止相关描述,并配合我们发布一份联合声明,安抚情绪。”
林昼听着,心里反而更冷。他没有争辩措辞,只问一句:“你们的cicd里为什么存在audit_ref_optional=true?”
区域总监明显卡了一下:“这个属于技术细节,我们正在核查。现在重点是稳定临床。”
林昼语气平静:“稳定临床靠双通道和可控波动数据,不靠联合声明。你们要安抚情绪,先把四链补齐:审批链、授权链、运行记录、回收证据。四链齐了,任何声明都站得住。四链不齐,声明只是遮羞布。”
区域总监沉默两秒,声音压低:“林先生,你要明白,这件事走到现在,对谁都没好处。你把供应商逼到墙角,我们只能采取措施保护自己。”
“保护自己”四个字,一半是威胁,一半是预告。
林昼没有被激怒,他只回一句:“你们保护自己可以,但不能用医院和病人做筹码。任何施压都会被记录。”
电话那头挂断得很快,像怕再多说一句就留下更多证据。
信息安全负责人看着林昼:“他们开始抓人了。”
“抓人”不是抓词,是抓替罪羊,抓话语权,抓情绪的开关。只要他们能把矛盾变成“某个人煽动”,就能把系统性风险缩成个案,缩成一次误操作,缩成一张处分通知。
缩成个案,暗门就能活。
林昼抬起头,看着投影上的取证清单,缓慢说:“我们不能让它缩。必须把‘默认绕过’和‘高危自动化’钉在治理层面。”
周负责人在音箱里回应:“我们会在阶段报告里写:架构性风险不可被个案处分替代。你们院方也要坚持这个口径。”
监管联络人点头:“会发文。”
---
一点四十五,q7又来了一封邮件。
依旧只有一句话:
“他们会甩锅给devops_x,今晚就办离职交接。真正动0405的不是他。”
邮件没有附件,没有图片,没有任何可被质疑“伪造”的东西,只有一句提醒。但这句提醒足够锋利:它指向那个最常见的结局――把锅扣给一个工程师,让组织的“默认绕过”继续存在。
林昼把邮件头信息按流程提交给周负责人和网安,不做任何回复。他知道“别回我”不是矫情,是救命。任何一次回复都可能暴露线人。
网安技术支撑人员在视频里说:“我们会把devops_x纳入证人保护范围,要求供应商不得以离职、调岗等方式施压。同时,我们会调取0405的操作链条,确认真实操作者。”
监管联络人立刻跟进:“我现在下发书面提醒:任何‘快速处分个案’必须先经监管备案,且不得妨碍证据保全与证人陈述。”
信息安全负责人补了一句:“医院侧也要做准备。对方如果来院里推‘联合声明’,我们只给他们一条路:提交四链与整改方案。”
林昼听着这段安排,心里没有松动,反而更紧。他知道对方甩锅不一定是为了脱罪,有时是为了灭口:把工程师推出去,让他背上“违规”标签,再让所有人明白“说实话的下场”。这比技术攻击更阴。