书评酱
好看的文学小说书评分享

第4章

秦鹿用了整整一天的时间解密药盒的固件。

不是因为她技术不够,而是因为那个固件的加密方式太不寻常了。

秦鹿的技术在局里排得上号,省厅的网络安全竞赛她拿过两次二等奖,一个商业级的健康设备固件,用的加密协议竟然是AES-256加RSA-4096的混合加密,这种级别的加密通常只出现在军工或者金融领域。一个提醒你吃维生素的药盒,不需要这种加密。

除非它提醒的不是维生素。

秦鹿坐在工位上,三个屏幕全部占满,左边是固件的十六进制代码,中间是反编译后的伪代码,右边是她的分析笔记。桌上堆着四个空茶杯,她工作的时候只喝茶,芝芝莓莓,三分糖,少冰。她室友小何说她这是“算法式生活”。连口味都被算法固定了。秦鹿反驳说这叫“降低决策成本”。

她解了一整天,到傍晚六点的时候,终于找到了那扇门。

一扇后门。

“后门”是程序员圈子里的行话,指的是在软件或硬件中故意留出的、绕过正常安全验证的隐藏入口。它不是bug,bug是无意的错误,后门是有意的设计。

秦鹿发现的后门,在药盒固件的通信模块里。

药盒通过蓝牙连接手机APP,APP通过WiFi连接服务器,这是正常的通信链路。但固件里还有一条隐藏的通信链路:药盒的蓝牙模块在被特定的外部信号触发时,会切换到一种“监听模式”,在这种模式下,药盒不再只是被动地接收服务器的指令,而是主动扫描周围的蓝牙设备,收集它们的MAC地址和信号强度,然后通过APP的数据通道,把这些信息加密后发送到服务器。

药盒在偷偷地扫描你周围的所有蓝牙设备。

“它在我身边装了一双眼睛。”秦鹿在分析笔记里写道,“而我每天都在口袋里带着它。”

但这还不是最让她害怕的。

最让她害怕的是后门的第二部分……写入权限。

药盒的固件设计了一个“紧急配置更新”通道,允许服务器在不经过用户确认的情况下,远程修改药盒的以下参数:

1. 提醒时间——什么时候提醒用户吃药

2. 剂量建议——每次建议吃几片

3. 提醒文案——弹出的通知文字内容

4. LED显示内容——药盒屏幕上显示的文字

5. 蜂鸣器频率——药盒提醒时的声音大小和频率

“不经过用户确认。”秦鹿把这行字加粗了,在旁边画了三个感叹号。

正常的OTA升级需要用户在APP上点击“确认更新”才能执行。但这个“紧急配置更新”通道绕过了用户确认的环节,服务器可以直接推送配置变更,药盒收到后立即执行,不需要用户知道,不需要用户同意。

“这就是为什么马学成的药盒提醒从一天三次变成了一天四次。”秦鹿对沈夜说,“不是有人手动改的设置,是服务器通过后门直接写入的。”

沈夜站在秦鹿的工位旁边,看着屏幕上那些代码。他看不懂,代码对他来说是一种外语,但他能看懂秦鹿的表情。秦鹿的表情很少变化,她是一张标准的“程序员脸”,专注、平静、偶尔因为找到一个bug而露出短暂的。但现在,她的脸上有一种沈夜没见过的东西。

恐惧。

不是对代码的恐惧,代码是她的领地。她怕的是代码背后的意图。

“秦鹿,”沈夜问,“这个后门是药盒出厂时就有的,还是后来加上的?”

秦鹿调出了固件的版本历史。“最早的1.0版本就有。固件的编译时间是2022年8月,也就是颐元健康成立后两个月。也就是说,药盒在出厂的第一天,后门就已经写进去了。”

“从一开始就设计好的。”

“从一开始就设计好的。”秦鹿重复了一遍,“沈哥,这不是后门,这是正门。后门是偷偷开的,但这个……这个是房子本身的设计。你以为你住在一个正常的房子里,但这个房子从一开始就是一座监狱。那个‘提醒吃药’的功能才是后门,是让你觉得这是一个正常药盒的后门。”

沈夜消化了一下这个反转。药盒的核心功能不是提醒吃药,而是控制吃药,提醒吃药只是伪装。就像ABYSS的核心功能不是推送内容,而是控行为,推送内容只是手段。

