[小说]雨云-从出生到上市 13-16章

全文仅供娱乐,如有任何不当之处,立马修改/删除
小说内容仅为虚构,请勿当真
买云请上雨云,便宜稳定性价比高,专属五折优惠码:mianfei
或点击:雨云 - 新一代云服务提供商

快速跳转到对应章节请看第1-2章帖子的开头

第13章 室友入伙

第二天早上七点,林语被手机震动吵醒。

他迷迷糊糊地摸到手机,眯着眼看了一眼——是雨云监控系统发来的告警:“VPS基础型#003节点CPU负载超过80%。”

林语一个激灵坐起来。

他揉了揉眼睛,打开笔记本电脑,连上服务器查看情况——还好,只是新开的那台VPS在跑编译任务,不是攻击。

他松了口气,但睡意已经完全没了。

看了眼时间,才七点十分。室友们还在睡觉,宿舍里只有空调的低鸣声和键盘声——那键盘声是他自己的,因为他已经把键盘敲起来了。

打开雨云后台,林语查看了昨晚一整晚的流量图。凌晨两点到四点,流量有一个小高峰,但很快降下去了——估计是某个用户的定时任务。

他又看了看那六台VPS的状态——全部正常在线,没有异常。

“还行。”他自言自语道,然后打开了微信。

果然,雨云用户群里已经有人开始问了:

“林老板,我的VPS昨晚跑了个编译任务,CPU一直100%,不会影响别人吧?”

林语回复道:“不影响,VPS是独立的,你随便跑。”

“那就好。林老板你这个VPS性价比真不错,我准备再开一台当数据库。”

“欢迎。”

回复完用户,林语关掉手机,躺回床上,伸了个懒腰。

但他睡不着了。

他心里想着刚才那个用户说“再开一台”——如果每个用户都能开两台甚至更多,那雨云的用户量很快就会上来。

但现在的问题是——他没有足够的人手。

所有的工单、所有的问题、所有的售后,都是他一个人在处理。

虽然现在的用户量不大,但已经开始挤占他的学习和休息时间了。

他想了想,决定找个人帮忙。

——室友小宏。


小宏全名叫陈宏,是林语的室友之一。广东佛山人,家里做家具生意的。大一的时候跟林语分到一个宿舍,两人关系还不错。

小宏的成绩一般,但人很老实,性格温和,最大的爱好是打游戏和追番。

林语知道他平时课余时间很多,而且他不反感计算机相关的东西——虽然他自己不懂技术,但至少会开机、会打字、会聊天。

如果让他帮忙回复一些简单的工单,应该没问题。

至少,能帮林语分担一部分压力。

林语翻身下床,走到小宏的床边。

小宏还在睡觉,被子蒙着头,只露出一只脚。

“小宏,小宏。”林语拍了拍他的肩膀。

“嗯……?”小宏迷迷糊糊地哼了一声。

“醒醒,有事找你商量。”

小宏翻了个身,睁开眼:“啥事啊……”

“我那个雨云,你记不记得?”

“记得啊……就是那个……卖服务器的?”

“对。现在我一个人忙不过来,想请你帮忙。”

小宏揉了揉眼睛:“帮啥忙?”

“帮我看一下群里的工单,回复一些简单的问题。比如用户问怎么开VPS、怎么重置密码之类的。你不会的就转给我。”

小宏愣了愣:“这……我行吗?”

“行。你只要会打字,会复制粘贴就行。”

小宏还是有点犹豫:“但是我不懂技术啊……”

“没事。我把常见问题的回复模板发给你,你照着回就行。”

小宏想了想,又问:“那……有报酬吗?”

林语想了想:“暂时没有工资。但以后赚到钱了,给你分红。”

“分红?多少?”

“这个……看公司收入。但我保证,不会让你白干。”

小宏沉默了几秒,然后说道:“行吧。反正我平时也没啥事,帮你看看群也行。”

林语笑了:“好。那我等会儿把模板发给你。”

他回到书桌前,打开电脑,开始整理“雨云常见问题回复模板”。


“1. 用户问:我要怎么开通VPS?

