全文仅供娱乐,如有任何不当之处,立马修改/删除
小说内容仅为虚构,请勿当真
买云请上雨云,便宜稳定性价比高,专属五折优惠码: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密码。
- 用户问:我的VPS打不开了,怎么办?
回复标准:您好,请先确认您的IP是否被封或是否欠费。如果IP被封,请联系我们换IP(收费)。如果欠费,请充值后系统会自动恢复。
- 用户问:VPS能不能退款?
回复标准:您好,VPS为虚拟商品,开通后如需退款,扣除已使用时间的费用后退还余额(不退现金)。
- 用户问:网站被攻击了怎么办?
回复标准:您好,如果是DDOS攻击,我们有基础防御(5Gbps),超过后VPS会被黑洞处理。建议开启CDN或购买更高防御。
- 用户问:能不能自定义ISO?
回复标准:您好,暂时不支持自定义ISO。我们提供常用系统镜像(CentOS、Ubuntu、Debian、Windows等)。”
林语写完后,把模板发给了小宏。
“小宏,你看看这个。以后群里有人问这些问题,你就按照模板回复。”
小宏接过手机,看了一遍,点头道:“好,我记住了。”
“还有一些情况,如果用户的问题模板里没有,你就转给我。”
“行。”
林语想了想,又说道:“对了,你回复的时候,语气要温和一点。不要让人家觉得你是机器人。”
小宏笑了:“放心吧,我平时在群里吹水,也挺会聊天的。”
“那就好。”
中午,林语跟小宏去食堂吃饭。
路上,小宏突然问:“林语,你这个雨云,以后真能赚钱吗?”
林语愣了一下:“怎么突然问这个?”
“我就是好奇。你看学校那些创新创业项目,哪个不是搞什么AI啊、大数据啊、区块链啊。你这个就是……卖服务器?听起来挺土的。”
林语笑了:“卖服务器确实不洋气,但它是刚需。任何一个网站、一个APP、一个游戏,都需要服务器。只要互联网还存在,服务器就会一直有人需要。”
“所以……你觉得你这个小厂能做大?”
“不是觉得,是一定。”
林语说这句话的时候,语气很肯定。
小宏看着他,沉默了几秒,然后说道:“好。那我跟着你干。”
林语拍了拍他的肩膀:“放心,我不会让你吃亏的。”
晚上,林语回到宿舍,打开电脑,开始开发“雨云管家”。
这是他早就想做的一个功能——把控制面板里常用的操作封装成一个桌面客户端,让用户可以在自己的电脑上直接管理服务器,不用每次打开网页。
当然,这个“雨云管家”只是一个简单的客户端,核心功能只有三个:
- 查看服务器状态(CPU、内存、带宽)。
- 重启/关机/重装系统。
- 查看工单进度。
林语打算用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地址登录了这三台机器,并且上传了同一个脚本。
林语截下了所有证据——包括登录日志、脚本文件、聊天记录。然后,他开始整理这些证据,编成了一个完整的证据链。
证据链包括:
- 阿豪(大魔王)的注册信息和IP地址。
- 阿豪的聊天记录——他主动联系风之旅人,表示可以“帮助加固服务器”。
- 阿豪登录蜜罐服务器的日志——他检查系统版本和软件列表,上传挖矿脚本。
- 阿豪部署的挖矿脚本——MD5值被标记为“星云定制版”。
- 阿豪的操作习惯——他喜欢拉踩雨云,推销星云的机器。
林语把这些证据打包成一个压缩文件,然后发到了用户群。
群里顿时炸了:
“操,还真是同行派来的水军!”
“星云臭不要脸!”
“林老板,直接报警吧!”
“证据都这么齐全了,网安的人应该会管。”
林语发了一条消息:
“各位,证据我已经整理好了。接下来,我会把这份证据提交给网安和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服务商。
传播方式:
- 通过IDC服务商系统漏洞上传WebShell。
- 利用弱口令SSH/RDP暴力破解。
- 通过内部人员植入——已有案例表明,攻击者会以‘技术合作’为名接触中小型IDC的目标人员。
功能:
- 窃取用户数据(包括但不限于密码、密钥、证书、数据库)。
- 植入后门,控制服务器。
- 横向渗透,感染同一机房的其他服务器。
- 远程执行任意命令。
- 自毁——一旦被发现,自动删除所有痕迹并触发IP扫描反制。
已知受害者(截至2020年8月):
- 蓝云(2020年4月,数据泄露,用户信息被公开)
- 星辰网络(2020年6月,服务器遭劫持,大量网站被黑)
- 云帆数据(2020年7月,SSH密钥被盗,公司被迫更换所有服务器)
- ……”
林语越看越心惊。
名单上的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木马上传后,曾经尝试过以下操作:
- 扫描局域网内的其他服务器(寻找弱点)。
- 尝试连接外部C2服务器(命令与控制中心)。
- 窃取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的弱点。
- 他太依赖信息差——以为林语不知道那个废弃API的存在。
- 他太骄傲——在木马文件里留下自己名字的注释。
- 他太慢——每次都等林语更新系统后才行动,失去了先机。
林语把自己的分析发给搬砖狐。
搬砖狐回复:“你的意思是,BlackCat不是顶级黑客?”
“不。他是顶级黑客,但他犯了一个错误——他没想到我会在雨云早期就上线防火墙规则。”
“所以,你的防火墙规则救了你?”
“算是吧。”
“那你运气真好。”
林语笑了笑,没有回答。
他知道,运气只是一部分。
真正帮助他的,是他从雨云第一天开始就坚持的一个原则:“安全第一,功能第二。”
正是这个看似保守的原则,在昨晚救了他。
中午十二点,林语被手机铃声吵醒。
他看了一眼来电显示——是IDC行业联盟的群主,清风明月。
林语接通电话:“喂,林老板。”
“清风明月,有事?”
“联盟的调查结果出来了。星云确实和那些水军有关,但和BlackCat无关。”
“确认了?”
“确认了。我们查了星云技术部的所有员工名单,没有任何一个人叫‘黑猫’或者‘王小明’。”
“那个邮箱呢?”
“那个邮箱确实是星云的内部邮箱,但已经被废弃很久了。我们查到,这个邮箱在半年前被一个未知黑客入侵过。”
“半年前?”
“对。说明BlackCat在星云内部也有人,或者至少掌握了他们的一些信息。”
林语沉默了片刻:“那你们打算怎么处理星云?”
“踢出联盟,拉黑名单。你可以在群里宣布结果。”
“好。谢谢。”
林语挂断电话,打开用户群,发了一条消息:
“各位,联盟的调查结果出来了:星云确实和水军有关,已确认踢出联盟。但我之前提到的BlackCat木马,和星云无关。”
“有人问我,BlackCat到底是谁?我只能说,他是一个手法极其成熟的职业黑客。他潜伏在雨云里大半年,用废弃API上传了木马。幸运的是,我们的防火墙规则挡住了他的渗透。”
“现在,我已经把相关证据提交给了网安。希望大家放心,雨云将继续加强安全防护。”
“最后,我想说一句话:不是所有漏洞都来自技术水平,有些漏洞来自管理失误。感谢BlackCat让我真正意识到这一点。”
群里一片沉默。
然后,风之旅人回复了一句:“林老板,你是真牛逼。”
林语笑了笑,关掉手机。
他长长地呼了一口气,躺在床上,看着天花板。
昨晚的经历,让他真正成长了。
他不再是一个靠运气活下来的小白。
他已经学会如何在黑暗中寻找光明。
下午三点,林语搬回宿舍,重新连网。
他打开后台,检查服务器的运行情况——一切正常。
然后,他打开那台被隔离的Windows测试机,继续分析BlackCat木马的源码。
他发现,这个木马的结构非常精妙。它通过注册系统服务实现持久化,通过加密通信隐藏流量,通过内存加载避免磁盘痕迹。
能写出这种木马的人,一定是行家。
林语把这个木马的结构记录下来,然后写了一个分析报告,准备发给网安。
同时,他还在木马的源码中,发现了一段注释:
“// 这个功能还没实现,先放着。
// 等林老板上线新功能后再调整。”
林语忍不住笑了。
原来,BlackCat一直在等他更新。
他想起BlackCat回复他的那句话:“慢慢来嘛。”
原来,那话里有话。
傍晚六点,林语收到了网安的回复:
“林先生,您提交的BlackCat木马分析报告已经收到。我们正在对这些木马进行技术分析,并开始反向追踪它的开发者。如果有进展,会第一时间通知您。”
林语看着这条回复,心里一块石头落地了。
他知道,网安已经介入,这件事不再是他的孤军奋战。
他打开搬砖狐的聊天窗口:“狐狸,谢了。”
“不客气。”
“等雨云搞大了,我请你吃满汉全席。”
“吃不了那么多。”
“那酸菜鱼多点辣。”
“行。记住你的承诺了。”
林语发了一个微笑的表情:“永远记得。”
晚上九点,林语站在阳台上,望着远处的广州CBD。
夜色已深,灯光璀璨。
他想到,再过两年,他应该就能去那些高楼里上班了。
但现在,他还得在宿舍里守着十几台服务器。
林语深吸一口气,然后轻轻地笑了。
“稳步推进,不要捉急。”他对自己说。
然后,他转身回屋,继续写他的雨云。
他要在那里,建起属于他自己的高楼。
晚上十一点,林语正在写Go代码,突然手机震动了。
他打开一看——是搬砖狐发来的一张截图。
截图内容是BlackCat论坛上,一个ID名为“BlackCat”的用户发布的最新帖子:
“服务器坏了,我又回来了。”
“上次的礼物,林老板喜欢吗?”
“没劲,下次换个玩法。”
林语看完截图,放下手机,冷笑了一声。
他打开那个论坛,回复了一个字:
“来。”
凌晨一点,林语关灯睡觉前,又看了一下后台日志。
一切正常。
但他注意到了一个小小的异常——有一个IP,在过去三个小时里,连续访问了雨云官网的“关于我们”页面一百多次。
那个IP,来自佛山市。
林语笑了笑,关掉笔记本,安心地闭上了眼睛。
他知道,对方还在。
他也知道,自己也在。
下一局,他一定会赢。