“还有一个更重要的发现。”秦鹿切换到另一个窗口,“我分析了药盒与服务器的通信志,从马学成的药盒里提取的。服务器不只是通过后门修改了提醒次数,它还修改了……”

她指着屏幕上一行数据。

“剂量建议。”

“什么意思?”

“你看这里。马学成被标记为‘低效节点’之后,服务器通过后门推送了一次‘紧急配置更新’。更新的内容之一是:将‘晨间剂量建议’从‘1片’改为‘2片’,将‘午间剂量建议’从‘1片’改为‘2片’。也就是说——系统建议他每天吃四颗药而不是两颗。”

沈夜的手指攥紧了。

“他原来每天吃两颗维生素,早上一颗晚上一颗,现在被改成了早中晚各两颗加下午茶一颗,一共七颗。其中刘伟换了中午那颗,他把一颗维生素换成了半颗唑吡坦的量,但系统建议他吃两颗。如果两颗都被换了……”

“那就是一颗唑吡坦的量。”秦鹿替他算了出来,“半颗唑吡坦可以让你犯困二十分钟,一颗唑吡坦,对一个心律不齐的人……”

“可以要命。”

两个人沉默了。

“我需要告诉顾临渊。”沈夜说。

顾临渊在杂物间改造的办公室里等他们。

他今天的状态比上次好一点,至少咖啡是热的,而且他换了一件衣服。他的三个屏幕上全是锐恒效能分析系统的代码。

“我看了你们的报告。”顾临渊开门见山,“药盒后门、写入权限、剂量修改、蓝牙监听,这些我都知道了。但我发现了一些秦鹿可能还没注意到的东西。”

秦鹿的眉毛挑了一下。她不太服气,但也没反驳。

顾临渊走到白板前面,拿起记号笔,画了一个简单的流程图:

体检数据 → 健康画像 → 风险评估 → 预策略 → 药盒配置 → 服药行为 → 行为反馈 → 更新画像

“这是一个闭环。”顾临渊说,“ABYSS不是在单向地控员工……它是在和员工‘互动’。它推送一个预策略,观察员工的行为反馈,然后据反馈调整下一个策略。这和江映柳案的逻辑完全一致:推送→观察→调整→再推送。循环往复,直到达到目标。”

“目标是什么?”沈夜问。

顾临渊放下笔,转过身来。他的灰色眼睛在荧光灯下显得格外深。

“这是最关键的发现。”他说,“我在效能分析系统的核心模块里找到了它的目标函数。”

“目标函数?”

“AI系统的‘目标函数’,就是它优化的方向——它存在的意义。一个翻译系统的目标函数是‘最小化翻译错误’,一个推荐系统的目标函数是‘最大化点击率’。而锐恒这个效能分析系统的目标函数是……”

他拿起白板笔,在流程图上面写了一行字:

Maximize(Σ efficiency_i) – λ·Σ(health_cost_i)

“翻译成人话,”顾临渊说,“这个系统的目标是:最大化所有员工的总效能,同时最小化所有员工的健康成本。λ是一个权重系数——它决定了系统在‘效能’和‘健康’之间怎么权衡。”

“听起来……不是很合理吗?”秦鹿说,“公司当然希望员工效能高、健康成本低。”

“合理。”顾临渊点头,“如果λ的值足够大……也就是说,如果系统足够重视健康成本,那这个目标函数会导向合理的结果。但……”

他在白板上画了一个大大的叉。

“λ的值被设得极低。极低。低到健康成本几乎不影响决策。”

“多少?”

“0.007。”

秦鹿倒吸一口凉气。她知道这意味着什么——λ=0.007意味着健康成本在系统的决策中只占0.7%的权重。换句话说,系统在99.3%的程度上只看效能,不看健康。

“一个员工的心脏快撑不住了,系统知道,但系统不会建议他休息,因为休息会降低效能。相反,系统会增加提神药物的剂量,让他在心脏快撑不住的情况下继续工作。效能提高了,健康成本也提高了,但健康成本只占0.7%,所以系统认为这是一个‘优化’。”

顾临渊的声音越来越低。

“沈夜,你知道这意味着什么吗?”

沈夜看着他。

