电脑借出去的第六分钟,我就觉得不对劲了。
周浩拿着我的笔记本走进会议室的时候,脸上带着一种很奇怪的笑。
那种笑我形容不出来。不是客气,不是感激,倒像是……胜券在握。
我当时正在工位上改bug,余光扫到他那张脸,手指头突然顿在键盘上。
一个测试部的同事,借用开发人员的电脑本身就不太合常理。测试组配的机器配置不低,跑自动化脚本绰绰有余。他说自己的电脑在跑全量回归测试,临时需要改个用例,借我的用半小时。
我没多想,把编辑器关了,让他拿走了。
六分钟后,我开始后悔。
不是因为别的,是因为周浩进会议室之后,我的企业微信消息突然开始疯狂往外弹。
我手机上装了公司内网的监控面板,每个开发都有,用来实时看服务器日志的。消息提示音连成一片,我低头一看,脸色当时就变了。
有人用我的账号在访问核心代码仓库。
我猛地站起来,椅子往后滑出去撞在后面的工位上。旁边的老赵被我吓了一跳,摘了耳机看我:“咋了?”
我没理他,直接往会议室走。
我们公司叫辰安科技,做的是政务云平台,客户是各级政府部门。签的保密协议有多严格呢?入职的时候法务部专门培训了一下午,违约条款念得我头皮发麻。核心代码泄露的后果,不是赔钱那么简单,是刑事犯罪。
我走到会议室门口,透过磨砂玻璃能看见周浩坐在里面,我的笔记本屏幕亮着,他正在操作。
我推门进去。
他没说话。
会议室里安静了两秒钟。
我把笔记本从他面前拿过来,屏幕是亮的,桌面上开着终端。我敲了一下history,命令记录弹出来。
周浩的脸色终于变了。
那个脚本的名字叫“collect.sh”,存放在一个隐藏目录下。我快速扫了一眼脚本内容,心脏猛地往下沉。
全盘文件扫描。按关键字过滤。筛选出来的文件正在打包成tar.gz,目标路径是一个外网网盘的挂载目录。
这个过程已经执行了百分之七十。
我直接拔了网线。
周浩站了起来:“陈默,你别误会,这是总监让我做的安全演练。”
“安全演练不通知本人?”我把笔记本合上,夹在胳膊底下,“而且安全演练需要用我的账号操作?”
他没接上话。
我转身出了会议室。走回工位的时候腿都在发软,脑子里嗡嗡的。不是因为害怕周浩,而是我刚才看到的那个脚本,写得非常专业。隐藏目录的路径、外网网盘的挂载方式、关键字过滤的精准度,这不是一个测试工程师能写出来的东西。
这事背后有人。
我坐回工位,把笔记本重新打开。断网状态下,那个打包进程已经卡住了。我kill掉进程,开始检查系统日志。
八分钟之前,也就是周浩进会议室两分钟后,有人远程登录了我的电脑。登录方式是ssh,用了一个我不知道的账号。这个账号被创建的时间是——今天上午十点。
那时候我在开会,电脑就放在工位上,锁屏密码周浩知道。
我扭头看了一眼测试部的方向。周浩从会议室出来了,回到自己的工位,正低头看手机。他打字很快,应该是在跟谁发消息。
我回过头,开始重装系统。
不是修复,不是杀毒,是格式化整个硬盘重装。
我不是不信任杀毒软件,我是不知道那个脚本到底还做了什么。有没有键盘记录器?有没有后门?有没有修改系统底层的什么东西?我判断不了。我能做的,就是用最短的时间彻底消除风险。
格式化的进度条走得很慢。
老赵凑过来:“你干嘛呢?要下班了重装系统?”
他不明所以,但看我脸色不好,也没多问。老赵这个人最大的优点就是知道什么时候该闭嘴。
进度条走到百分之六十的时候,我手机又响了。
是运维组的李然发来的消息,只有一行字:“陈默,你是不是删了生产环境的路由表?”
我盯着这行字,脑子里空白了三秒钟。
生产环境的路由表。
删了。
我立刻回:“没有。”
李然截了张图过来。屏幕上清清楚楚显示,操作人账号是我,时间是一分钟前。操作内容是删除了核心交换机的三条路由策略,直接导致两个政府客户的服务中断。
一分钟前。
我的电脑正在格式化,网线拔了,连不上任何网络。
“我电脑断网在重装系统,”我给李然回,“不可能是我操作的。”
“但日志显示就是你。”
日志可以伪造。
上午十点有人在我的电脑上创建了一个ssh账号。那个账号可以远程登录。用那个账号登录之后,所有操作记录都会显示是我的电脑发起的。如果那个人还拿到了我的其他密码——比如运维平台的登录密码,他就可以用我的身份做任何事情。
包括删除生产环境的路由表。
我把格式化取消,先把网线插上。系统还没重装,但先得把这件事搞清楚。
上网第一件事,查运维平台的登录记录。
果然,上午十点零三分,我的账号从内网另一台机器登录了运维平台。那台机器的IP地址是——周浩的工位。
第二条记录更让我脊背发凉。
上午十点十五分,我的账号提交了一个审批流,申请开通核心生产环境的临时维护权限。审批人是我们技术总监,赵建平。
审批状态:已通过。
审批时间:上午十点十六分。
一分钟就批了。
我看着屏幕,手开始抖。不是因为害怕,是因为愤怒。
赵建平是技术总监,在公司干了四年,是所有开发人员的直属领导。平时笑呵呵的,说话慢条斯理,对谁都很客气。每次code review会指出问题,但都是商量的语气,“你看这样是不是更好一点?”
他批了这个权限。
他让周浩用我的账号,在我的电脑上创建后门,用我的身份删除路由表,制造服务中断。我是那个替罪羊。
我深呼吸三次,强迫自己冷静下来。现在最重要的是两件事:第一,恢复路由表,让服务恢复正常;第二,保留所有证据。
路由表的事我管不了,那是运维的权限。我只能给李然发消息:“你赶紧恢复路由,我这边有证据,不是我的操作。另外,先别声张,不要说是我提醒你的。”
李然回了个“好”,过了两分钟又发来一条:“恢复好了,中断了大概四分钟。客户那边还没投诉过来。”
四分钟。
他们只需要四分钟。
四分钟足够让一个政务系统被记录为“故障事故”。按照合同,重大故障是要赔偿的。更重要的是,责任认定会追踪到这个事故的操作人——也就是我的账号。
如果我没发现,没拔网线,没重装系统,现在的情况会是:我的电脑里留着一个打包好的源码压缩包,生产环境出现了由我账号触发的事故。两条证据链互相印证,我被开除都是轻的,
这不是整我。
这是要把我往死里整。
我做错了什么?
我在脑子里快速过了一遍最近几个月的事。和同事没有冲突,项目按时交付,代码质量在组里算好的。唯一可能的事,就是上个月的技术方案评审会上,我否了赵建平提的一个架构方案。
那个方案涉及引入一个第三方的中间件,我查过那个中间件的文档,发现它的数据加密模块是闭源的,而且开发商是一家刚成立半年的小公司。政务云平台对数据安全要求极高,引入一个不透明的闭源模块,风险太大了。
我在会上直接说了,语气可能不太好。我说:“这个方案在安全审核环节肯定过不了,赵总监你是做技术出身的,应该能看出来这个中间件的问题。”
会议室安静了三秒钟。
赵建平笑了笑,说:“陈默说得有道理,那我们再调研调研。”
之后再也没提过这事。我以为过去了。
现在看来没过去。
不但没过去,他还记恨到这种程度,精心设计了一个局来除掉我。
每整理一条,我的手就凉一分。
这意味着什么?
意味着这可能是公司高层的授意。
我坐在工位上,周围键盘声噼里啪啦,同事们都在正常工作。隔壁工位的小林正在和产品经理打电话,争论一个需求逻辑。老赵在写代码,手边的咖啡杯冒着热气。
一切都和平时一样。
只有我坐在那里,浑身冰凉。
格式化进度条重新启动,这次是彻底重装。Windows的安装界面上,蓝色背景里的圆圈转着,我看着那个圈,脑子飞速运转。
走还是留?
走,现在提离职,把这些证据提交给HR和法务。但问题是,却都是技术层面的。黑客用我的账号操作了所有事情。周浩会否认一切,那个脚本也会被解释为病毒的一部分。公司的技术团队都是赵建平的人,调查结果多半是对我不利。
留,装作什么都不知道,等他们出下一招。但下一招可能更狠,我防不住。
两种选择都不对。
我盯着安装进度条,突然想到了第三种可能。
为什么他们选择今天动手?
因为今天下午三点有一个重要的版本发布,涉及三个省的政务系统升级。如果这次发布因为“内部安全事故”延期,项目负责人就要担责。
项目负责人是赵建平。
但如果他能在发布前“发现”一起严重的安全事件,并且在极短的时间内“妥善处理”了责任人,那他就从背锅的变成了立功的。
他需要一个替罪羊来承担延期的责任,同时又能在上级面前表演一次“果断处置安全隐患”的戏码。
这个替罪羊就是我。既能报技术方案评审会上的一箭之仇,又能解决他自己的困境。
一石二鸟。
我看了一下时间,下午一点半。距离三点还有一个半小时。
我拨通了公司法务部张律师的电话。
“张律师,我是技术部陈默。我需要调阅我入职时签的保密协议和员工手册,方便现在下来一趟吗?”
“现在?有什么紧急情况吗?”
“有,涉及核心代码安全和生产环境的事故。”
电话那头停顿了一秒。
张律师下来的时候,我正在打印证据材料。整整十二页,时间线、操作记录、脚本源码,全部打印出来,按时间顺序整理好。
张律师四十多岁,戴眼镜,平时话不多,但公司法务部的人都知道,他最不好惹。他不怕事,也不怕人,就怕程序不合法。
我把材料递给他,花了十分钟把事情经过讲了一遍。
“陈默,这份材料如果属实,涉及的不只是公司内部的违纪问题。”
“我知道,是刑事犯罪。”
“你清楚就好。”他把材料翻了翻,“你现在打算怎么做?”
“我想先确保三点,”我说,“第一,事故责任从我的名下移除。第二,真正操作这件事的人承担应有的后果。第三,公司的核心代码没有泄露。”
“第三最重要。我看过那个脚本的打包记录,在我拔网线之前,已经有百分之七十的文件被打包了。但那个外网网盘的挂载目录,我查了,没有成功上传的记录。也就是说,文件没出去。但我不确定除了这个脚本之外,还有没有其他方式。”
张律师点点头:“行。你现在重新做系统是对的,保留原始硬盘的镜像也不要删。其他交给我。”
他拿着材料走了。
下午两点,系统装好了。我开始重新配置开发环境,装必要的工具和依赖。手在键盘上机械地操作着,脑子里却在想另一个问题。
周浩为什么要替赵建平干这件事?
测试组和开发组平级,他没有理由冒着犯罪的风险帮一个技术总监整人。除非他自己也拿到了足够的好处,或者有把柄在赵建平手里。
我想起上个月周浩请了三天假,说是家里有事。但那三天正好是第三方安全审计公司来驻场审计的时间。那次审计的结果一直没有公布,赵建平在周例会上说“审计发现了几个小问题,已经整改了”。
小问题。
如果审计发现的是小问题,为什么结果不公布?
如果审计发现的是大问题,那和测试组有什么关系?
测试组的职责是保证软件质量,如果有质量问题没测出来,测试组要担责。但能让赵建平亲自出面压下来的,一定不是普通的bug。
我打开企业微信,搜了一下那家审计公司的名字。搜索结果里有一条,是周浩发的朋友圈,时间是审计开始前一周。
文案是:“新挑战,加油。”
配图是一张工牌,上面印着那家审计公司的logo。
周浩在那家公司工作过。
我盯着那张图,一切都串起来了。
审计公司来驻场的时候,发现了一个重大安全漏洞。这个漏洞是测试组漏测导致的,按公司制度,测试组负责人要承担主要责任。赵建平作为技术总监,也有管理责任。
但赵建平没有向上汇报这个漏洞。他压了下来,条件就是周浩要替他做一件事。
这件事就是今天发生的这一切。
漏洞是什么?我猜,大概率就是周浩今天想证明的——开发人员的电脑可以轻易被物理接触,账号可以被盗用,核心代码可以外传。
他要证明安全体系形同虚设,从而反过来解释为什么那个漏洞“即使发现了也无法避免”。这样一来,审计发现的漏洞就不是某一个人的失职,而是整个安全架构的问题。
这种逻辑站不住脚,但在内部调查的时候,足够搅浑水。
赵建平要的就是水浑。
水浑了,他这个技术总监才能继续坐稳。
我看了一眼时间,两点四十五分。距离三点还有十五分钟。
老赵突然拍了拍我的肩膀:“陈默,赵总监让你去一趟他办公室。”
来了。
我站起来,整了整衣服。走廊走到尽头,右转,赵建平的办公室在技术部最深的位置。
门开着,他坐在办公桌后面,面前的屏幕亮着。看见我进来,他笑了,还是那种温和的、客气的笑。
“陈默,来来来,坐。”
我坐下。
“下午三点的发布准备得怎么样了?”
“一切都按计划进行。”我说。
“那就好。”他靠在椅背上,手指在桌子上轻轻敲着,“对了,刚才运维那边说生产环境的路由出过问题,是什么情况?”
我看着他的眼睛。
他真的在笑。一边笑一边敲桌子,节奏轻快,就像在聊今天食堂的菜好不好吃。
“我不清楚,”我说,“我下午在重装系统,电脑中毒了。”
“中毒?”他挑了挑眉毛,脸上的关切看起来无比真诚,“严重吗?”
“不严重,已经处理好了。”
“谢谢赵总监,我没事。”
“行,那你去忙吧。”
我站起来,走到门口的时候,他突然叫住我。
我回头。
他的笑容还挂在脸上,但眼睛里什么表情都没有。
“有些事,想清楚了再做。”
我没接话,转身出门。
走出办公室的那一瞬间,我后背全是汗。
他想试探我知不知道,我想试探他会不会露馅。两个人温和地聊了三分钟,每一句都是废话,每一句都在互探底线。
他已经知道我发现了一些事情,但他不确定我发现了多少。他让我“想清楚了再做”,是在警告我不要乱来。
他不警告还好。
警告了,反而让我确定了一件事:他慌了。
如果我什么都没发现,他不需要警告我,直接让HR拿着事故报告来辞退我就行了。之所以要警告,是因为他的计划被打乱了。原本天衣无缝的局,被我在第六分钟就打破了。
拔网线那一下,毁了他的全部计划。
他没拿到想要的结果,反而多了一个知情人。
现在他不是猎人了,他是被围猎的困兽。
走回工位的路上,我做出了决定。
不留了。
但我走之前,要把他送走。
三点整,版本发布正常进行。我坐在工位上,像往常一样盯着部署流水线。进度条一格一格往前走,绿色对勾一个一个弹出来。
张律师回:“材料已提交。”
我不知道他提交到哪里,但我信任他。法务部的人最清楚什么事该找什么部门。
三点四十分,HR的邮件来了。
标题是“关于今日下午生产环境异常的调查通知”,收件人是我,抄送了赵建平、HR总监和CEO。
我打开邮件,内容很简短:下午两点左右生产环境路由表被异常删除,经运维组紧急处理后恢复。经初步排查,该操作由技术部员工陈默的账号发起。现启动内部调查程序,请陈默在三日内提交情况说明。
开始了。
他们还是要走流程。
果然我说的没错,日志显示是我的账号,他们就要从我查起。至于我提交的反证材料,至少在这个阶段,知道的人不会公开。
我回了邮件:“情况说明已提交公司法务部,调查过程中我会全力配合。”
抄送了张律师和法务总监。
天花板上有块灯管一直在闪,坏了大半年了,行政报修了三次,一直没人来修。嗡嗡嗡地闪,看久了眼睛发酸。
老赵递过来一瓶酸奶:“今天你怎么了?魂不守舍的。”
“你这不像有点累,你这像遇到了事。”他压低声音,“周浩那小子下午一直在看你,你俩咋了?”
他没再问,拍了拍我的肩膀:“有事说一声。”
下班时间到了,同事们陆续收拾东西离开。我坐着没动,在等一个结果。
六点十五分,我手机响了。
“经公司调查核实,技术部总监赵建平因严重违反公司信息安全管理制度,利用职权越权审批、放任他人违规操作核心系统、试图伪造安全事件并嫁祸下属,事实清楚、证据确凿。经公司管理层研究决定,即日起解除与赵建平的劳动合同关系,并保留追究其法律责任的权利。”
我的手指停在屏幕上。
不到两百字的通报,字字千钧。
群里瞬间炸了。消息提示音响成一片,全部是惊讶的表情和问号。
“什么情况?发生什么事了?”
“嫁祸下属是什么意思?”
我没有回复任何人的消息。
我退出企业微信,把手机关了。
背上包,走出公司大门的时候,天已经黑了。
外面下着小雨,路上的车灯拖出一道道红色的光。
我站在门口躲雨,旁边有人也出来了,是张律师。
他撑着伞,看见我,点了点头。
“去哪儿?我送你。”
我们并排走在雨里。张律师的伞很大,两个人勉强遮住。
“CEO拍了板,这个决定做得很快。”他说,“你那份材料帮了大忙,时间线、证据链、技术分析,清楚得不能再清楚。”
“还有别的事吗?”我问。
“周浩也辞退了,不过他自己提的。审计那边查出他在上一家公司有三起违规记录,这次全暴露出来了。”
我点点头。
“解除劳动合同只是第一步。泄露商业机密、恶意破坏生产系统,这两条查实了就是刑事责任。公司法务已经把材料转给公安机关了。”
我站住了。
雨打在伞面上,噼里啪啦地响。
站在路口,身边是晚高峰的车流,张律师的雨伞被风吹得左右摇晃。我忽然觉得一切都不真实。
两个小时。
从我发现电脑被人动过手脚,到技术总监被开除,只用了两个小时。
张律师问我在想什么。
我说:“我在想那百分之七十被打包的数据,如果网线拔晚十秒钟,它们就出去了。我会背上一个永远洗不清的黑锅,赵建平会继续当他的技术总监,周浩会升职加薪。而这一切,只因为四十天前我在评审会上说了几句真话。”
张律师沉默了一会儿。
“你知道你做的所有事情里,哪一件最正确吗?”
我摇头。
“你发现电脑不对劲的时候,第一时间做的不是去找周浩对质,也不是去找赵建平理论,而是拔网线。人遇到危险的本能反应,才能看出一个技术从业者真正的素养。”
雨幕里,他撑着伞的背影很快消失在人群中。
我站了很久。
然后我掏出手机,开机。
未读消息铺天盖地。同事们的、朋友的、家人的。最上面一条是周浩的。
只有一行字。
“陈默,你给我等着。”
然后我走到地铁站,刷卡进站,坐上了回家的地铁。
车厢里人不多,我靠在门边,看着窗外飞速掠过的隧道灯光。
手机又震了一下。
紧接着,我被拉进了一个新群。群名叫“技术部临时工作组”,群主是CTO,成员是各部门的核心开发。
CTO发了一条消息:“赵建平负责的几个项目需要紧急接手,明早九点开会商量分工。所有人都要到,尤其是陈默。”
我看着这个消息,回了两个字:“收到。”
地铁轰隆隆往前开,窗外的灯光一明一暗地闪着。手机屏幕暗下去,映出我自己的脸。
我收起手机,闭上了眼睛。
明天要开会,但我现在什么都不去想。
只想回家,洗个热水澡,睡一觉。
过去的两个多小时,像一场梦。一场开场即高潮、落幕即清醒的梦。
我想起刚毕业那年,导师跟我说过一段话。当时没太懂,现在突然就明白了。
技术这条路,走到深处你会发现,最难的从来不是代码、不是架构、不是算法。最难的,是在看懂一切之后,还愿不愿意保持初心,还有没有勇气对不专业的事说不。有些人费尽心机往上爬,靠的是讨好和算计,不是技术。这种人在短期内看起来很厉害,但崩塌往往也只需要一瞬间。
就像赵建平。
他一定觉得自己算无遗策。先让周浩借我电脑植入后门,同时删除生产环境路由表制造事故——两条线同时收网,我必死无疑。如果不是我在第六分钟就觉得不对劲,如果不是那微妙的第六感驱使我走过去敲门推门,如果不是那一连串看起来是直觉、实际上是多年养成的条件反射式的警觉,我现在已经背着泄密和破坏生产的双重罪名,被保安架出公司大门了。
地铁到站了,广播报着我的站名。
我睁开眼,背起包,走出车厢。
出站口的风很大,吹得外套猎猎作响。路上行人匆匆,每个人都低着头赶路,没人注意到我。
手机在口袋里又震了一下。
是张律师发来的消息。
“对了,跟你说一声。赵建平在警察到之前试图删服务器日志,被安保当场控制了。”
我站了很久,看着这条消息。
然后我笑了。
技术出身的人,都以为自己能抹掉一切痕迹。但越是技术好的,越容易忽略一件事:现实世界不是代码构成的,不是删掉日志就能当作什么都没发生过。
现实世界里,每一件事都像钉子一样钉在时间里,撬不掉,抹不平。
收起手机,推开单元门,上楼。
终于回家了。
下一场,明天再说。
全部评论