“哦,他不会认为是我干的吧?”

卡什耶夫示意他们冷静,然后转向斯特里克兰德。“我不认为是你干的,约什。我觉得我们需要寻找证据。这里有视觉智能系统,我在这些房间安装了摄像头。没有人可以在我们不知情的情况下接近项目服务器。如果没有外人从物理上接近这些机器,那就是——”

“该死的项目服务器现在在聚会人群当中!实验室里现在差不多有四十个人!为什么每个人都看着我?是不是需要找个替罪羊背黑锅,所以就选我这个写代码最烂的程序员?所以就选我这个与代码最没关系的人?你们知不知道我被这件事弄得有多惨?你们知不知道我的生活被彻底毁了?”

整个团队看起来都很尴尬。

卡什耶夫拍了拍斯特里克兰德的膝盖。“对不起,约什。”他最后看了一眼斯特里克兰德,走了出去,科伊普勒跟在后面。

王宝荣犹豫了一下,指着斯特里克兰德的脸。“你也许可以考虑一下指控维贾伊,约什。我们都是目击者。”

斯特里克兰德耸了耸肩。很可能雷莉博士已经对普拉卡什提出违纪控告。再说了,自己告他有什么意义呢?现在他的内心和脸一样受伤。

王宝荣也走了出去,只留下他一个人。

斯特里克兰德转向办公室的椅子,窗外的景色其实不错。从二楼他所处的位置可以看到外面有棵树,一只乌鸦停在树枝上——注视着他。过了一会儿,乌鸦飞走了。

人类最常见的一种染色体病,“唐氏儿”通常有先天性中度智力障碍。

位于美国加利福尼亚州门罗帕克,是风险投资公司的聚集地。

王宝荣的昵称。

尼科莱的昵称。

约书亚的昵称。

各国知识产权法都规定,公众都知道的现有技术不可申请专利。

第四章

入侵探测

约书亚·斯特里克兰德躺在办公室椅子上,现在办公室里空无一人。他闭上眼睛,静静地听着“怒对机器”乐队的歌曲。现在很晚了,非常晚。这个地方到处都是塑料杯、葡萄酒和啤酒瓶子、披萨盒子。专利权申请失败之后,这里的人很快走光了。不过这已经是几个小时之前的事情。几个小时,又几个小时。斯特里克兰德扫了一眼手腕,然后意识到自己没有戴手表。实际上,他“从哲理上反对戴手表”,多装逼——最近他甚至都觉得自己恶心了。

他手里的香槟酒瓶几乎半空了。不,不太对。他看了下金属箔标签。

发泡酒。

法国人对自己的知识产权也很顽固。他把瓶口对着自己的嘴,干掉最后一点底子,然后甩到远处的墙壁上。瓶子反弹一下,进了垃圾筐。

喝半瓶酒还不至于醉。他在黑暗中摸起最近桌子上的酒瓶,又找到一瓶半空的酒。还是这种便宜酒水。但他以后再也不会喝酒了。搞定首轮融资然后上市,这样的梦想已经破灭了。

他想起了自己的助学贷款,还有其他债务。加起来几乎有十万美元。他现在还能毕业吗?这件事会不会影响他获取奖学金?当然,会有人认为他的团队在副本出现在网上之前就写出了“说书人”的代码,难道不是吗?

他开始怀疑他们是不是真的在写软件——说起“他们”,其实指的就是普拉卡什。普拉卡什和卡什耶夫。还有可能还包括科伊普勒。

斯特里克兰德在高中的时候总是学校里最聪明的孩子,但去了斯坦福之后,他突然成了反应最迟钝的那个。他就像在巨浪中游泳——总是挣扎着不让自己淹死在知识的海洋里,不过其他人倒是很轻松的样子。至少他们看起来如此。

不,去他的。他知道有很多人勤奋苦读,就是为了能继续留在斯坦福。

别为你自己感到难过了,你不是个白痴。

真相是,斯特里克兰德在寻觅天才——那些明显能搞定目标的人。他能从普拉卡什身上看到这一点,是吧?还有卡什耶夫。其他人都无关紧要。斯特里克兰德觉得他们也是这么看他的。

但斯特里克兰德确实拥有一些他们所没有的特长,难道不是吗?他不一样,他开朗,有说服别人的能力,是人群中的发动机,可以让团队专心工作。

他停了一下。

他是个寄生虫,不是吗?如果他有自知之明的话就应该承认,他是“说书人”团队中最没价值的成员。如果他们从来就没有遇到他,软件还是会被开发出来——普拉卡什就持有这样的观点。斯特里克兰德花了很长时间研究团队的源代码,想要搞明白每个类有什么意思,还有每个函数和子程序。见鬼,他们的代码太优雅了。简练,没有冗余,浑然一体,如同机器的史诗。斯特里克兰德至今都在努力理解代码的微妙之处和内部关系。他没法想象这款软件是怎么开发出来的。