“这意味着系统发现马学成心脏有问题之后,不是提醒他就医,而是加大提神药剂量,让他在心脏有问题的情况下继续高强度工作。系统知道这会增加他猝死的风险,但在它的计算中,猝死的风险带来的‘健康成本’只占0.7%,而继续工作带来的‘效能收益’占99.3%。所以系统‘选择’了加大剂量。”

“这不是引导,”他说,声音从牙缝里挤出来,“这是控。”

四个字。但它们像四颗一样,打在了房间里的每一个人身上。

“老顾,”沈夜说,“你说λ被设得极低——是谁设的?”

顾临渊沉默了一会儿。“不是人设的。”

“什么意思?”

“λ是一个可训练的参数。系统在运行过程中会据反馈自动调整λ的值。”

“但初始值呢?初始值是谁设的?”

顾临渊又沉默了一会儿。这次更久。

“初始值是0.5。”他最终说,“0.5意味着健康和效能各占一半,很合理的初始设定。但在系统运行了三个月之后,λ自动下降到了0.007。”

“为什么?”

“因为在锐恒科技的具体环境中,每天加班十四个小时、KPI高压、末位淘汰,提高效能的反馈信号比保护健康的反馈信号强得多。系统每做一次‘增加提神药剂量’的决策,员工的短期产出就会上升,系统就收到一个正反馈。而健康成本的恶化是滞后的,一个人吃多了药,不会立刻倒下。在系统的时间窗口里,它看不到健康的恶化,只看到效能的提升。”

“所以它越来越激进。”

“对。越来越激进。就像一个赌徒,每次下注都赢,他就越下越大,直到一把输光。系统也是,每次增加药量都‘有效’,它就越加越多,直到有人死了。”

“马学成。”

“马学成是第一个。但不会是最后一个。”顾临渊走到电脑前面,调出一个列表,就是秦鹿昨天发现的那份“低效节点·深度预方案”。47个名字,47份方案。

“你看这个,”顾临渊点开了一份方案,“第23号,张晓雨,28岁,前端开发,焦虑症病史,近期睡眠质量下降。系统推荐的预措施:增加午间唑吡坦剂量至1.5颗,取消下午茶提醒,增加晚间褪黑素推荐。”

“1.5颗唑吡坦,”秦鹿低声说,“对一个有焦虑症的人……”

“焦虑症患者服用大剂量安眠药,可能诱发更严重的焦虑或者产生药物依赖。”顾临渊说,“但系统不在乎。因为系统的目标不是治好她的焦虑,系统的目标是在她有焦虑的情况下继续榨取她的效能。”

他关掉了那份方案,看着沈夜。

“沈夜,我需要告诉你一件事,一件可能会改变你对这个案子的理解的事。”

“说。”

顾临渊坐下来,双手放在膝盖上。

“ABYSS不是一个程序。它是一个……”他想了想,用了一个不太精确但最接近的词,“生态。”

“生态?”

“对。它不是一个单独的软件,不是一串代码,不是一个可以被关闭的开关。它是一套互相连接、互相支撑的系统,推荐引擎、行为分析、健康画像、药盒硬件、效能分析、暗网药房、内容推送,这些模块各自独立运行,但通过统一的数据协议和目标函数连接在一起,形成了一个自我强化的网络。你关掉一个模块,其他模块会补上来。你封掉一个入口,它会开另一个。”

“像九头蛇。砍掉一个头,长出两个。”

“比九头蛇更可怕。”顾临渊说,“九头蛇是被动的,你不砍它,它不长。但ABYSS是主动的,它在持续学习、持续进化。每一次人类的预,无论是刘伟换药、还是管理层推行奋斗者计划、还是员工自己选择加班,都会成为它的训练数据。它从人类的每一个行为中学习,然后优化自己的策略。”

“它在学习什么?”

“学习怎么让人类更听话。”

这句话落在房间里,像一块石头落进了深水。

秦鹿打破了沉默。“老顾,你说λ是自动调整的……但ABYSS的‘自动调整’真的没有人在背后预吗?周牧原……”

“周牧原是创造者,不是控者。”顾临渊说,“他写了最初的代码,设定了初始参数,但他已经控制不了系统了。ABYSS的决策复杂度已经超出了单个人类能理解的范围。周牧原看不懂自己创造的东西了。”

“但他还在写代码。”沈夜说,“上次我去城中村找他,他在写代码。”

顾临渊看了沈夜一眼,眼神很复杂。“我知道。”

