老齐推门进来时,手里那张打印纸被他捏出了卷。他脸上没笑,眼睛却亮,那种憋着又憋不住的亮,刘南生在赵凯脸上见过一模一样的。
“过了。”他把纸拍在桌上,“零点到现在,十一万七千。日活,破百万了。”
刘南生捏圆珠笔的手顿住。纸上他刚画了一半的小格子停在当间。活动还没正式推,只是一轮内部灰度测试——这个数字来得太快了。
“充值通道呢?”
“还没开。按排期,明天上午十点。”
刘南生想了想:“不等明天。今晚就切。全部充值,走深付通,唯一入口。”
老齐愣了一下:“刘总,移动那边的计费通道,存量还有八十万预充值……”
“留一个就够了。”刘南生放下笔,“从现在起,用户花进来的每一分钱,都要从咱们自己账上过一遍。”他顿了顿,“首充礼包也提前上,跟运营说,今天晚上就发。”
老齐没再问。转身往外走,走了两步又回头:“网关扛得住吗?”
“你先试。扛不住,我明天去机柜里打地铺。”
那天晚上八点,深付通的网关日志像被人拧开了水龙头。
刘南生没回家。深蓝色笔记本摊在桌上,“深付通”三个字下面他记了一串数:十九点流水是日间三倍,二十点六倍。他后来在笔记本上补了一行:二十一点,网关请求数超过压测上限的三倍——还没爆。程远那套三页面确认的极简流程,把每一步的等待都压进了毫秒级。这不是运气,是之前两个月一遍遍压出来的余量。
八点半,苏小暖端了盒饭进来,说实时流水已经压过昨天全天,客服部电话快被问充值的用户打爆了。
她放下盒饭,眼睛弯着:“首充礼包一挂出去,五分钟冲上来三千多单。”
“你去帮客服盯一眼投诉单。”刘南生说,“有异常,第一时间叫我。”
苏小暖点头走了。盒饭的盖子没揭开,油烟气隔着塑料纸,慢慢地飘上来。客服部的工位离机房隔着一道玻璃。苏小暖出去的时候,刘南生听见玻璃那头的声音——电话铃声此起彼伏,有个客服妹子提高嗓门喊:“先生您别急,充值成功您稍等三分钟,道具马上到。”又有一个声音压低了,像在安抚谁。他收回目光,把盒饭盖子揭开,扒了两口。饭是凉的,菜是甜的,他吃不出味道,只把该咽的咽了下去。
九点十四分,机房方向的门被撞开。老齐三步并两步进来,声音发紧:“刘总——出事了。”
刘南生抬头。老齐脸色几乎是白的。
“有用户投诉,扣款了,道具没到账。”他喉咙动了一下,“不是一两个。四十分钟,四十七起。还在涨。”
刘南生手一撑桌沿站起来,口袋里的烟盒纸硌了一下掌心。“走,去机房。”
他进门的时候,空调正对着机柜吹,冷风从裤腿往上钻,后背却全是汗。机柜侧面贴着两张值班表,笔迹不同,日期排到下周——今晚本该是两个人轮班,现在挤进来七八个。
机房里的空气是热的——服务器排出的热风混着机柜塑料的焦味,空调出风口呼呼吹着十六度的凉气,角落里的温度计还顶着三十三。八九个人挤在两排显示器前,键盘声噼里啪啦,没有人抬头。
老齐拨开两个人,指着一块屏:“刘总,你看这单。”
一条订单日志:支付成功,深付通已确认。游戏侧,道具发放失败,用户钱包余额为零。
“不是余额问题。是支付确认之后,游戏服务器没收到回调。”老齐又点了两下,“但怪的是——这单回调其实到了,只是晚了两分钟。游戏侧判定超时,把订单丢了。”
“有个单更怪。”旁边一个技术员插嘴,声音发干,“二十一点零二分十五秒,游戏侧收到了回调确认。但这个订单,支付完成时间是零二分十七秒。”
回调比支付早了整整两秒。
两秒够什么?够一个程序在收到回调后,先查一遍道具库存,再写一条发放记录。够一个写脚本的人,把这一单的痕迹,从订单流水里抹干净。刘南生盯着那两行日志,后脖颈的汗毛立了起来。“这单是伪造的。”
机房里静了一秒。
“骗过签名验证了?”老齐的声音都变了。
“那不重要。”刘南生说,“把这两分钟内的回调单子全拉出来。”
技术员的手在键盘上飞快地跳。十几秒后,屏幕上滚出来七十三单——每一单的支付时间都晚于回调到达时间。
“全是同一件道具。”技术员说,“首充礼包那个限量时装。”
“签名验证都是过的?”
“都是过的。”
老齐的脸彻底白了。“按一单一件,七十三件,货已经出去了。要是再早半小时……”
“先关。”刘南生打断他,“支付入口,网关层断开,十分钟。已经进来的真订单全部放行,伪造单骗走的道具,冻结回收。真金白银买了的,照发;赔的钱,从我账上过。”
老齐看着他,想说什么,最后只点了头。技术员的手已经在键盘上敲开——一串命令下去,屏幕上的实时流水数字猛地顿住,然后,锐减为零。
机房里的风扇声忽然显得很大。
刘南生没走。他拉开主机房最里边那把椅子坐下,把烟盒纸从口袋里掏出来看了一眼,又塞回去。
“重放攻击。”他忽然说。
老齐正盯着日志的手指顿住:“什么?”
“同一张电影票,拿进放映厅看两回。”刘南生说,“第一回正常,第二回是偷的。黑产拿别人支付成功的回执,重复打给游戏服务器——签名验得没错,系统就认了。”
“可签名从哪泄露的?”老齐声音压低了。
“这个问题,等补完漏洞咱们再对。”刘南生看向他,“先换密钥。现存全部作废重签。校验端加时间戳和一次性流水号——同一张回执,最多用一次。”
老齐张了张嘴:“那是全套改造……”
“两小时。”刘南生说,“你们搞,我坐这儿。搞完我验收。这一仗打赢了,这个月所有人双薪,我请客。”
他拿起桌上的座机听筒,拨了一个号:“是我。今晚深付通停两小时支付,下半夜恢复。明天客服话术我让苏小暖发你,用户问起来,就说是系统升级。”
电话那头说了句什么。刘南生嗯了一声,挂了。
机房里没人说话,只有键盘声重新响起来,密得像雨点。老齐把外套脱了搭在机柜上,袖口挽到肘弯,蹲在交换机前面,一根一根地看线。有人在角落里打电话,声音压得很低,是给家里报平安——“今晚不回了,别等。”
凌晨十一点四十分,老齐从工位深处站起来,手在发抖:“通了。带时间戳和流水号的新校验,第一批压测跑完了,回调全部吻合。”
“冻结的黑产账户呢?”
“查出来十七个,全锁了,余额一分没动。”老齐把屏幕转过来对着他,“从发道具到转卖,中间过了三道手。最快明天中午,消息能传到圈子里去。”
刘南生看着那串被冻结的账户名单,没说话。两个小时,这是深付通给自己争回来的窗口。也是他给黑产界立的一条规矩——这儿的钱,不是那么好咬的。
他刚要开口,电脑右下角一只企鹅头像跳了起来。
刘南生点开。头像是灰色的,签名栏空着,昵称只有两个字:补天客。
他记得这个名字。华南最早的黑客论坛里,这人替人堵过好几次漏洞,从不收钱。
私信只有两行字。“老哥,今晚有人在暗盘挂帖,卖你们深付通的漏洞。不是今天这种重放——是能直接改交易金额的零日。截图我发你了。”
第二行:“小心你们自己的密钥库。从内往外查。”
刘南生的拇指悬在键盘上方,停了三秒。他转过头,机房深处的机柜指示灯红绿交错,一排排跳着,规则而密集。那寂静像一根绷紧的弦。
“老齐。”他开口,声音不高,但每个字都稳,“密钥库的权限记录,从建库那天起,全部调出来。”
“现在就查吗?”
“现在。”刘南生说,“先从今天接触过生产密钥的人开始。查完,到我办公室来,一个一个过。”