事实上,斯特里克兰德的无心之失可能葬送他们所有人年少成名的希望。不过,把代码放到自己部门的服务器上,这难道真是无心之失吗?

谁才能盗取Leland服务器集群上的项目文件?很显然,能内部访问的人。服务器的记录文件可以显示谁什么时候登录过。

除非他们能抹去痕迹。不过他立即意识到这些其实是虚拟服务器——云的一部分。而且就算不是这么回事,计算机科学系也充斥着黑客。这群家伙可以在鸡尾酒纸巾的背面设计出微芯片。如果他们不想让你找到证据,那你就根本找不到。

他到底在想什么?能访问服务器的内鬼?如果是有人从不小心落下的USB驱动器上偷走的呢?或者从笔记本电脑或者家庭无线网络?是谁说斯特里克兰德把事情搞砸了?如果是普拉卡什呢?这个混球总是喜欢委过于人。

斯特里克兰德用舌头舔了舔前面的牙齿,有一颗牙松了。嘴上已经消肿,但如果他没有喝醉的话,可能疼得够戗。

确实没有多大机会知晓代码是怎么泄露出去的。他不是计算机取证专家。也许普拉卡什和他阔绰的家庭可以雇一个,不过他们雇一名律师起诉斯特里克兰德的可能性更大。

一个想法突然击中了他。偷他们代码的人会不会还在继续偷呢?

斯特里克兰德直直坐了起来。

他能在源代码中加入点什么东西,可以在他们偷代码的时候让代码“给家里打个电话”。微笑滑过他的嘴唇,不过疼痛刺伤了他,他立即停止微笑。他扫开桌上的葡萄酒瓶,摇摇晃晃地走向最近的工作站。哥们儿,他实在醉得厉害。

斯特里克兰德登录上斯坦福大学网,然后导航至自己在Leland服务器集群中的共享。他在那里存储了好几个版本的“说书人”C++源代码。他精读过好几个cpp文件。如何着手呢?普拉卡什的代码结构太严整细密了,而斯特里克兰德已酩酊大醉。得把事情弄简单一点,混蛋。这是最好的策略。不过,现在斯特里克兰德能做的,就是加入一些代码,与“说书人”同时运行。

他现在可写不出什么后门程序。他感觉自己好像是在酒精海洋里拼命往上浮。他摇头晃脑地盯着屏幕。集中注意力,你这个蠢蛋。调动所剩无几的清醒脑细胞已经耗去他所有的专注力。

软件在启动的时候连接远端的主机并非罕见。检查更新可是大事。没什么值得警觉的。他可以写一个小小的远程过程调用,通过HTTP传回他想要知道的一切客户端信息,而不用管软件在哪里执行。无论是谁偷到代码,首先是搞到他的IP地址。也许还有攻击主机的操作系统和语言等细节。也许还有网络共享列表以及——

别,别整那么多。一个小小的XML远程过程调用客户端发送数据就可以了。他手边就有个C++库,他可以加到“说书人”的底层代码中。通过这种方法,他可以毫不费力地把自己需要的信息藏在程序里。然后他在自己的网络服务器上建立了一个远程过程调用服务器,这样就可以拾取任何客户端发送过来的XML消息。这点HTTP流量在窃贼的防火墙看来就像是标准的网络冲浪。

但是,他们难道不会注意到斯特里克兰德加了些代码么?也许不会。如果有人偷了“说书人”软件,就意味着他们相信这些源代码,对吧?而且这些“给家打电话”的代码只需要成功执行一次。只需要一次,就能知道它被偷到哪里去了。

斯特里克兰德启动Emacs文本编辑器,想了想该首先打开哪个C++目标文件。他应该在哪儿对代码做出变更呢?他决定把代码塞到“说书人”的一个辅助服务里——图像跟踪库。他加入了一个新的子线程,可以生成XML,收集客户机的IP地址、当地时间以及本机的操作系统。然后把消息发送到他将要建立的远程过程调用服务器上。最后,他把“说书人”项目版本号往上加了一点——还加了一条注释,说修正了一个可能的内存泄露。他使用了普拉卡什的名字缩写,以防引发任何怀疑。毕竟,他极少对项目代码做任何变更。事实上,他不得不承认,他从未对代码本身做出任何有意义的贡献。不过,这种情况到此为止。

斯特里克兰德花了大半个小时编写远程过程调用服务器,使其可以探测并处理任何他加入的代码“发回家里”的Ping信息。花了这么长时间,主要是因为他醉得厉害,敲键盘都很困难。他把这个服务放到库比蒂诺某家创业公司的服务器上,他曾在那家公司做过暑期实习生。这一招似乎能奏效,任何发送过来的信息都会被写入一个文本文件中。