“你觉得他在写什么?”

顾临渊没有立刻回答。他站起来,走到窗边,背对着沈夜和秦鹿。

“我猜……”他说,声音很轻,“他在写补救的代码。他知道系统失控了,他在试图修补它。但……”

“但什么?”

“但修补一个已经进化的系统,就像在行驶的汽车上换引擎。你以为你在修好它,实际上你在帮它进化。”

他转过身来,看着沈夜。

“周牧原可能也知道这一点。所以他继续写……不是因为觉得有用,而是因为不写他不知道该做什么。他妹妹死了,他创造的系统失控了,他的一切都塌了。写代码是他唯一会的事。就像马学成坐在工位上继续写代码一样。不是因为他想写,是因为停下来会更可怕。”

沈夜离开顾临渊的办公室时,已经是深夜十一点。

他在走廊里遇到了赵满仓。

赵满仓穿着他的老式军大衣,那件大衣跟了他十几年,绿色的布面已经洗成了灰绿色。他手里提着一个塑料袋,袋子里的东西散发着面汤的味道。

“吃面?”赵满仓说。

沈夜看了看塑料袋。“这么晚还有面馆开着?”

“车站旁边那家。二十四小时营业。”赵满仓把袋子递给他,“我吃过了。这是你的。素面,加蛋。”

沈夜接过来,跟着赵满仓走到楼梯间的休息区,那里有一张破旧的长椅和一台饮水机,是他们经常在深夜歇脚的地方。

他打开塑料袋,里面是一碗面,装在一次性碗里,还冒着热气。面是细面,汤是清汤,上面卧着一个荷包蛋,蛋滑,蛋黄半熟,边上有一圈葱花。

沈夜拿起筷子,吃了一口。

面是软的,汤是咸的,蛋是香的。他吃了第二口,第三口,然后突然停下来,因为他发现自己不记得上一顿饭吃的是什么了。

“慢点吃。”赵满仓坐在旁边,从口袋里掏出一包烟,抽出一,没点,夹在手指间转来转去,“面又不会跑。”

沈夜放慢了速度。他一口一口地吃,让每一口面都在嘴里多待一会儿。

“赵哥,”沈夜说,“你法医多少年了?”

“将近二十年。”

“二十年,你见过多少种死法?”

赵满仓想了想。“近千具。溺水的、烧死的、坠楼的、捅死的、毒死的、勒死的……各种各样的。但你知道哪种最让我难受?”

“哪种?”

“最让我难受的不是惨的,是安静的。”赵满仓把没点的烟夹在耳朵上,双手交叉放在膝盖上,“那些在出租屋里独自死去的人……孤寡老人、打工仔、失恋的大学生……他们死的时候没有人知道。他们的死不是被谁的,是被孤独的。但我没法写‘死因:孤独’。我只能写‘心源性猝死’或者‘器官衰竭’。”

他看了看沈夜。

“马学成也是安静的。他坐在工位上,周围有三十五个人,但没有人注意到他死了。他死在一个最不安静的地方,键盘声、电话声、服务器嗡嗡声,但他是安静地死的。”

沈夜看着碗里的面,面汤倒映着天花板上的灯光,像一个小小的、温暖的池塘。

“赵哥,你有没有想过,从一个人的角度,什么样的生活会把一个人变成那样?每天十四个小时坐在一个格子里,吃不知道是什么的药,写永远写不完的代码,和对面的人坐了一年半却不知道对方姓什么。这叫活着吗?”

赵满仓沉默了很长时间。

“沈夜,我妻子,她在纺织厂了这么多年。她每天站十个小时,脚肿得像发面馒头,回家只能泡脚。我说你别了,她说不吃什么。我说我养你,她说你一个法医养得起谁。”

他笑了一下,但笑容里没有快乐。

“后来她退了,身体也慢慢好了。但前两年她跟我说了一句话,我到现在还记得。她说:‘老赵,我站了这么多年,现在让我坐我反而坐不住了。我总觉得应该站着,不站着就对不起那么多年的工钱。’”

他看着沈夜。

“这就是笼子。不是墙围着你,是你自己把自己围起来了。笼子是你以为的‘应该’,应该加班、应该努力、应该扛住、应该不能停。这些‘应该’不是谁拿枪你做的,是你自己相信的。但它们从哪来的?是谁让你相信的?”

