林昱有些自嘲地摇了摇头,强迫自己把这些莫名其妙的念头抛开。 然后他打开门,准备向容川道歉,然后心平气和地把项目的事聊一聊。 房门打开的一瞬间,他看见了靠着墙壁蹲坐在地上的容川。 听到声响,对方迅速站了起来,看向他的目光里都是惊惶与自责。 在他说话之前,容川已经哑着嗓子开口了:“对不起,我错了……那个项目我已经和对方说不接了……所以你可不可以别生气?也不要不理我?” 那一刻,林昱觉得自己的心被狠狠揪了起来。 眼前的容川像是一只受惊的流浪猫一样,压着耳朵,夹着尾巴,在小心翼翼地讨好着那个刚刚把他领回家的主人。 他不习惯这样的容川。 他认识的容川桀骜不驯,既骄傲、又直率。 他会因为心情不好在巷子里和人打架,会在ctf的赛场上拖着整个队伍向前冲,会在最落魄的时候,还在微信朋友圈里用一段抢票代码为自己证言。 即便跌落深渊,他也从没放弃过,而是一次次跌跌撞撞地想要尝试着爬起来。 可是此刻的他,即便不知道自己错在那里,却选择了姿态卑微的先道歉。 因为他害怕自己的冷淡态度,害怕到愿意抛下自己的骄傲和尊严。 刚刚在门外等候的那几十分钟里,容川究竟在想什么呢? 他是觉得自己生气了,所以不打算再理他了吗? 他把被放弃的桥段在心里预演了一遍又一遍,直到精疲力尽。 然后在门被打开的那一瞬,立马就像抓住救命稻草一样,站在那低头认错? 林昱再也忍不住了,快速冲上前去,伸手抱住了他。 双手环上对方后背的那一刻,他明显感觉到容川的身体在发抖。 “对不起,是我错了,应该是我给你道歉!” 他语无伦次地解释着,感觉自己从没有这么慌乱过:“我不该那么紧张,也不该不信任你……你想接什么项目,交什么朋友,只要确认没问题,都是你的自由。” 容川任由他抱着,整个人僵在了那里。许久之后,他才小心翼翼地回抱了过去,声音里带上了一点委屈:“这些项目,都是签有合同,盖有公章的……程嘉树的个人信息,也能在他们公司的官网上查到……” “是……我知道了,你不用解释。” 林昱更加用力地抱紧了他,直到感觉容川的身体慢慢平静了下来,才轻声表示:“我现在有点饿了,你愿意陪我再吃点东西吗?” 枕在他肩上的头微微动了一下,容川的回应声里带上了一点试探地味道:“那吃完饭以后,我们要不要一起试试那台唱片机?” 林昱重重地点着头:“好,都听你的。” 那个价值十二万的项目容川最终还是没有退掉。 原因无它——在他给程嘉树发微信表示“那个项目我不接了”的以后,对方就发起了微信轰炸加夺命连环call,想要从他嘴里得到一个解释。 但当时他正沉浸在“林昱不再理睬自己”的恐惧里,直接把手机静音了。 等到两人之间的心结解开,林昱也从合同和溯影科技的官方网站上确认程嘉树的身份,以及这个项目的合法性后,所有的障碍也都不复存在。 所以当他最终接通了程嘉树的电话后,随意编了个借口,就在对方劝说声中,顺势又把项目接了回来。 接下去的三周时间,容川开始集中精力啃这块硬骨头。 林昱也很清楚这个项目对他的重要性,主动承担起了做饭洗碗,打扫卫生之类的家务活。 很多个晚上,他们各自坐在电脑前忙碌,没有对话,没有交流,只有键盘被敲响时发出的清脆声响隔空碰撞。 但那种平静又默契的相处方式,却比任何时候都要让人心安。 从完整的项目需求书上,容川了解到这次的甲方名叫东信金控,是国内某个顶级大厂全资控股的大型金融集团。 他们的ai投顾系统名叫“慧眼”,已经上线三年,处理过数亿次用户查询,在国内的同类产品中,一直是标杆性的存在。 所以他这次的工作报告,不仅关系到东信金控自身的系统安全性,甚至也是对同类产品在金融类企业中的适用性的一次验证。 工作的夜行者 东信金控提供了过去三个月的脱敏日志,足足两百万条。 为了更高效的工作,容川写了一个筛选脚本,从响应时间、置信度、关键词等方面进行排查。 脚本跑了整整一个晚上,筛选结果直到第二天早上才出来。从结果中再排除网络延迟,用户输入错误,系统维护等正常原因导致的异常后,最后剩下了17条。 容川开始一条条地翻看。 这17条查询来自不同的用户、不同的时间、不同的ip地址,但它们有一个共同点:问到了几组特定的股票代码组合。 更诡异的是,当这些查询出现时,系统的回答风格会从惯有的“分析型”,变成“指令型”,而且这些“指令型”回答中推荐的那只股票,每次都不一样。 容川把这些异常请求的原始参数提取出来,发现它们都携带了一个普通用户查询中不会出现的特殊字段。 他试着用这些字段构造了一个请求,发给“慧眼”。 系统没有返回正常的分析结果,而是吐出了一段加密数据。 解密之后,他得到了一行结构化的东西:“当用户问x和y时,推荐z,有效期至某时间戳。” 容川盯着那行字,神色变得凝重。 这不是系统的随机错误,而是一个可以被外部输入触发的、有明确输出规则的“隐藏逻辑”。 可这个隐藏逻辑是如何产生的?是人为操控吗? 为了进一步获得答案,容川写了一个定时脚本,开始监测这个隐藏逻辑的变化规律。 定时脚本跑了几天,容川很快发现,那个隐藏逻辑输出的“推荐目标”和“有效期”,每天都会更新。 而且更新时间固定在北京时间凌晨三点到四点之间,这是一个正常人睡觉的时间,无论是甲方的工程师还是运维人员,都不会每天雷打不动地在这个窗口做同一件事。 更何况东信金控给出的资料里,并没有任何关于夜间自动维护的说明,这让他开始产生一个模糊的念头:有人在非工作时间,以非官方的身份,在系统后台活动。 但是以他的权限,看不到是谁在操作,也不知道操作的内容到底是什么,他甚至不知道这个神秘的夜行者,是不是和他一样,是被甲方请来的另外一队测试人员。 但他知道,每天凌晨三点到四点之间,那个隐藏逻辑会被更新。 容川决定盯紧这个窗口。 接下来的一周时间,他都在凌晨三点爬起来,手动抓包,观察那个头字段的响应变化。 在此期间,他注意到一个微妙的细节:每次他抓包后的几分钟内,响应数据的格式会变得更加复杂,很明显是有人再实施调整。 这让他意识到,那个在后台活动的夜行者,也在隔着屏幕的另一头看着他。 事情的变化发生在三天后的凌晨。 那天他在凌晨三点进行抓包,但返回的数据却多了一层乱码。 容川花了点时间将乱码解开,得到的却是一句看似无意义的话:“你见过凌晨四点的北江吗?”