现在要把他修改过的“说书人”源代码粘到网上。就像以前一样,斯特里克兰德手动复制了这个版本,按照以前的文件夹命名传统粘到新的目录中。就像以往一样,他是在正式版本系统之外操作的,所以新目录树对于任何监视共享的软件来说都不会有什么不对劲的地方。斯特里克兰德以前也干过这种事,主要是不想让普拉卡什还有其他人知道他对代码花了多长时间进行分析,才能跟得上他们的进度。

嗯,做完了。这个陷阱代码已经粘贴完成。斯特里克兰德盯着屏幕,然后单击一下,关闭了窗口。骰子已经掷了出去,他正焦急地盯着桌面。不管现在晚不晚,他都决定不回到自己的公寓——回去也只能看着墙上的廉价滑稽画。再过几年,这幅画看上去就不那么滑稽了。相反,他决定建立一个服务,对任何偷偷“给家打电话”的代码所发出的信息给出提示。重新写软件的感觉真好,于是他决定用C#写探测服务。普拉卡什总是抱怨.NET,说真正的程序员根本不用.NET。

斯特里克兰德在他的研究域中建立了一个应用,该应用会把Ping入的IP地址放到世界地图上。这样也可以让软件漂亮一点。

一切都已搞定,他点了点头。他对自己感觉很好。和超级天才们混在一起的时间太长,很容易忘记玩点小花招可以弥补智商上的差距。也许他不是下一个谢尔盖·布林或者拉里·佩奇,但他会没事的,他会从这次打击中恢复过来。

他盯着屏幕,过了一会儿,脑袋一歪,睡着了。

口袋里的iPhone在响,斯特里克兰德猛地一醒——他为“往家打电话”的代码所发送的信息设置了专门的音效。他摇了摇头,想让自己清醒一点,铃声又响了一遍。他看了看实验室,发现依然没人。现在几点了?

又是铃声。他从口袋中抽出手机,毫无疑问,他的网络服务给他发送了一封电子邮件。这时候离他把修改过的“说书人”代码粘贴到Leland共享点上还不到三十分钟。

三十分钟。

有人——或者软件机器人——在监视他对共享点的变更。这意味着他已经被攻破了。但这是谁干的?斯特里克兰德打开桌面,登录进去,然后查看地图映射网页。在那个数字地球上,他看到了IP地址,运行修改过的代码的主机地址解析到了:俄罗斯莫斯科。

他看着屏幕,几分钟一动不动。俄罗斯人在窃取“说书人”的源代码。他们在斯坦福大学网站上开了个后门。斯特里克兰德在沉思下一步该怎么做的时候,铃声又响了。他瞄了一眼手机。另一条信息。他点了一下网页上的刷新按钮,出现了另一个地址,而且也解析到了地图上。这个地址在美国首都华盛顿特区。

他妈的,怎么回事?

几秒钟后铃声再次响起。接着又一次响起。斯特里克兰德又点了一下地图的更新按钮,现在地图上的点分布于俄罗斯圣彼得堡和美国科罗拉多州斯普林斯市。

又是一个铃声警报。刷新。现在这个点位于印度的海德拉巴。几分钟之后,斯特里克兰德发现他们的视觉智能软件散布到了全世界。天还没有亮,地图上已经有了二十个点,分布于美国、欧洲、俄罗斯和日本。这是一个隐秘的网络刺探渠道地图。

这些人到底是谁?

斯特里克兰德对华盛顿特区那个点的IP地址做了一下域名查询,看到那个域由一家名为“镜像策略”的公司注册。再做一下快速查询,发现这是家公共关系公司。不过,更大的可能是他们在不知情的情况下被用作代理——最有可能的就是他们也被那些偷取源代码的人攻破了。也许他们的网络被用作存放从全球盗取来的文件。窃贼甚至可能远程重新编译了源代码,以增强安全性。斯特里克兰德无从知晓谁在幕后操纵——俄罗斯人还是美国人?谁说得准呢?甚至有谁能说这不是某国政府在背后操纵的呢?也可能是网络犯罪团伙,可能是像他这样的研究生在为别国政府充当劫掠者;或者干脆就是无聊恶作剧的黑客。

天啊。斯特里克兰德的大脑飞速运转。这意味着什么?好吧,至少可以证明一件事:他们的工作成果已经被窃取,而且现在依然在被窃取。这意味着他们可以避免学校的纪律措施制裁。等等——他们甚至可以就这一点起诉大学。斯坦福大学会不会承诺将努力找出谁对他们干了这些勾当?找到该为此负责的人、公司或者是政府?事实上,国防部高级研究计划署也需要知道。国防部也需要知道——这涉及国家安全。