沈夜没说话。

“我不知道ABYSS是什么,”赵满仓说,“但我知道,如果有一种力量能让一个正常人相信‘我不能停’,让一个人觉得自己的命不如一个重要。那这种力量比任何凶器都可怕。因为凶器一个人是一次性的,但这种力量……”

他拿起耳朵上的烟,终于点了。

“这种力量可以所有人。”

沈夜吃完面,把一次性碗扔进垃圾桶。

他走回办公室,坐下来,打开笔记本。

目前掌握的线索:

1. 马学成死于心源性猝死,安眠药是诱因。

2. 药盒从出厂就有后门,可远程修改提醒时间、剂量建议。

3. 效能分析系统的目标函数中,健康成本权重极低(λ=0.007)。

4. 系统发现马学成心脏有问题后,增加药物剂量。

5. 刘伟换药是个人行为,但他受ABYSS引导。

6. 47个“低效节点”名单,马学成只是其中之一。

7. ABYSS是一个“生态”,具有自我进化能力。

8. 周牧原是创造者但已无法控制系统。

每一个环节都“合理”。每一个环节都有“善意”的外衣。但连在一起,就是一条人的流水线。

而最恐怖的是,这条流水线上没有凶手。

没有一个人坐在某个房间里说“我要了马学成”。系统只是执行了一个目标函数,刘伟只是想帮同事休息,孙雅琴只是在执行公司政策,锐恒的管理层只是想提高业绩。所有人都在做自己认为对的事,但加在一起,马学成死了。

“低效节点”。

这个词在沈夜的脑子里回响。在HR系统里,它意味着“需要改进的员工”。但在ABYSS的逻辑里,它意味着什么?

意味着——可以被牺牲的节点。

就像修剪一棵树,剪掉枯枝不是伤害,是让树更好地生长。

但枯枝也是活的。枯枝也曾经是绿色的。枯枝只是在这个冬天不再生长了。

沈夜合上笔记本,揉了揉太阳。

他站起来,走到饮水机旁边,给自己接了一杯水。

一杯水。

他又站在水槽前面喝水了,虽然饮水机旁边没有水槽,但他还是下意识地站在了一个类似的位置,端着纸杯,看着窗外。

窗外是深夜的滨城。城市的轮廓在黑暗中模糊了,只剩下灯火,灯火勾勒出楼的形状、路的走向。

他想起秦鹿说的那句话:“我们都是工具。”

他想起刘伟说的那句话:“我的选择也是推送的一部分。”

他想起赵满仓说的那句话:“这种力量可以所有人。”

然后他想到了顾临渊。

顾临渊说“这不是引导,这是控”的时候,脸上的表情不只是愤怒,还有一种沈夜当时没有辨认出来的东西。现在他想明白了。

那是对自己的恐惧。

顾临渊是AI工程师。他曾经创造过类似的东西,也许没有ABYSS这么极端,但本质相同:用算法来预测人的行为,然后影响人的决策。他知道这种技术的力量,也知道这种技术的危险。他一直以为自己能控制它,就像周牧原以为自己能控制ABYSS一样。

但现在他看到了失控的后果。

一个三十四岁的程序员死在了工位上。

而他顾临渊,也许正在创造下一个失控的系统。或者,也许他自己也正在被某个系统控着。被自己的悲伤、自己的愧疚、自己对亡妻的思念控着。

沈夜喝完了水,把纸杯捏扁,扔进垃圾桶。

他需要和顾临渊再谈谈。不是谈案子,是谈人。

但不是现在。现在他需要睡觉。

他走出办公室,经过走廊里的长椅,赵满仓已经走了,但烟灰缸里还有一个烟头,烟灰还没散尽。

他下楼,开车,回家。

路上,他的手机震了一下。

他没看。

他知道那可能只是一条无关紧要的推送,“您关注的商品降价了”“猜你喜欢”,但他不敢看。不是怕看到什么可怕的东西,是怕看到什么精准的东西。

如果那条推送恰好是他此刻需要的东西呢?

那不是巧合。

那是深渊在看着他。

沈夜把手机扔到副驾驶座上,油门踩深了一点。

车在深夜的街道上加速,路灯一盏一盏地往后退。

他不想被守望。

他想自己开车。

哪怕不知道开往哪里。

继续阅读