回复标准:您好,请登录雨云控制面板(https://panel.rainyun.com),点击“产品”->“VPS”,选择您需要的配置并下单即可。开通后会自动生成IP和SSH密码。

  1. 用户问:我的VPS打不开了,怎么办?

回复标准:您好,请先确认您的IP是否被封或是否欠费。如果IP被封,请联系我们换IP(收费)。如果欠费,请充值后系统会自动恢复。

  1. 用户问:VPS能不能退款?

回复标准:您好,VPS为虚拟商品,开通后如需退款,扣除已使用时间的费用后退还余额(不退现金)。

  1. 用户问:网站被攻击了怎么办?

回复标准:您好,如果是DDOS攻击,我们有基础防御(5Gbps),超过后VPS会被黑洞处理。建议开启CDN或购买更高防御。

  1. 用户问:能不能自定义ISO?

回复标准:您好,暂时不支持自定义ISO。我们提供常用系统镜像(CentOS、Ubuntu、Debian、Windows等)。”

林语写完后,把模板发给了小宏。

“小宏,你看看这个。以后群里有人问这些问题,你就按照模板回复。”

小宏接过手机,看了一遍,点头道:“好,我记住了。”

“还有一些情况,如果用户的问题模板里没有,你就转给我。”

“行。”

林语想了想,又说道:“对了,你回复的时候,语气要温和一点。不要让人家觉得你是机器人。”

小宏笑了:“放心吧,我平时在群里吹水,也挺会聊天的。”

“那就好。”


中午,林语跟小宏去食堂吃饭。

路上,小宏突然问:“林语,你这个雨云,以后真能赚钱吗?”

林语愣了一下:“怎么突然问这个?”

“我就是好奇。你看学校那些创新创业项目,哪个不是搞什么AI啊、大数据啊、区块链啊。你这个就是……卖服务器?听起来挺土的。”

林语笑了:“卖服务器确实不洋气,但它是刚需。任何一个网站、一个APP、一个游戏,都需要服务器。只要互联网还存在,服务器就会一直有人需要。”

“所以……你觉得你这个小厂能做大?”

“不是觉得,是一定。”

林语说这句话的时候,语气很肯定。

小宏看着他,沉默了几秒,然后说道:“好。那我跟着你干。”

林语拍了拍他的肩膀:“放心,我不会让你吃亏的。”


晚上,林语回到宿舍,打开电脑,开始开发“雨云管家”。

这是他早就想做的一个功能——把控制面板里常用的操作封装成一个桌面客户端,让用户可以在自己的电脑上直接管理服务器,不用每次打开网页。

当然,这个“雨云管家”只是一个简单的客户端,核心功能只有三个:

  1. 查看服务器状态(CPU、内存、带宽)。
  2. 重启/关机/重装系统。
  3. 查看工单进度。

林语打算用Go写后端接口,前端用Electron写一个简单的桌面应用。

他打开Go的开发环境,开始写RESTful API。

“GET /api/v1/server/:id/status → 返回服务器状态
POST /api/v1/server/:id/restart → 重启服务器
POST /api/v1/server/:id/stop → 关机
POST /api/v1/server/:id/reinstall → 重装系统
GET /api/v1/user/tickets → 查看工单列表”

写完接口后,他开始封装Electron前端。

他不会设计UI,所以界面很简单——整体是一个深色背景,左侧是服务器列表,右侧是服务器详情。

他把所有按钮都设计成大号的,方便用户点击。

写了一个小时,林语突然想到了什么——他打开搬砖狐的博客,看着她那个动态像素狐狸和代码雨动画,心里有点痒。

“要是我的面板也能做成那样……算了,现在没时间。”

他摇了摇头,继续写代码。


深夜十一点,林语终于把雨云管家的第一个版本写完了。

他打开电脑,在本地测试了一遍——功能正常,API响应速度快,UI虽然丑,但至少能用。

他想了想,觉得还是应该先发给几个内测用户看看,避免再出现CSRF那种低级错误。

他在用户群里发了一条消息:“兄弟们,我写了一个桌面客户端——‘雨云管家’。可以通过客户端直接管理VPS。界面有点丑,功能简单,但我自己测试了一下,能用。”

“谁想当小白鼠?”

群里很快有人回复:

“我来!”

“我也来!”

“林老板这次会不会又有什么漏洞啊?”

“别瞎说,林老板现在已经学会加Token了。”

林语笑了,回复道:“这次我测试过了,应该没问题。但为了安全起见,还是先让几个信任的用户试试。”

他点了几个老用户——风之旅人、老陈运维、还有几个经常在群里吹水的用户。

“你们几个,私信我,我发安装包给你们。”

很快,五个用户发来了私信。

林语把编译好的Windows安装包发给了他们。

“收到。”

“下载中。”

“安装完成。”

“林老板,界面确实丑。”

“功能还行,重启成功。”

“我也测试了,没问题。”

“可以上架了。再丑也得上架。”

林语看到这些评论,笑了笑:“好,明天我整理一下,正式发布。”


发完消息,林语关掉电脑,躺在床上。

小宏已经睡了,宿舍里只有空调的嗡嗡声。

他拿起手机,看到搬砖狐的微信头像亮着。

他点进去,发现对方刚发了一条朋友圈:“加班写代码,好累。想食雪。”

配图是一张深夜写代码的照片,桌面上摆着一杯奶茶和一包薯片。

林语忍不住笑了。

他在下面评论道:“食雪不如食酸菜鱼。”

几秒后,搬砖狐回复道:“你请?”

“行啊。等你来广州。”

“得嘞。我记下了。”

林语关掉手机,闭上眼睛,嘴角还挂着笑意。

他知道,雨云的路还很长。

但他知道,自己不是一个人。


第二天早上,林语被小宏推醒了。

“林语,林语,快看微信群!”

林语迷迷糊糊地睁开眼:“怎么了?”

“群里有个人说,他的雨云管家登录后,看到的是别人的服务器列表!”

林语瞬间清醒了。

他一把抓过手机,打开雨云用户群。

果然,一个用户发了一条消息:“林老板,我刚刚安装了雨云管家,登录后看到的是别人的服务器列表!我点了‘重启服务器’,结果操作的是别人的机器。”

林语的心猛地一沉。

他立刻回复道:“抱歉,我马上排查。”

他翻身下床,打开电脑,开始查看日志。

——原来是他写的API接口没有做用户鉴权的隔离。

他写的返回服务器列表的API,是通过header里的用户ID来查询的,但他忘记判断这个用户ID是否属于当前登录的用户。也就是说,如果一个用户伪造了请求,把header里的用户ID换成别人的ID,就可以看到别人的服务器列表。

更严重的是——如果用户点了“重启服务器”,操作的是别人的机器。

林语的脸色铁青。

他立刻关停了所有API接口,然后开始紧急修复。

他花了半个小时,修改了所有接口,增加了用户鉴权的检查——每一个请求,都要先验证当前登录的用户ID是否与请求中的用户ID一致。

然后,他又加了一层权限校验——用户只能操作自己名下的服务器。

修复完成后,他重新编译了安装包,发给了所有内测用户。

“抱歉,是我考虑不周。这个问题已经修复了。新安装包已发,请大家重新下载。”

内测用户们很快回复:

“修复了?”

“下载中。”

“安装完测试了一下,没问题了。”

“林老板,你这次犯的错有点低级啊。”

“确实,下次要注意了。”

林语看着这些评论,心里很不是滋味。

他回复道:“对不起,是我疏忽了。感谢大家的信任和支持。以后我会更加小心的。”

他关掉手机,靠在椅子上,深深地叹了口气。

……

中午,林语坐在书桌前,盯着电脑屏幕发呆。

小宏走过来,拍了拍他的肩膀:“别想太多了。这不是修好了吗?”

“但问题是,这个问题不应该出现。”林语苦笑道,“我是写了后端的人,怎么会犯这么低级的错误?”

“人都有犯错的时候嘛。关键是,这次没人出问题,你修好了,用户也理解你。”

林语沉默了几秒,然后说道:“但我不能每次都这样。”

他打开电脑,开始写一份文档——《雨云开发规范》。

他要把每一次犯错的教训,都记录在这份文档里。

第一条:所有API接口,必须做用户鉴权隔离。不允许通过header参数直接查询其他用户的数据。

第二条:所有更新操作,必须做幂等性检查。避免重复操作导致数据混乱。

第三条:所有敏感操作(删除/重启/重装),必须弹窗确认。

他写完后,把文档保存在了雨云的Git仓库里。

然后,他打开雨云管家的代码,开始重构——把之前的临时代码,改成可维护、可扩展的正式代码。


晚上,林语把雨云管家正式封装完毕,准备向全部用户开放。

但他多了一道工序——先在自己的VPS上部署一遍,模拟用户操作,确保没有任何问题。

他登录自己的VPS,打开雨云管家客户端,输入自己的账号密码——能正常看到自己的服务器列表。

他点了一个重启按钮——弹窗确认。

他确认后——服务器正常重启。

他又登录了另一个测试账号——看不到自己的服务器列表,只能看到测试账号的服务器。

“没问题了。”

他松了口气,然后打开了用户群。

“兄弟们,雨云管家正式上线了。”

“下载地址:https://panel.rainyun.com/download/rainyun-manager-v1.0.0.exe”

“界面有点丑,但功能齐全。支持Windows系统,Mac和Linux版本后续再加。”

“欢迎大家下载使用。”

群里顿时热闹起来:

“终于来了!”

“下载中。”

“安装完成,登录成功。”

“界面确实丑,但能用。”

“林老板,能不能改个皮肤?深色的看得人压抑。”

“皮肤功能后续再加。”

林语看着用户的反馈,心里暖暖的。

虽然这次出了点小问题,但最终还是发布了。

他靠在椅子上,长长地呼了一口气。

“终于,雨云管家,正式上线了。”

……

夜更深了。

林语关掉电脑,走到阳台。

远处,广州的天际线在夜色中闪烁着霓虹光。

他的手机震了一下——是搬砖狐发来的微信:“我听说了。你那个雨云管家出了bug?”

林语愣了一下:“你消息这么快?”

“群里有我的眼线。”

林语笑了:“眼线?谁啊?”

“不告诉你。”

“好吧……是的,出了点小问题。但已经修好了。”

“那就好。你下次注意点。这种事,不能再发生了。”

“我知道。我会小心的。”

“行了,早点睡。明天还要上课。”

“好。你也早点睡。”

“嗯。”

林语关掉手机,仰望夜空。

他知道,雨云的路还很长。

但他知道,自己不是一个人。

他转身回到房间,打开电脑,在雨云开发规范的文档里,加了最后一条:

“永远不要相信自己没有bug。”

第14章 隔离失效


凌晨两点,林语躺在床上,盯着天花板。

《雨云开发规范》已经写好了,最后那条“永远不要相信自己没有bug”像根刺一样扎在他心里。

他翻了个身,拿起手机,准备再看一遍用户群的消息。

就在这时,手机震动了——小宏的微信直接弹出:

“林语!救命!又出事了!”

林语瞬间坐起来,心跳漏了一拍。

“怎么了?”

“我刚才在回复工单,有个用户说登录后看到的是别人的面板!他说他点了‘重装系统’,结果别人的服务器被重装了!”

林语的手抖了一下。

他立刻翻身下床,打开电脑。

“我看看。”

他登录雨云后台,查看日志。

日志显示——确实有用户登录后看到了别人的控制面板。

而且,那个用户确实操作了别人的服务器——重装系统。

林语的脸色瞬间白了。

“这个bug和雨云管家那个不一样。”他咬着牙说,“雨云管家那个是API没做鉴权,这个是我们数据库的东西。”

他打开数据库,开始查看服务器和用户的关联表。

——他看到了一堆乱码。

“我操。”

小宏跑过来:“什么问题?”

“数据库视图的权限分配有问题。”林语指着屏幕,“你看这个视图——‘user_servers’。理论上,它是通过user_id筛选的,但这里没有做额外的权限校验。所以,如果一个用户伪造了user_id,他就可以看到所有人的服务器。”

“那怎么办?”

“现在先停掉面板。”林语深吸一口气,“我得把这个视图重写一遍。”

他打开终端,输入命令:

sudo systemctl stop nginx
sudo systemctl stop php7.4-fpm

然后,他打开数据库,开始重构视图。

他把原来的“user_servers”视图删除,重新创建了一个带权限校验的新视图:

CREATE VIEW user_servers AS
SELECT s.* FROM servers s
JOIN users u ON s.user_id = u.id
WHERE u.id = CURRENT_USER_ID();

然后,他又把所有查询这个视图的接口,都加了一层鉴权检查。

整个过程花了两个小时。

凌晨四点半,林语把面板重新上线。

他测试了一遍——登录自己的账号,只能看到自己的服务器。

登录另一个测试账号,也看不到自己的服务器。

“修好了。”他松了口气,“现在问题是——怎么跟用户交代。”

小宏沉默了几秒:“你打算怎么说?”

“实话实说。”林语打开用户群,编辑了一条消息:

“各位用户朋友,今晚发生了一起数据隔离故障。有用户登录后看到的是别人的控制面板。经排查,是数据库视图权限配置问题导致。目前已修复,所有数据未泄露,但确实发生了误操作。对因此造成困扰的用户,我深表歉意。请受影响用户联系我,我会提供50元无门槛优惠券作为补偿。”

他发完消息,靠在椅子上,长长地呼了一口气。

小宏说:“你这道歉也太诚恳了。”

“不诚恳不行。”林语苦笑,“这种事,瞒不住的。越是藏着掖着,用户越不信任。”

“行吧。那我先去回了影响用户的工单。”

“好。”

林语打开笔记本,在《雨云开发规范》里加了一条:

“第四条:所有数据库视图,必须增加权限校验。SQL注入和权限隔离是底线。”


早上七点,林语被手机震醒了。

他拿起手机一看——用户群里已经有几十条消息了。

大部分人表示理解:

“修好了就行,没事。”

“谁还没犯过错了。”

“补偿就不用了,林老板也不容易。”

但也有几个用户反应激烈:

“我昨天刚存了重要数据,现在不知道有没有泄露!”

“我要是有损失,你必须赔偿。”

林语一一回复:“数据没有泄露,只是视图权限问题。您的服务器数据是独立的,不受影响。”

他发完后,叹了口气。

小宏端着一杯豆浆走过来:“喝点吧。一晚上没睡,你脸色很差。”

“谢了。”林语接过豆浆,喝了一口,“对了,那个被误操作重装系统的用户,联系上了吗?”

“联系上了。他说他是做个人博客的,数据没备份。”

“我操。”林语放下杯子,“那他岂不是所有文章都没了?”

“是啊。他说让雨云赔。”

林语沉默了几秒:“行,我亲自联系他。”

他打开用户列表,找到那个用户——ID是“北风”。

林语点开他的资料:注册时间2020年11月,个人博客用户,网站是“北风的小站”。

林语打开他的博客——首页已经变成空白了,数据全部丢失。

他深吸一口气,点开私聊:

“北风你好,我是雨云的林语。关于昨天的事,我深表歉意。你的服务器数据丢失,是我们的责任。我愿意全额退款,并免费提供一年最高配置的VPS作为补偿。同时,如果你有数据库备份的习惯,我可以帮你恢复一部分数据。”

北风的回复很快来了:

“林老板,你的意思我明白。但我的博客数据全丢了,这是我三年的心血。全额退款和一年免费VPS,能弥补吗?”

林语愣住了。

他知道,北风说得对。

对于一个个人站长来说,数据比服务器值钱多了。

他回复道:“我理解你的感受。数据确实无法恢复,我们也没有备份。这样吧,除了上述补偿,我还可以帮你手动重构你的博客——只要你提供截图或历史版本。我自己也写博客,知道这种感受。”

北风沉默了很久,然后发来一段消息:

“算了。数据丢了就是丢了。你的补偿我接受。但我希望雨云以后别再出这种问题。我是真的喜欢你家的服务,不然我也不会用一年。”

林语看着这段消息,眼眶有点热。

“谢谢你的理解。我保证,以后不会再有这种事。你的博客如果需要域名或其他帮助,直接找我。我帮你搞定。”

“好。这事翻篇了。”

林语靠在椅子上,心里五味杂陈。

小宏凑过来:“解决了?”

“解决了。他是个好人。”

“那就好。你现在可以睡觉了吧?”

“嗯。”林语站起来,准备躺床上。

就在这时,私聊又响了。

他打开一看——是一个叫“大魔王”的用户。

“林老板,我知道你今天早上出了个bug。我刚登录面板,看到的是别人的服务器。”

林语的心又提起来了。

“你看到了什么?”

“我看到了一个叫‘风之旅人’的用户的服务器。我看到他的网站后台密码、服务器IP、root密码。”

林语的脸色瞬间白了。

“你截图了吗?”

“截图了。而且,我还可以登录他的服务器。”

“你想怎么样?”

大魔王没有立刻回复。

几秒后,他发来一条消息:

“我不想怎么样。我只是觉得,这个bug挺有意思的。”

林语的手指在键盘上悬着,迟迟没有落下。

他知道,这不是一个简单的用户。

这是一个来敲诈的。

他深吸一口气,回复道:

“你想要什么补偿?”

“补偿?”大魔王发了一个笑脸表情,“我不需要补偿。我只是觉得,这事要是曝光出去,对雨云影响挺大的。”

“你想曝光?”

“我还没决定。我这个人,比较讲道理。只要你答应我一个条件,这事我就不往外说。”

“什么条件?”

大魔王沉默了五秒,然后发来一段消息:

“让我永久免费使用10台最高配置的VPS。全程雨云承担带宽、IP、防御费用。否则,我就把所有截图发给网安,举报雨云泄露用户隐私。”

林语看着这段话,脑子嗡了一声。

小宏凑过来:“他说什么?”

“勒索。”林语咬着牙,“10台最高配VPS,永久免费。”

“这家伙疯了吧?”

“没有。”林语冷静下来,“他很清楚雨云的致命弱点——隐私泄露。只要他向网安举报,我们不仅会被罚款,还有可能被要求整改,甚至关门。”

“那你打算怎么办?”

林语没有回答。

他看着屏幕上的威胁信息,手指在键盘上反复悬停。

时间一分一秒地过去。

最终,他的手指落在键盘上,开始打字:

“大魔王,首先,我承认这个bug是我们的问题。我们已经修复了,并在用户群公开道歉,提供了补偿方案。”

“其次,你说你截图了。我可以明确告诉你——这个bug是视图权限问题,理论上不可能看到root密码。如果你真的看到了,那是你伪造的。”

“第三,你想勒索我。我给你最后一次机会——放弃这个想法,我还可以给你优惠码。否则,我现在就把你的ID、IP、所有操作日志,打包发给网安。”

大魔王回复道:“你威胁我?”

“不是威胁。”林语的手指飞快地敲击键盘,“我是在告诉你事实。雨云虽然小,但我们已经注册了公司。后续业务合规性,我们会一步步完善。隐私泄露这种事,我们不可能让它发生。如果你真的举报了,我们确实会面临风险。但如果你敲诈勒索的行为被证实,入罪的可是你。”

大魔王沉默了。

林语继续说:

“再说一遍——你现在放弃敲诈,我还可以给你优惠码。如果你执意要走这条路,那我们就鱼死网破。”

大魔王的消息发来:“你确定要这么做?”

“确定。”

“好。那我们就走着瞧。”

林语没有再回复。

他关掉私聊窗口,转过头看向小宏。

小宏问:“他走了?”

“没有。他说走着瞧。”林语叹了口气,“帮我盯着他的账号。一旦发现异常操作,立刻封停。”

“好。”

林语站起来,走到阳台。

远处,广州的天际线已经泛白了。

他掏出手机,看到搬砖狐的微信头像亮着。

他点开,发现对方发了一条消息:“我听说了。那个bug的事。”

林语回复道:“消息这么快?”

“群里有眼线。这次是谁?”

“一个叫大魔王的用户。他发现bug后拍照截图,然后勒索我。”

搬砖狐发了一个震惊的表情:“勒索?他想要什么?”

“10台最高配VPS,永久免费。”

“我操,这胃口也太大了。”

“对。我已经回绝了他。”

“你不怕他举报?”

“怕。”林语停顿了一下,“但该来的躲不过。我们迟早要面对这种事。”

搬砖狐沉默了几秒,然后发来一段消息:

“林语,你知道吗?你刚才那句话,让我想起了一个人。”

“谁?”

“一个敢正面硬刚勒索的人。”

林语笑了:“是谁?”

“不告诉你。但你放心,他最后赢了。”

“那就好。”

林语关掉手机,望着远方初升的太阳。

他知道,今天只是个开始。

但他也知道,自己已经准备好了。


上午十点,林语坐在书桌前,回顾昨晚的日志。

他重新检查了数据库视图的权限配置,确认没有遗漏。

然后,他打开用户群,看到那条道歉消息下面已经有一百多条回复。

大部分是理解和支持:“林老板辛苦了。”、“人非圣贤,孰能无过。”、“加油,信任你们。”

但也有几个用户提出了质疑:

“这事怎么保证以后不再发生?”

“我的数据安全吗?”

林语一一回复:

“我们已经做了全面的安全审查,修改了视图权限,增加了鉴权隔离。以后不会再发生这种事。对于任何用户数据泄露的疑虑,我可以提供全量日志供您检查。”

就在这时,小宏跑过来:“林语!大魔王在群里发截图了!”

林语心头一惊,立刻打开群聊。

果然——大魔王在群里发了一张截图,正是他登录后看到别人服务器列表的截图。

“各位,这就是昨晚bug的受害者之一。我本以为林老板会私下解决,没想到他就打算这么糊弄过去?”

群里顿时炸了:

“我操,还真有这事?”

“别人的服务器都能看到?”

“林老板,这就不对了。你昨晚不是说修复了吗?”

林语深吸一口气,然后才开始打字:

“各位,大魔王发的截图是真实的。昨晚确实发生了这个bug。我们已经修复了。但我要澄清三点:

第一,这个bug只影响了视图展示,没有影响数据安全。截图里能看到服务器名称和IP,但无法操作他人服务器。

第二,我们已经在用户群公开道歉并提供补偿,受损用户也已得到妥善处理。

第三,大魔王截图后做的第一件事,是私下联系我,要求我给他永久免费10台最高配VPS,否则就向网安举报。

我已经明确拒绝了他的要求。现在他在群里发截图,是想借此施压。”

群里顿时安静了。

几秒后,风之旅人率先说话:

“操。还以为是来维权的,原来是想白嫖?”

“太不要脸了。”

“林老板,封他号。”

“举报他。”

大魔王立刻回复:“你们别听林语瞎说!我根本没勒索他!我只是想曝光这个bug!”

林语冷笑了一声,然后打开后台,截了一张图——正是大魔王私聊他的聊天记录。

他发到了群里:

“各位请看。这是大魔王昨晚发给我的私聊截图。他明确提出了‘永久免费10台最高配VPS’的要求,并以向网安举报作为威胁。”

群里再次炸了:

“证据都出来了,这人还有什么好说的?”

“报警吧。”

“截图保留,直接提交给网安。”

“我去帮林老板报警。”

大魔王慌了:“截图是P的!林语伪造的!”

风之旅人回复道:“我认识林语快一年了,他说的话我信。而且,我相信他没那么蠢,会伪造截图。”

“+1。”

“+10086。”

大魔王沉默了几秒,然后留下一句话:

“你们等着。我会让你们后悔的。”

说完,他的头像就变暗了——被林语封号了。

群里安静了。

林语发了一条消息:“各位,感谢大家的信任和支持。这次bug的事,我深表歉意。后续,我们会做全面的安全审查,完善《雨云开发规范》,确保不会再发生类似事件。同时,我们也开始考虑组建安全审核团队。大家的每一份信任,都值得被认真对待。”

群里一片叫好。

林语关掉手机,靠在椅子上,长长地呼了一口气。

小宏凑过来:“大魔王被封了?”

“封了。截图保留,备案。”

“那他会不会真的举报?”

“随他去吧。”林语闭上眼睛,“我们已经做了该做的。剩下的,就看天意了。”


傍晚,林语正在检查系统日志,手机震动了。

他打开一看——搬砖狐的微信。

“林语,你今天那波操作,够硬。”

林语笑了:“硬在哪里?”

“硬在敢正面刚勒索。你那种人不能惯着。你越软,他越硬。”

林语沉默了几秒,然后回复:

“其实我也有点慌。万一他真的举报了,我们可能要关门。”

“那你会后悔吗?”

林语想了想,回复道:“不会。因为如果因为他一次勒索就妥协了,那雨云就不是雨云了。”

搬砖狐发了一个竖大拇指的表情:

“这才是我认识的林语。对了,我问你一个问题。”

“你说。”

“你说他是去食雪,还是去报警?”

林语看着这个问题,突然笑了。

他想起自己那句名言——“你这是违法行为,走,跟我去食雪。”

他回复道:“他应该去食雪。”

搬砖狐发了一个“哈哈”大笑的表情。

“那你呢?今晚去食什么?”

林语想了想,回复道:“食酸菜鱼。你请?”

“行啊。等你来广州。”

“得嘞。我记下了。”

林语关掉手机,嘴角挂着笑意。

他知道,今天虽然很难,但他挺过来了。

他知道,以后还会有更难的事。

但他也知道——自己不是一个人。


晚上九点,林语重新检查了一遍系统,确认所有功能正常。

他打开《雨云开发规范》,加了一条新规则:

“第五条:所有涉及用户数据的接口,必须经过双人审计。一个人写代码,一个人检查。”

他保存文档,然后登录用户群,发了一条公告:

“各位用户朋友,我是林语。今晚雨云系统已全面修复并完成安全审查。对于连日来的故障与漏洞,我深表歉意。在此,我向每一位用户承诺:雨云将组建安全审核团队,建立双人审计机制,确保每一行代码的可靠性。您的数据安全,是我们的生命线。”

公告下面,很快出现了一大片回复:

“林老板稳了。”

“加油!”

“信任是双方面的。相信雨云会越来越好。”

“支持。”

林语看着这些留言,心里暖暖的。

他关掉电脑,站起来,走到阳台。

远处,广州的灯火映照在夜空下,像一片星海。

他望着那片星海,默默地想着:

“雨云,才刚刚开始。”


第15章 羊毛之战

凌晨两点,林语躺在床上,久久不能入睡。

大魔王被封号后的这几个小时,他总觉得有什么不对劲。

勒索这种事,在一个刚起步的小IDC圈子里并不罕见。但大魔王的手法太熟练了——抓到漏洞后不声张,先截图留证,然后精准地找到老板私聊,开出价码。这不像是一个普通用户的冲动之举。

更像是,早有预谋。

林语翻了个身,打开手机,看到搬砖狐发来的消息:“睡着了?”

“没。在想事。”

“想大魔王?”

“嗯。”

“我帮你查了查这个ID。”搬砖狐发来一张截图,“他的账号注册时间不长,但充值记录显示,他曾经用同一个手机号注册过三个账号。前两个账号都因为‘恶意退款’被封了。”

林语坐起来:“什么恶意退款?”

“他在其他IDC薅羊毛。买了服务器,用DDoS打别人,然后以‘被攻击导致业务受影响’为由申请退款。仗着对方是小服务商、没精力追查,薅了不下五家。”

林语皱起眉头:“你怎么查到的?”

“我有我的渠道。”搬砖狐发了一个得意的表情,“这人在IDC圈子里挺有名的,外号‘青草哥’。因为他最擅长薅‘小草IDC’那种小服务商的羊毛。哦对,他还建了一个群,专门教人薅羊毛。”

“操。”林语骂了一声,“那大魔王这次是冲着我来的?”

“大概率。但他没想到,你比他想象中硬。”

林语沉默了几秒,然后问:“你觉得他背后还有没有别人?”

“不好说。你一个小服务商,不值得他大张旗鼓。但他既然盯上你了,就不会轻易松口。你封了他号,他肯定会换号再来。”

“那我就让他来。”

搬砖狐发了一个问号:“你有想法了?”

“嗯。”林语嘴角勾起一丝笑意,“他不是喜欢薅羊毛吗?那我就设个局,让他薅个够。”


第二天上午,林语开始行动。

他先找到风之旅人和刘总,把大魔王的事告诉了两人。

风之旅人听后立刻表示支持:“林老板,你说怎么搞,我就怎么配合。”

刘总也有些义愤填膺:“我虽然刚入行,但也听过这些羊毛党的恶名。他们要搞你,就是搞我们这些正经做业务的。说吧,需要我做什么?”

林语把自己的计划简单说了一遍。

听完后,风之旅人眼睛一亮:“好主意。这样既能抓住他的把柄,又能把背后的人挖出来。”

刘总点头:“我这边可以提供一个域名,假装是刚注册的新手站长。”

“那就拜托了。”林语拱了拱手。

计划很简单——在雨云上新开一个“高防VPS”产品,专门用一个容易出问题的老系统版本做诱饵,然后邀请几个老用户假装成“刚入行的新手站长”,吸引大魔王上门。

大魔王如果真是羊毛党,一定会盯上这些“新手站长”。到时候,就能抓住他的把柄。


三天后,雨云上架了一款新品——“高防VPS基础型”,2核4G,10M带宽,200G防御。价格标得虚低——99元一个月,首月五折。

这款产品的宣传文案特意写得漏洞百出:“高防系统采用老牌防DDoS模块‘CloudShield2.0’,支持自动清洗,稳如老狗。”

实际上,这个CloudShield2.0是林语从网上找的开源项目,三年前就停止更新了。它的防D能力很弱,却有明显的逻辑漏洞——攻击流量超过阈值时,系统会自动切换到“透传模式”,把所有流量直接放行到目标服务器。

这行话,林语没有写在宣传文案里。

他故意留了一个“后门”——让懂行的人一眼就能看出系统的弱点。

两天后,销售数据出来了:“高防VPS基础型”卖出去了5台。其中,4台是新注册的账号,1台是老用户复购。

林语仔细核对了那4个新账号的注册信息:

账号1:注册时间当天,IP地址是广东佛山的一个移动宽带。
账号2:注册时间当天,IP地址是湖南长沙的一个电信宽带。
账号3:注册时间当天,IP地址是浙江杭州的一个联通宽带。
账号4:注册时间当天,IP地址是香港的一个数据中心。

林语看着这些信息,眉头皱了起来。

前三个账号的IP地址都是家庭宽带,但这三个IP正好覆盖了三个主要运营商,分布在全国三个不同的省份。这可不像是一个普通用户的操作习惯。

林语点开第四个香港IP的注册信息——对方用了一个临时邮箱注册,手机号也是网上找的接码平台。

“有点意思。”林语喃喃自语。

他打开后台,找到风之旅人的微信号,发了一条消息:“风哥,帮我确认一件事。”

“你说。”

“你那个新号,最近有没有人私聊你?”

“有。昨天下午,一个叫‘阿豪’的人加我QQ,说是在群里看到我发的消息,想问问‘新手应该如何选择服务器’。”

“然后呢?”

“我就按你说的,跟他聊了聊。他问得很细,什么配置、什么防御、能不能抗DDoS。我装作很懂的样子,跟他吹了一通。”

林语忍不住笑了一声:“那你觉得他专业吗?”

“专业。他问的问题,都是我们这一行的技术细节。比如你们那个CloudShield2.0的清洗阈值是多少、透传模式怎么设置。一个新手不可能问出这种问题。”

林语心头一沉:“那他觉得你是什么水平?”

“他觉得我是个半懂不懂的新手。”风之旅人发了个得意的表情,“他问的问题我都答上来了,但刻意答得有些凌乱。他应该会认为我是个菜鸡,容易忽悠。”

“很好。那他有没有提出要帮你测试服务器?”

“没有。他只是说,如果有什么问题,可以找他。”

林语沉默了片刻,然后说:“那你主动一点。告诉他你被攻击了,服务器卡得要死,想让他帮忙看看。”

“行。”


一个小时后,风之旅人发来消息:“他上钩了。”

林语立刻打开聊天记录截图。

阿豪:“你这系统出问题了?”

风之旅人:“是啊,不知道怎么回事,网站突然打不开了。你是不是懂技术?帮我看看?”

阿豪:“你把IP和密码发给我。”

风之旅人:“行。”

截图到这里就结束了。

林语看着这段对话,心跳加速。

他转头看向小宏:“你觉得他会怎么做?”

小宏想了想:“拿到IP和密码后,他肯定会登录你的服务器。然后,他有两种选择——要么是装木马,要么是利用你的服务器攻击别人。”

“对。而我们现在要做的,就是监视他的行为。”

林语打开后台监控系统,把风之旅人的那台VPS添加到重点监控列表中。

他的手上,已经准备好了下一步的行动。


当晚十一点,风之旅人发来消息:“林老板,阿豪登录了我的服务器。”

林语立刻打开监控日志——确实,在十分钟前,有人用SSH登录了风之旅人的VPS。IP地址是那个香港数据中心的。

林语盯着监控屏幕,手指紧握着鼠标。

日志显示,对方登录后做的第一件事是检查系统版本和软件列表。然后,他创建了一个隐蔽的文件夹,在文件夹里传了一个脚本文件。

脚本文件的内容,林语看不懂。但他截了一张图,发给了搬砖狐。

搬砖狐很快回复了:“这是大规模挖矿用的工具包。”

“挖矿?”

“对。他会把你的服务器变成矿机,用来挖门罗币。一旦他成功部署了这个工具,你的服务器就会变成他的‘肉鸡’。不仅算力被他盗窃,还会因为大量占用CPU导致你的业务卡死。”

林语倒吸一口凉气:“那他接下来会做什么?”

“部署挖矿工具后,他会把服务器加入他的‘肉鸡池’。以后他会用这个肉鸡来攻击其他服务器。到时候,攻击的源头就是你提供的IP。你不仅亏了服务器的钱,还会被网安部门盯上。”

林语心里一阵恶寒。

他没想到,这些羊毛党的手段如此狠毒——他们不是单纯地薅羊毛,而是在利用这些“新手”的服务器,干违法犯罪的事。

他深吸一口气,打开风之旅人的聊天窗口:“风哥,他现在还没有部署完矿机。你找个理由,让他离开一下。”

“什么理由?”

“就说你亲戚突然住院,你要去医院。”

“行。”

五分钟后,风之旅人发来消息:“我告诉他了。他说‘那你先去,我帮你看看服务器’。”

“这家伙还真是热心。”林语冷笑一声,“那我就不客气了。”

他打开后台,开始追踪阿豪的IP。

监控日志显示,阿豪登录了那台香港数据中心的IP后,又通过那台IP登录了其他几台服务器。林语记录下这些IP,发现它们分属不同的IDC——有腾讯云的、阿里云的、还有一家叫“星云”的小IDC。

林语把这些IP全部收藏,然后打开阿里云的用户群,发了一条消息:“各位,请问有没有人认识这个香港IP?是哪个服务商的?”

很快,一个叫“兰陵王”的群友回复了:“这IP是星云的。”

“星云?”林语皱起眉头,“那个做低价服务器的?”

“对。他们家的机器便宜,但经常被薅羊毛。”

林语心头一动,打开风之旅人发来的截图,仔细比对阿豪的对话风格。他发现,阿豪说话时经常带一句“你这系统咋这么差?”、还有“星云的机器都比这稳定”。

这些话,不像是随口说的。

更像是一种习惯。

——习惯性地拉踩对手,习惯性地推销另一家服务商。

林语恍然大悟:“原来如此。”

他打开搬砖狐的聊天窗口:“狐狸,我有个猜测。”

“说。”

“大魔王不是单纯的羊毛党。他是星云派来的。”

搬砖狐发了一个震惊的表情:“你确定?”

“八九不离十。他刚才登录了风之旅人的服务器后,做的第一件事是比对系统版本和配置。然后,他推荐风之旅人用星云的机器。这还不算——他说话时,经常拉踩我们,夸星云的机器稳定。”

搬砖狐沉默了几秒,然后说:“如果真是星云,那就麻烦了。他们是同行,是小IDC里做得比较狠的一家。之前就有人爆料过,星云会派水军去薅其他服务商的羊毛,然后拉踩对手。”

“对。他们就是想搞垮我们。”

林语站起来,走到窗边,看着远处灯火通明的广州CBD。

他知道,这场斗争才刚刚开始。


凌晨一点,林语开始行动。

他先联系了几个老用户,把自己的猜测告诉了他们。然后,他建立了一个“蜜罐群”,把风之旅人、刘总、以及另外三个信得过的老用户拉进群里,在群里共享阿豪的IP和操作日志。

“各位,从现在开始,你们手上的机器都变成了蜜罐。我要你们做的,就是假装成新手站长,让他登录你们的服务器,然后记录下他的所有操作。”

风之旅人第一个响应:“没问题。他刚刚给我发消息,说我的服务器需要‘加固’,可以帮我免费加固。我答应他了。”

“很好。让他登录,但别让他动任何关键数据。”

“明白。”

其他几个老用户也陆续发来消息——他们都在和阿豪聊天,并且都答应了让阿豪帮忙“加固”。

林语看着这些消息,心里既紧张又兴奋。

他知道,这一步走对了。

阿豪的“羊毛党”身份已经被锁定。只要他上钩,证据就会一点一点浮出水面。

凌晨三点,阿豪开始登录第二台蜜罐服务器。

监控日志显示,他同样检查了系统版本和软件列表,然后上传了挖矿脚本。

林语截下这些证据,然后打开搬砖狐的聊天窗口:“狐狸,帮我查一下这个脚本的MD5值。”

搬砖狐很快回了一个MD5值,然后说:“这个脚本的MD5值,在几个安全论坛上都有记录。它被标记为‘星云定制版’。”

“星云定制版?”

“对。因为它的代码里有注释,写着‘// for xingyun 2.0’。这个是星云的内部版本号。”

林语深吸一口气:“所以,石锤了。”

“石锤了。你打算怎么做?”

林语沉默了片刻,然后说:“先不声张。等他下一台机器的操作。”

“你还要钓鱼?”

“对。我要钓到他同时上钩三台机器以上,攒够证据链。然后一次性公开。”

搬砖狐发了一个竖大拇指的表情:“林总,你狠。”


凌晨五点,阿豪上钩了。

他同时登录了三台蜜罐服务器,并且开始同时部署挖矿脚本。监控日志显示,他操作同一个IP地址登录了这三台机器,并且上传了同一个脚本。

林语截下了所有证据——包括登录日志、脚本文件、聊天记录。然后,他开始整理这些证据,编成了一个完整的证据链。

证据链包括:

  1. 阿豪(大魔王)的注册信息和IP地址。
  2. 阿豪的聊天记录——他主动联系风之旅人,表示可以“帮助加固服务器”。
  3. 阿豪登录蜜罐服务器的日志——他检查系统版本和软件列表,上传挖矿脚本。
  4. 阿豪部署的挖矿脚本——MD5值被标记为“星云定制版”。
  5. 阿豪的操作习惯——他喜欢拉踩雨云,推销星云的机器。

林语把这些证据打包成一个压缩文件,然后发到了用户群。

群里顿时炸了:

“操,还真是同行派来的水军!”

“星云臭不要脸!”

“林老板,直接报警吧!”

“证据都这么齐全了,网安的人应该会管。”

林语发了一条消息:

“各位,证据我已经整理好了。接下来,我会把这份证据提交给网安和IDC行业联盟。”

“同时,我也要对星云说一句话——竞争可以,但不应该用下三滥的手段。我们在努力提升服务品质,你们在努力薅羊毛。这就是差距。”

“后续,雨云会加强安全审查,封堵漏洞。感谢大家的信任和支持。”

群里一片叫好。

风之旅人带头刷了一波“666”。

林语关掉手机,靠在椅子上,长长地呼了一口气。

他看了看窗外的天色——天亮了。


上午十点,林语开始封堵漏洞。

他把雨云控制面板和API接口全面审查了一遍,发现了一共17个逻辑漏洞。其中,15个是可以通过修改配置和代码修复的,另外2个需要重构数据库结构。

林语通宵解决这15个漏洞,把修复方案写成了一个补丁包。

然后,他把《雨云开发规范》更新了一遍:

“第六条:所有外部接口必须经过白盒测试,模拟攻击者行为。
第七条:用户数据权限校验,必须同时检查用户ID和服务器ID,缺一不可。
第八条:所有订单、优惠券、体验券使用记录,必须记录操作者的IP、设备指纹、浏览器特征。”

小宏看着这些新规则,忍不住说:“林语,你这是要把雨云做成堡垒啊。”

林语笑了笑:“堡垒才能让人安心。”

他登录后台,把所有免费体验券的领取规则改成了“需人工审核”——每个新用户领取免费体验券,必须提交真实姓名、联系方式、业务用途。审核通过后才能使用。

这样做虽然会增加运营成本,但能有效过滤羊毛党。

然后,他修改了优惠码的生成规则——每个优惠码都有有效期和使用次数限制,并且关联申请者的IP和设备信息。如果发现同一个IP多次申请优惠码,系统会自动拦截。

“这样,就能挡住他们了。”林语说。


下午两点,林语正在检查系统日志,手机震动了。

他打开一看——搬砖狐的微信。

“听说你昨晚通宵了?”

“嗯。封了15个漏洞。”

“辛苦了。我给你点了一份外卖,是酸菜鱼。”

林语愣了一下,然后忍不住笑了:“你什么时候点的?”

“刚才。你昨晚通宵,今天肯定没吃饭。”

林语心里一暖:“谢了。”

“不客气。对了,你说的星云,我帮你查过了。他们不是第一次这么干。”

“怎么说?”

“他们雇水军,去薅所有新起的IDC的羊毛。一旦成功,就拉低他们,推荐自己的机器。如果不能拉低,就制造舆情,逼对方关门。之前有一家叫‘蓝云’的小IDC,就是被星云搞垮的。”

林语深吸一口气:“那他们搞垮了多少家?”

“据我所知,至少五家。”

“操。”林语骂了一声,“这次他们踢到铁板了。”

“对。你准备怎么反击?”

林语想了想,说:“先把证据交给网安,同时在IDC行业联盟里曝光他们。让所有人都知道,星云是什么货色。”

“好。我支持你。”

林语沉默了片刻,然后说:“狐狸,谢谢你。”

“谢什么?”

“谢谢你在最需要的时候,给我送酸菜鱼。”

搬砖狐发了一个捂嘴笑的表情:

“那你下次请我吃。”

“行。等你来广州。”


傍晚六点,林语收到了网安的初步回复:

“林先生,您提交的证据已经收到。我们正在对相关IP和账号进行核实。如果证据属实,我们将依法对相关责任人进行处理。”

林语看着这条回复,心里的一块石头落地了。

他打开IDC行业联盟的群,把证据发到了群里。

群里立刻炸了锅:

“卧槽,星云干出这种事?”

“难怪上次我们也被薅了羊毛,原来是他们干的!”

“林老板,有证据就报案吧。”

“星云滚出行业联盟!”

群主“清风明月”站出来说:“各位安静一下。林老板提供的证据我们已经看到了。接下来,联盟会启动内部调查。如果星云真的做了这种事,我们会把他们踢出联盟。”

林语回复道:

“感谢联盟的支持。我不是针对星云,但我希望所有IDC都能合规经营、公平竞争。”

“用下三滥的手段薅羊毛、挖墙脚,最终只会毁掉整个行业的口碑。”

“联盟不应该是一个帮派,而应该是一个大家庭。大家互相支持、共同成长,才是正道。”

群里再次响起一片叫好声。

风之旅人带头刷了一波“正道的光”。

林语关掉手机,靠在椅子上,长长地呼了一口气。

他知道,这次的反击成功了。


晚上九点,林语坐在书桌前,重新检查系统日志。

经过昨天的通宵修复,系统已经稳定了很多。他检查了所有用户的登录日志,没有发现异常。

但他总觉得有什么地方不对劲。

他打开阿里云的用户群,发现群里也没有异常。

他打开风之旅人的QQ聊天窗口,也看到对方在群里吹水。

一切看起来都很正常。

但林语总觉得,心里有些发毛。

他站起来,走到阳台,望着远处的广州CBD。

月光洒在高楼上,那些灯火通明的窗户,像是无数双眼睛。

他抬头,看了看天空——今晚的星空很明朗,星星一颗一颗地亮着。

林语深吸一口气,然后闭上眼睛。

“雨云,才刚刚开始。”他默默地对自己说。


凌晨两点,林语还在处理最后的日志。

突然,系统自动扫描弹出了一个警告:

“IP: 103.xxx.xxx.xxx 上传了一个可疑文件,已自动隔离。”

林语心头一惊,立刻打开扫描日志。

扫描日志显示,有人通过一个隐藏极深的WebShell上传了一个PHP文件。这个WebShell的位置,在雨云控制面板的旧版本中——一个废弃的API接口。

那个API接口,林语记得很清楚。

那是大一时候写的。

——那是雨云第一版控制面板的接口,已经被废弃了快两年。

他根本没想到,有人能通过那个接口上传文件。

林语打开隔离区,查看那个PHP文件的文件名:

“blackcat_rat.php”

他愣了一下,然后搜索这个文件名。

搜索结果让他倒吸一口凉气——blackcat_rat,是一个专门针对IDC行业的远程管理木马。它可以通过WebShell控制服务器,窃取用户数据、控制主机。

他打开那个木马文件,看到一段注释:

“// 感谢雨云提供完美的试验场。
// 漏洞因你而生,因我而灭。
// —— BlackCat”

林语的呼吸急促起来。

他打开日志,开始追踪上传者的IP地址。

日志显示,上传者使用了多层代理,最后的IP地址指向了香港数据中心的同一个机房。

和之前大魔王的IP,一模一样。

“操。”林语骂了一声。

他打开搬砖狐的聊天窗口,打了一行字:

“狐狸,帮我查一件事。”

“你说。”

“blackcat_rat这个木马,你听说过吗?”

搬砖狐立刻回了一个震惊的表情:

“你怎么知道这个木马?”

“我的服务器里,发现了它的文件。”

搬砖狐沉默了几秒,然后说:

“林语,你摊上大事了。”

“什么意思?”

“blackcat_rat是一个专门针对IDC行业的高级木马,据说由某个顶级安全团队开发。它的渗透能力极强,能穿透主流的所有安全防线。目前,国内已知被它入侵的IDC不少于20家。”

林语脑子里嗡了一声。

他紧握着鼠标,心里只有一个念头:

“原来,大魔王只是小喽啰。”

“真正的大鱼——早就进来了。”

第16章 黑猫的印记

凌晨两点四十分,林语的宿舍只剩下键盘敲击声。

屏幕上,那个被隔离的PHP文件静静地躺在沙盒目录里。林语没有直接打开它——他知道这种高级木马通常自带触发机制,一旦执行就可能激活反制措施。

他先检查了服务器上的所有进程。

没有异常。

他检查了所有监听的端口。

也没有异常。

他检查了所有登录日志。

依然没有异常。

这太干净了。

林语记得大二时选修过一门网络安全课程,教授说过一句话:“如果一个系统看起来毫无破绽,那往往意味着攻击者已经在你察觉不到的地方待了很久。”

BlackCat_RAT这个名字,他从来没听过。但能让搬砖狐都露出惊愕表情的东西,绝对不会是小角色。

林语打开搬砖狐的聊天窗口:

“狐狸,把这个木马的所有资料发给我。”

“等一下。”搬砖狐回复得很快,“我在翻我的资料库。”

三分钟后,她发来一个压缩包。

林语解压,里面是一份PDF文档、几张截图、和一段日志。

PDF的标题是:《BlackCat_RAT:一场针对中国IDC行业的隐形战争》。

林语快速浏览起来。

文档的第一页写道:

“BlackCat_RAT(黑猫远程管理工具)最早出现在2020年3月。该木马由未知安全团队开发,专门针对中国境内的IDC、云计算、和CDN服务商。

传播方式:

  1. 通过IDC服务商系统漏洞上传WebShell。
  2. 利用弱口令SSH/RDP暴力破解。
  3. 通过内部人员植入——已有案例表明,攻击者会以‘技术合作’为名接触中小型IDC的目标人员。

功能:

  1. 窃取用户数据(包括但不限于密码、密钥、证书、数据库)。
  2. 植入后门,控制服务器。
  3. 横向渗透,感染同一机房的其他服务器。
  4. 远程执行任意命令。
  5. 自毁——一旦被发现,自动删除所有痕迹并触发IP扫描反制。

已知受害者(截至2020年8月):

  1. 蓝云(2020年4月,数据泄露,用户信息被公开)
  2. 星辰网络(2020年6月,服务器遭劫持,大量网站被黑)
  3. 云帆数据(2020年7月,SSH密钥被盗,公司被迫更换所有服务器)
  4. ……”

林语越看越心惊。

名单上的IDC,都是过去半年内出过事的。

蓝云直接关门了。星辰网络损失惨重。云帆数据更换了全部300台服务器。

而所有人,都没有找到真正的幕后黑手。

林语继续往下翻。

文档最后一张截图,是某个论坛的帖子截图:

帖子主题:《你们IDC还在用老版本面板?不,你们已经凉了。》

发帖人ID:BlackCat

帖子的内容只有一句话:

“漏洞因你而生,因我而灭。不谢。”

和他在木马文件里看到的那句注释,一模一样。

林语放下手机,靠在椅子上,深深吸了一口气。

他知道自己摊上事了。

不是普通的羊毛党,不是星云那种低级的商业竞争——这是真正的职业黑客。

对方的目标,不是薅羊毛,而是控制雨云。

他想干什么?

林语开始整理思路。

首先,那个废弃API接口。

他大一写的代码,用的是最原始的PHP框架,没有任何安全防护。那个接口只用于控制面板测试,后来被新版本取代后就废弃了。

但林语记得,他当初删除时,只在前端隐藏了入口,并没有关闭API的路由规则。

也就是说,只要知道那个接口的完整路径,任何人都能直接调用。

对方是怎么找到它的?

林语翻看服务器日志。

他发现,早在八个月前——也就是雨云刚上线VPS产品那会儿——就有人通过那个接口上传了一个探针文件。

探针文件很小,只有3KB,内容是获取服务器环境信息和路径结构。

那之后,对方就一直在潜伏。

他查看了所有上传记录——对方在八个月内,通过那个废弃API上传了至少20个文件。每个文件都很小,只占用几KB的磁盘空间,而且命名都很自然,看起来像是系统缓存文件。

林语忍不住骂了一声:“操。”

他明白了。

对方从雨云上线VPS的第一天起,就已经在里面了。

他打开那个废弃API的日志,逐条分析。

他发现,上传的频率和时机非常精准——每次都是在雨云系统升级、维护、或者新功能上线的时候。因为那时候,林语会放宽安全策略,方便自己测试。

对方利用这个时机,悄悄上传了木马。

而且,对方的操作非常谨慎——每次上传后,都会立刻清除自己的登录日志。

但有一个地方,他没清理干净。

林语发现,对方在上传最后一个文件——也就是BlackCat_RAT的母体——之前,曾登录过一个备用API接口。

那个备用接口,林语只在本地测试时用过。他从来没有把它暴露在外网。

对方是怎么知道的?

林语脑子里突然冒出一个念头:“他不会是看着我的屏幕操作吧?”

他立刻检查自己的开发电脑,检查所有后台进程、网络连接、登录记录。

没有异常。

但他不敢掉以轻心。

林语拨通了一个电话。

电话那头传来搬砖狐的声音:“怎么了?”

“狐狸,你帮我查一下,BlackCat这个ID的注册信息,包括所有绑定过的邮箱、手机号、社交账号。”

“你怀疑他盯上了你的电脑?”

“不是怀疑,是确定。他用了我从未暴露的备用接口,这只有亲眼看到我操作的人才能做到。”

搬砖狐沉默了几秒:“你的意思是,他的渗透目标不只是雨云的服务器,还包括你的开发环境?”

“对。”

“操。”搬砖狐第一次骂粗口,“林语,你先把那台开发电脑断网。”

“已经断了。”

“好。我两小时内给你结果。”

林语挂断电话,看着面前断网的开发电脑。

他已经把系统盘拆下来了,准备做一次完整的数据镜像。

然后,他开始检查宿舍的网络设备。

路由器、交换机、网线——他用放大镜仔细检查,没有发现异常。

但他还是不放心。

林语给小宏打了个电话。

“喂,林语?”小宏的声音带着睡意,“大半夜的怎么了?”

“小宏,你现在帮我去楼下网吧,用陌生电脑登录雨云后台,帮我关掉所有临时API接口。”

“啊?为什么?”

“别问,照做。快。”

“行行行。”

五分钟后,小宏发来消息:“搞定,全部关掉了。”

林语说:“你帮我盯着后台,所有异常登录、异常操作,立刻通知我。”

“明白。”

林语挂断电话,重新连网。

他登录雨云后台,查看服务器的防火墙规则。

然后,他看到了一个问题。

他之前写过的一条防火墙规则,是用来屏蔽特定端口的。但那条规则的生效范围,是“所有IP”。

也就是说,任何人都可以通过某些端口访问服务器。

林语立刻修改规则,只允许指定IP访问。

然后,他检查了所有服务器的SSH登录记录——发现至少有五台服务器,在过去的三个月里,都被同一个IP尝试过暴力破解。

那个IP,来自香港数据中心。

林语冷笑一声。

他开始反向追踪那个IP。

他首先获取了IP的所有者信息——香港阿里云ECS,账号注册时间是2020年2月。

然后,他获取了那个账号的登录日志——发现该账号在过去的八个月里,登录过至少50台服务器。其中,有20台是雨云的。

林语将这些服务器的日志逐一对比,发现了一个规律:

每次攻击者登录雨云服务器,都会先检查系统版本,然后检查控制面板版本。如果版本是最新的,他就会放弃攻击;如果版本是旧的,他就会上传木马。

这个规律,说明对方是在找“漏洞”。

林语继续分析。

他通过搬砖狐提供的BlackCat论坛帖子,找到了对方的发帖记录。

他发现,BlackCat在论坛上发过至少50个帖子。这些帖子,大部分是水帖,看似无关紧要。但林语发现,每个帖子都包含了一个隐藏的信息——某个IDC的漏洞描述。

比如,有一个帖子说:“蓝云面板的登录页面,好像有点卡。”

这句话看起来很正常。

但林语知道,蓝云面板的登录页面确实卡——那是因为它用的是未Session的验证机制,每次登录都需要重新验证。

而那个漏洞,正是BlueCat用来入侵蓝云的突破口。

林语深吸一口气。

他打开那个论坛,用自己的小号注册账号,然后搜索BlackCat的所有帖子。

他很快发现,BlackCat在三个月前,曾经回复过一个关于雨云的帖子。

帖子是一个用户发的:

“雨云的新控制面板挺好看的,但是感觉功能有点少。”

BlackCat的回复只有四个字:

“慢慢来嘛。”

这个回复,林语看过。

但当时他没在意。

现在,他明白了。

那四个字,是一个信号。

林语打开雨云控制面板的访问日志,检索BlackCat的IP。

他找到了。

五个月前,有一个IP访问了雨云控制面板的旧版API。

那个API,就是废弃的接口。

林语顺着这个IP继续追溯,发现它属于一个在广东佛山注册的阿里云账号。

佛山的IP。

林语的出生地。

他心里一紧。

林语立刻联系搬砖狐:“狐狸,帮我查一下佛山的这个IP,注册信息是什么。”

一分钟后,搬砖狐回复:

“IP: 120.xxx.xxx.xxx,阿里云ECS,注册时间是2019年12月,注册人姓名:林语,注册电话:你的旧手机号,注册邮箱:你的QQ邮箱。”

林语愣在原地。

他拿着手机的右手,开始发抖。

不可能。

他从来没有在阿里云注册过账号。

更不可能用佛山IP开服务器。

林语立刻打开那个账号的详细信息,发现创建时间是2019年12月——那时雨云刚上线,他还住在学校宿舍。

他用的是旧手机号——那个号码,他在大一开学时就注销了。

但账号的认证信息,确实是他的。

林语的脑子里飞速运转:有人盗用了他的身份信息,用他的手机号和邮箱注册了阿里云账号,然后用那个账号在香港开了一台ECS,作为跳板机。

也就是说,攻击者从一开始就有他信息的访问权限。

他想起,大一的时候,他曾在学校的一个公共电脑上注册过阿里云学生认证。

那个电脑,可能被植入了键盘记录器。

林语骂了一声,一拳砸在桌子上。

他用力得让手指都红了,但他没有停下来。

“冷静,冷静。稳步推进,不要捉急。”他对自己说。

他重新整理思绪。

现在,他已经确定了:攻击者有他的身份信息,潜伏在雨云里快半年,目标是渗透控制所有服务器。

那攻击者的下一步,会是什么?

林语开始模拟攻击者的思维。

对方已经潜伏那么久,不会轻易暴露。

但现在,BlackCat木马被发现了,他一定会想办法销毁证据,然后撤离。

但撤离之前,他可能还会做一件事——

植入最后的“爆炸装置”。

林语立刻检查所有服务器的计划任务。

他找到了。

有十台服务器上,存在一个隐藏的计划任务。这个任务每隔一小时启动一次,检查某个URL是否存在。如果URL不存在,则自动执行一个脚本。

林语打开那个脚本,看到一句话:

“echo ‘BlackCat was here.’”

这是一个“死亡开关”。

如果林语封堵了那个URL——也就是封堵了攻击者的通信渠道——脚本就会执行,在所有服务器上留下标记。

林语没有删除这个计划任务。他知道,一旦删除,就会触发对方的警报。

他选择了“隔离”——把所有受影响的服务器,都移到了独立的VLAN中。然后,关闭那些服务器对外网的访问,只允许内网通信。

做完这些,已经是凌晨四点。

林语看着屏幕上的日志,开始拼凑攻击者的行动轨迹。

从八个月前开始,攻击者通过废弃API上传了探针。

然后,每当他更新系统,攻击者就会利用窗口期上传新的文件。

最后,在四十小时前——也就是大魔王被曝光后——攻击者上传了BlackCat木马。

这说明,攻击者可能一直盯着大魔王的行动。

他就像一个黑客版的“保险丝”,专门在目标发现小问题时暴露自己,然后在大危机时悄悄撤离。

林语打开那个木马的日志,发现BlackCat木马上传后,曾经尝试过以下操作:

  1. 扫描局域网内的其他服务器(寻找弱点)。
  2. 尝试连接外部C2服务器(命令与控制中心)。
  3. 窃取SSH密钥(横向渗透)。

但所有操作,都被林语的防火墙规则拦截了。

这是因为,林语之前在大魔王事件后,封堵了大部分外网访问。

也就是说,那个木马,还没来得及发挥作用,就被发现了。

林语松了一口气。

但转念一想,又紧张起来——如果他没有封堵外网,对方很可能已经控制了他所有服务器。

林语打开搬砖狐的聊天窗口:“狐狸,BlackCat木马的C2服务器地址是什么?”

“文档里有,但我建议你不要直接攻击。对方的C2服务器可能在境外,而且有反制机制。”

“我知道。我只是想确认一下。”

林语打开文档,找到C2服务器地址。

它指向一个域名:blackcat-c2.xyz。

林语查询这个域名的注册信息——注册者是“Wang Xiaoming”,注册邮箱是“wangxiaoming@protonmail.com”,注册时间是2020年1月。

林语把这个信息发给搬砖狐:“帮我查查这个邮箱。”

一分钟后,搬砖狐回复:

“查不到。ProtonMail的邮箱,无法获取注册者信息。但和BlackCat论坛注册使用的邮箱一致。”

林语思考了片刻,说:“你能查到BlackCat论坛上,这个ID最后一次登录的IP吗?”

“能,但需要时间。论坛的登录日志只保留最近三个月。”

“那就查最近三个月的。”

“好。”

五分钟后,搬砖狐发来一个IP地址:

“103.xxx.xxx.xxx —— 中国香港,Hetzner。”

林语记下这个IP,然后开始反向扫描。

他发现,这个IP在过去三个月里,至少登录过20个IDC论坛,发布了至少100条帖子。

这些帖子的内容,大多是吹水、水帖、或者模棱两可的技术讨论。

但林语注意到一个规律——BlackCat每次都出现在一个新注册IDC的帖子下。

他的回复,通常都是四个字:“慢慢来嘛。”

林语骂了一声:“操,原来他是‘开业庆’收割机。”

林语把这些帖子全部截图,保存下来,作为证据。

然后,他打开了雨云的日志,开始最后一项工作——检查所有用户的数据。

如果BlackCat曾经窃取过用户数据,那他必须知道。

他检查了所有数据库的访问日志——没有异常的查询记录。

他检查了所有文件服务器的访问日志——没有异常的下载记录。

所有用户数据,都完好无损。

林语长长地松了一口气。

但他没有完全放心——他已经学会了,永远不要在沉默中找到安全感。

凌晨五点,林语把那台被封禁的Windows测试机开机,开始检查硬盘镜像。

他用了整整两个小时,手动检查镜像里的每一个文件。

终于,他在一个不起眼的系统文件夹里,发现了一个隐藏的文本文件。

文件名:note.txt

文件内容只有一句话:

“林总,你的代码写得不错。只是漏洞太多。

—— BlackCat”

林语手里拿着鼠标,盯着屏幕看了好久。

他没回话,没骂人,没叹气。

他只是默默地保存了这个文件,然后在自己的笔记本上写下一行:

“猎物已标记。下面,是猎人的回合。”


清晨六点半,搬砖狐发来一条消息。

“林语,我刚才又查了一下那个C2服务器。它的证书使用的是Let‘s Encrypt,签发给了一个叫‘xingyun admin’的邮箱。”

“星云的邮箱?”

“对。但我不确定这个邮箱是不是真的,可能是被冒用的。”

林语的心跳猛地加速。

“星云竟然和BlackCat有关?”他脑子里冒出一个念头。

如果真是这样,那这件事就从商业竞争升级成了刑事犯罪。

林语把这条线索记下来,然后说:“狐狸,你把所有证据打包,发我一份。”

“好。你打算怎么做?”

“先等等。我需要确认这个邮箱是不是真的属于星云。”

“怎么确认?”

“直接打电话问。”

林语拨通了星云客服电话。

“喂,您好,星云IDC客服中心,请问有什么可以帮您?”

“你好,请问你们的技术部黑猫在吗?”

电话那头沉默了两秒:“黑猫?我们公司没有叫黑猫的。”

“不对吧,我一个朋友说,他认识一个叫黑猫的,是你们技术部的。”

“先生,我确实不知道这个人在不在我们公司。您能提供他的全名吗?”

林语随便编了一个名字:“叫王小明。”

“先生,我们技术部没有叫王小明的人。您是不是记错了?”

“可能是我记错了。那我再问问。”

林语挂断电话,把刚才的对话录下来。

他转头对搬砖狐说:“客服否认了黑猫的存在。但他们的反应很快,说明他们可能对这个名字不陌生。”

“那你要不要在群里问一下?”

“不。我先等联盟的调查结果。”


上午九点,林语走出宿舍。

他站在宿舍楼下,看着灰蒙蒙的天空,深呼吸了几口。

昨晚的经历,让他感到前所未有的疲惫。

但他知道,自己必须保持清醒。

他走到食堂,点了一碗米粉,加了两个卤蛋。

坐下来后,他打开手机,看到用户群里有@他的消息。

“林老板,昨晚又通宵了?”

林语回复:“昨晚打到现在,刺激。”

群里立刻有人回复:“林老板辛苦了,注意身体。”

“我等会还要干活,先去补个觉。”

“林老板晚安。”

林语笑了笑,放下手机,继续吃粉。

吃完粉后,他回宿舍洗了个澡,然后躺在床上。

但他没有睡。

他打开笔记本,继续分析BlackCat的行动轨迹。

他发现,BlackCat在潜伏的五个月里,曾经试过两次横向渗透——就是通过已经被控制的服务器,去攻击其他服务器。

第一次,是在两个月前。BlackCat利用一台被控服务器,尝试连接另一台雨云服务器。但那台服务器的防火墙规则很严格,拦截了连接。

第二次,是在一周前。BlackCat用相同的方法尝试连接另一台服务器,结果也被拦截了。

林语看着这些记录,忍不住笑了笑。

“防火墙立大功了。”他想。

然后他开始总结BlackCat的弱点。

  1. 他太依赖信息差——以为林语不知道那个废弃API的存在。
  2. 他太骄傲——在木马文件里留下自己名字的注释。
  3. 他太慢——每次都等林语更新系统后才行动,失去了先机。

林语把自己的分析发给搬砖狐。

搬砖狐回复:“你的意思是,BlackCat不是顶级黑客?”

“不。他是顶级黑客,但他犯了一个错误——他没想到我会在雨云早期就上线防火墙规则。”

“所以,你的防火墙规则救了你?”

“算是吧。”

“那你运气真好。”

林语笑了笑,没有回答。

他知道,运气只是一部分。

真正帮助他的,是他从雨云第一天开始就坚持的一个原则:“安全第一,功能第二。”

正是这个看似保守的原则,在昨晚救了他。


中午十二点,林语被手机铃声吵醒。

他看了一眼来电显示——是IDC行业联盟的群主,清风明月。

林语接通电话:“喂,林老板。”

“清风明月,有事?”

“联盟的调查结果出来了。星云确实和那些水军有关,但和BlackCat无关。”

“确认了?”

“确认了。我们查了星云技术部的所有员工名单,没有任何一个人叫‘黑猫’或者‘王小明’。”

“那个邮箱呢?”

“那个邮箱确实是星云的内部邮箱,但已经被废弃很久了。我们查到,这个邮箱在半年前被一个未知黑客入侵过。”

“半年前?”

“对。说明BlackCat在星云内部也有人,或者至少掌握了他们的一些信息。”

林语沉默了片刻:“那你们打算怎么处理星云?”

“踢出联盟,拉黑名单。你可以在群里宣布结果。”

“好。谢谢。”

林语挂断电话,打开用户群,发了一条消息:

“各位,联盟的调查结果出来了:星云确实和水军有关,已确认踢出联盟。但我之前提到的BlackCat木马,和星云无关。”

“有人问我,BlackCat到底是谁?我只能说,他是一个手法极其成熟的职业黑客。他潜伏在雨云里大半年,用废弃API上传了木马。幸运的是,我们的防火墙规则挡住了他的渗透。”

“现在,我已经把相关证据提交给了网安。希望大家放心,雨云将继续加强安全防护。”

“最后,我想说一句话:不是所有漏洞都来自技术水平,有些漏洞来自管理失误。感谢BlackCat让我真正意识到这一点。”

群里一片沉默。

然后,风之旅人回复了一句:“林老板,你是真牛逼。”

林语笑了笑,关掉手机。

他长长地呼了一口气,躺在床上,看着天花板。

昨晚的经历,让他真正成长了。

他不再是一个靠运气活下来的小白。

他已经学会如何在黑暗中寻找光明。


下午三点,林语搬回宿舍,重新连网。

他打开后台,检查服务器的运行情况——一切正常。

然后,他打开那台被隔离的Windows测试机,继续分析BlackCat木马的源码。

他发现,这个木马的结构非常精妙。它通过注册系统服务实现持久化,通过加密通信隐藏流量,通过内存加载避免磁盘痕迹。

能写出这种木马的人,一定是行家。

林语把这个木马的结构记录下来,然后写了一个分析报告,准备发给网安。

同时,他还在木马的源码中,发现了一段注释:

“// 这个功能还没实现,先放着。
// 等林老板上线新功能后再调整。”

林语忍不住笑了。

原来,BlackCat一直在等他更新。

他想起BlackCat回复他的那句话:“慢慢来嘛。”

原来,那话里有话。


傍晚六点,林语收到了网安的回复:

“林先生,您提交的BlackCat木马分析报告已经收到。我们正在对这些木马进行技术分析,并开始反向追踪它的开发者。如果有进展,会第一时间通知您。”

林语看着这条回复,心里一块石头落地了。

他知道,网安已经介入,这件事不再是他的孤军奋战。

他打开搬砖狐的聊天窗口:“狐狸,谢了。”

“不客气。”

“等雨云搞大了,我请你吃满汉全席。”

“吃不了那么多。”

“那酸菜鱼多点辣。”

“行。记住你的承诺了。”

林语发了一个微笑的表情:“永远记得。”


晚上九点,林语站在阳台上,望着远处的广州CBD。

夜色已深,灯光璀璨。

他想到,再过两年,他应该就能去那些高楼里上班了。

但现在,他还得在宿舍里守着十几台服务器。

林语深吸一口气,然后轻轻地笑了。

“稳步推进,不要捉急。”他对自己说。

然后,他转身回屋,继续写他的雨云。

他要在那里,建起属于他自己的高楼。


晚上十一点,林语正在写Go代码,突然手机震动了。

他打开一看——是搬砖狐发来的一张截图。

截图内容是BlackCat论坛上,一个ID名为“BlackCat”的用户发布的最新帖子:

“服务器坏了,我又回来了。”

“上次的礼物,林老板喜欢吗?”

“没劲,下次换个玩法。”

林语看完截图,放下手机,冷笑了一声。

他打开那个论坛,回复了一个字:

“来。”


凌晨一点,林语关灯睡觉前,又看了一下后台日志。

一切正常。

但他注意到了一个小小的异常——有一个IP,在过去三个小时里,连续访问了雨云官网的“关于我们”页面一百多次。

那个IP,来自佛山市。

林语笑了笑,关掉笔记本,安心地闭上了眼睛。

他知道,对方还在。

他也知道,自己也在。

下一局,他一定会赢。