斯特里克兰德需要做的第一件事是给团队打电话——他的团队。不管普拉卡什是否对他发火,他们都需要集思广议,找出行动路线。斯特里克兰德把代码贴上去还不到三十分钟,代码就出现在半个地球之外。有人在系统性地把他们作为目标,这显然是间谍行为。斯特里克兰德是最弱一环,但很可能就算不是他犯下这个错误,对方也会一直搜索,直到找到办法攻进来。

从乐观的方面看,斯特里克兰德不应对此完全负责:这不是偶然的疏漏——这是什么人的任务。有意为之,目标明确,间谍行为。有人带着极大的兴趣关注他们的研究,这意味着这里很有价值。

斯特里克兰德拿起手机,看了下时间——凌晨四点半。这事不能等,所以他给团队里最冷静的人——杰哈德·科伊普勒打了电话。也许科伊普勒会说服团队的其他人再开个会……

令人发指的是,斯特里克兰德花了二十四个小时才把整个团队召集起来。只有普拉卡什一个人顽固得很,科伊普勒和卡什耶夫合力游说,最后甚至再加上雷莉教授出面,才说服他现身。王宝荣和查特吉倒不是问题。就像斯特里克兰德一样,他们实际上并不是真正重要的团队成员。他们想听听谁能站出来挽救危局——还有他们的学术生涯。

斯特里克兰德只是告诉他们自己发现代码被盗了——还有是谁偷的。实际上,这个发现让他有些偏执,以至于他拒绝在他们自己的办公室开会。相反,他坚持在纪念教堂北边的一个院子里的公共广场开会。广场上铺着地砖,中心矗立着一尊莲花座。他们站在黎明前的晨曦中,偶尔有大学教工从旁边经过,去教堂或者其他什么地方。他们在这里可以看到从很远的地方过来的人。

卡什耶夫没有掩饰自己的表情。“你的脸怎么了,约什?”

他一整天都没想自己的脸被打肿的事。“没事,我没事。”

雷莉教授用胳膊肘碰了下普拉卡什。“我觉得你应该对约什说点什么。”

普拉卡什不耐烦地叹了口气,说话的时候也没看着斯特里克兰德的眼睛。“我打了你,我道歉,约什。我做错了,我很后悔。”

斯特里克兰德点了点头。“这听起来……像练习过。但我接受你的道歉。”

雷莉教授抬起眉头。“我们在这里开会,为什么,约什?因为你觉得我们的办公室被窃听了?”

斯特里克兰德点了点头,“大学网络已经被攻破——可能是外国政府干的。我有证据。”

普拉卡什瞪着眼睛。“哦,现在是外国人干的好事了。”

雷莉教授插话道:“维贾伊,让我们听他说完……”

“为什么我们要相信他的屁话?”

科伊普勒恼火地看着维贾伊。“得了吧,维贾伊。”

“约什可能编织了一个间谍故事,这样他就可以脱身,好像自己是个英雄。”

斯特里克兰德觉得自己承受了天大的冤枉。“有人对我们的工作非常感兴趣,维贾伊。难道这很难以置信吗?我们都知道这个东西能值多少钱。不过有人也发现了这个东西的价值,然后想方设法得到了我们的软件。”

“而且他们发现了你。”

“也许这是真的,不过这并不意味着团队里的其他人没有被攻破。这儿的其他人难道没有把‘说书人’的源代码存在什么地方吗?”

团队成员面面相觑,突然安静下来。

“我无须多说,一切有利的证据将支持我的陈词和观点。雷莉博士,我们需要大学提供支持——悄悄地干,这样偷取代码的人就不知道我们已经明白自己被攻破了。可现在这是一个关乎国家安全的问题。”

她点了点头。“你有什么想法?”

“我说,我们去找出那些人究竟是谁。大家齐心合力,揭露他们的身份,然后看看国防部想要如何。忘记律师吧,我觉得律师可帮不到我们。”

其他人交换了一下眼神。

卡什耶夫摇了摇头。“晚了,约什。代码已经泄露出去了。”

“有可能,但这不意味着这件事已经完了。这不是普通的网络破解。我们的工作可以应用在防务上,而且这关乎国家安全——这意味着军方可能会帮我们。”

其他人低声交谈。

雷教授看上去有些怀疑。

“我认为你不知道你在干什么,约什。”

“我们已经在这个工作上投入太多,不可能就这么撒手不管。如果有人偷走了我们的未来,那我们就应该回击。”他看着其他人,“你们和我一起干,还是就这样认栽?我,至少我这个人,不会善罢甘休。”

他们互相看着,有些犹豫。