第11章 【意外的发现】
黑暗持续了很久。
江伟杰睁开眼时,窗外已经透进灰白的光。
窗帘缝隙漏进的光带比昨夜更窄,也更淡。
远处隐约有车声,是轮胎碾过湿路面的黏稠声响。
他躺着没动,听着自己的呼吸。
床板硬硌着肩胛骨,被褥带着隔夜的潮气。
他坐起来,套上搭在椅背的衬衫。
衬衫领口有些发软,袖口磨得起了毛边。
他走到窗边,拉开窗帘。
外面下着细雨,天空是沉郁的铅灰色。
楼宇的轮廓在雨幕里浸得模糊。
对面楼的窗户大多还暗着,只有零星几扇亮着灯。
厨房的抽油烟机正往外排着白气。
他洗漱,用冷水抹了把脸。
镜子里的人眼皮浮肿,下巴冒了青色胡茬。
他盯着看了几秒,然后移开了视线。
厨房煤气灶打火要多拧两下,蓝色火苗才窜起来。
他烧了壶水,泡了碗昨晚剩下的米饭。
就着半包榨菜吃完。米饭有点硬,榨菜咸得发齁。
出门时雨小了些,变成细密的雨丝。
他没带伞,把衬衫领子竖起来。
低着头径直走进了雨里。
巷子里的积水映着灰白天光,踩上去溅起细小花。
早点摊的油条在锅里翻滚,老板娘拿长筷子翻动。
油香混着雨水的土腥气飘过来。
他没停步,拐出巷口朝公交站走。
站台上人不多,都缩着脖子望车来的方向。
雨水顺着站台顶棚边缘滴下来。
在水泥地上砸出一个个深色圆斑。
车来了,他跟着人群挤上去。
车厢里漫着湿衣服和人体混合的气味。
他抓住头顶的横杆,身体随车身颠簸摇晃。
窗外街景在雨水冲刷下向后流去。
店铺招牌、行道树、红绿灯,都蒙着层水汽。
金银岛公司在江北的一栋写字楼里,占了三层。
他刷卡进门时,前台女孩还没到。
大厅空荡荡的,只有清洁工推着吸尘器。
走廊尽头传来嗡嗡的声响。
他走到自己工位坐下,按下电脑开机键。
屏幕亮起,冷蓝光映着他的脸。
上午的工作是处理客户咨询。
大多是重复问题,关于产品收益、提现流程。
还有关于风险提示的各类疑问。
他机械敲着键盘,给出标准化回复。
窗外雨停了,云层裂开几道缝隙。
漏下几缕稀薄的光,照在桌面文件堆上。
能看见浮尘在光柱里慢慢旋转。
午休时,吴惠健端着饭盒过来,在他对面坐下。
饭盒里是家里带的饭菜,青椒炒肉,米饭压得很实。
“昨晚没睡好?”吴惠健扒了口饭,抬眼看他。
“还行。”江伟杰说,低头吃楼下便利店买的盒饭。
菜有些凉了,油凝结成白色的脂块。
“熊文政昨天打电话,说桥西招协警,问我去不去。”吴惠健嚼着饭,声音含糊。
“你怎么想?”
“不知道。先干着吧。”吴惠健拿筷子戳了戳饭盒里的肉片,“这里好歹是坐办公室。”
江伟杰没接话。办公室窗户开着一条缝。
雨后潮湿的空气涌进来,带着楼下绿化带的土味。
远处传来隐约的施工声,是打桩机沉闷的撞击。
下午,主管拿来一叠新的充值单据,让他录入系统核对。
这是每周的例行工作,核对客户充值金额。
包括银行转账和第三方支付的到账记录。
看和平台后台显示的是否一致。
单据很多,厚厚一摞,用回形针别着。
他一张张翻看,在系统里输入对应订单号和金额。
数字,日期,姓名,银行尾号。屏幕上的表格一行行增加。
手指在键盘上敲击,发出单调的嗒嗒声。
办公室空调开得有点低,他手臂有些发凉。
翻到其中一页时,他的手指顿了一下。
那是一张建设银行的转账凭证复印件。
客户姓李,转账金额是五千元。
转账时间是九月十五日下午三点十七分。
凭证上的银行盖章很清晰。
他按订单号,在平台后台查这笔充值记录。
系统显示,订单到账时间也是九月十五日。
但到账金额是五千零三十元。
多了三十块。
他以为看错了,或是系统显示延迟。
他刷新页面,重新查询。
还是五千零三十元。
他皱了皱眉,拿起那张凭证复印件又仔细看了一遍。
转账金额明确写着“5000.00”。
他又核对银行账号、客户姓名,确认无误。
是后台显示错了?
他点开这笔订单的详细流水记录。
记录显示,充值本金五千元,到账五千元。
但下面还有一行小字:“活动补贴:30.00”。
活动补贴?
最近公司没听说有充值补贴活动。
他往前翻前几天录入的单据。
随机抽了几张建行渠道充值的核对。
金额都对得上,没有多出来的“补贴”。
只有这一笔。
也许是财务搞错了,误操作发了测试奖励?
或是这个客户参与了没公开的内部邀请活动?
他想了想,在内部沟通软件给财务部小陈发消息。
“陈哥,帮忙查下订单号尾数7743的充值。客户李XX,建行转五千元,后台显示到账五千零三十,多了三十元补贴。请问是什么活动?”
消息发出去,显示已读。过了一会儿,小陈回复了。
“什么补贴?没活动啊。我查查。”
又过了几分钟。
“查了银行流水,对方实际转过来就是五千。后台显示多了三十?是不是系统显示bug了?你刷新看看?”
“刷新过了,还是多三十。流水明细里有一行‘活动补贴’。”
“奇怪了……我没操作过。你问问技术部?”
江伟杰又给技术部同事发了消息。
对方回复得很快,说可能是旧促销代码没清干净。
在特定渠道或时间点被意外触发。
给极少数订单加了点“彩头”。
属于历史遗留的显示问题,不影响实际资金。
他们会排查一下。
“哦,好的。”江伟杰回复。
他看了一眼那三十元的数字。
然后按后台显示的五千零三十元录入系统。
在备注栏写了句“系统显示含补贴30,已同步技术部”。
单据被放到“已处理”的那一摞里。
他继续处理下一张。
手指敲击键盘。数字,日期,姓名。屏幕的光映着眼球。
但刚才那三十元的数字,像粒很小的石子。
投进平静的水面,漾开一圈几乎看不见的涟漪。
特定渠道?建行转账。
特定时间?九月十五日下午。
极少数订单?
他处理单据的速度慢了下来。
目光扫过凭证上的转账渠道和时间。
又处理了十几张,都是正常的。
然后,他翻到了另一张。
同样是建设银行。转账时间九月十六日上午十点零五分。
金额八千元。
他查询后台。
到账金额:八千零四十八元。
多了四十八元。
流水明细里,同样有“活动补贴:48.00”。
他盯着屏幕。
心脏在胸腔里,很轻地,咚地跳了一下。
不是显示错误。
他迅速翻回之前处理过的单据。
找出所有建行渠道充值的记录。
一张,两张,三张……时间集中在九月十五到十七日。
他重新一一核对后台到账金额。
五千元,到账五千零三十。
八千元,到账八千零四十八。
一万元,到账一万零六十。
三千元,到账三千零一十八。
数字在他眼前跳动。多出来的金额,精确是充值额的千分之六。
千分之六。
五千的千分之六是三十。八千的是四十八。
一万的是六十。三千的是十八。
完全吻合。
不是随机彩头。不是显示错误。
是一个固定的、千分之六的比例。
他的呼吸屏住了。手指有些发凉。
指尖按在冰凉的鼠标上。
为什么只有建行渠道?为什么是这三天?
技术部说的“旧促销活动代码”……
如果代码逻辑不是简单显示数字呢?
而是真按比例,在用户充值到账时。
额外给账户余额加千分之六的“补贴”?
如果这多出来的钱,用户真的可以提现呢?
这个念头像一道细微的电流,倏地窜过脊椎。
他立刻坐直身体,在系统里找到那笔一万元客户的账户。
账户余额显示是一万零六十元。
他查看该账户的提现记录,最近一次是上周。
提了三千,正常到账。账户没有冻结或异常。
也就是说,这一万零六十元,客户随时可以申请提现。
如果客户提现一万元,平台要从公司账户付一万。
但如果客户提一万零六十元呢?
平台需要付一万零六十。可公司实际只收到一万。
那多出来的六十元,从哪里出?
除非……这个“补贴”只是平台系统的虚拟数字。
当客户提现时,系统只会允许提走本金。
自动忽略或拦截那千分之六的“补贴”?
他需要验证。
验证这个“补贴”是死数字,还是活的可流动的钱。
他看了一眼办公室。其他人都在埋头工作。
键盘声此起彼伏。主管的办公室门关着。
窗外的云散开了些,阳光变得更强烈。
斜射进来,在办公桌隔板上切出明暗交界线。
浮尘在光里疯狂舞动。
他深吸一口气,让表情恢复平静。
然后关掉充值单据处理界面。
打开另一个普通的客户前台页面。
他注册了一个新的测试账号。流程很简单。
手机号,验证码,设置密码。
然后,他尝试用新账号充值。
支付渠道选择里,建设银行排在第三个。
他点击选择。
系统跳转到模拟的支付页面。
因为是测试环境,不需要真连银行网银。
只需要输入模拟的转账金额。
他输入了:100.00。
点击确认。
系统提示:充值成功。金额到账:100.60元。
账户余额那里,数字跳了一下,变成了100.60。
他的喉咙有些发干。
他点击“提现”按钮。输入提现金额:100.60。
系统提示:请输入提现密码。
他设置了初始提现密码。
再次确认。
屏幕中央出现一个转动的圆圈。
“提现申请已提交,预计两小时内到账(测试环境为模拟到账)。”
没有错误提示。没有“补贴部分不可提现”的提示。
流程顺畅得让人心悸。
当然,这是测试环境,钱不会真到银行卡。
但流程逻辑是通的。
系统判定这100.60元都是可提现余额。
如果……这个漏洞在真实线上环境也存在呢?
如果某个旧代码像技术部说的那样没清干净。
依然在后台默默运行。
在某些未被察觉的特定条件组合下。
比如特定银行渠道,特定时间窗口。
就会触发这个千分之六的“赠送”?
而这赠送的金额,被系统认为是合法余额,允许提现?
那么,只要有人用真实银行卡,在漏洞触发期。
通过特定渠道充值,就能立刻得千分之六的额外资金。
并且,可以立即提现。
充值,到账,提现。千分之六的利润。
几乎无风险,资金瞬间周转。
套利。
这个词像一颗烧红的铁钉,猛地楔进他的脑海。
他的手指微微颤抖起来,不是因为冷。
而是因为一种强烈的、混杂着震惊的悸动。
他松开鼠标,手心里积了一层薄汗。
他靠在椅背上,看着屏幕上测试账户的余额。
100.60。那多出来的0.60,在日光灯下。
显得格外清晰,又格外不真实。
窗外的阳光移动了,照到他桌面的笔筒上。
一支中性笔的塑料笔杆反射着刺眼的光点。
办公室里的嘈杂声仿佛退远了。
只剩下他自己有些急促的呼吸声。
还有心脏在耳膜里咚咚的撞击声。
他需要冷静。需要再确认。需要查更多数据。
需要弄清楚漏洞触发的所有边界条件。
是哪几家银行?具体什么时间段?
是持续触发还是间歇性?有没有金额上限?
还有最重要的,这个漏洞真的能在生产环境。
用真金白银走通吗?
他关掉了测试页面,清除了浏览记录。
然后像什么都没发生一样,重新打开那叠单据。
继续处理。但他的目光总会不由自主扫过建行的凭证。
扫过上面的日期和金额。大脑在飞速运转。
计算着千分之六的比例:一万块多六十,十万是六百。
一百万……
这个数字让他感到一阵轻微的眩晕。
他强迫自己停下来。不能急。不能出错。
这可能是系统的临时故障,明天就会被修复。
也可能早就有别人发现了,只是没人说。
或者,这根本就是个陷阱?
各种念头纷至沓来。他感到口干舌燥。
拿起桌上的水杯喝了一口,水已经凉了。
下班时,雨已经完全停了。天空洗过一样。
露出干净的湛蓝色,西边天际堆着橘红色晚霞。
空气清新冷冽。
吴惠健和他一起走出写字楼。
“晚上吃啥?”吴惠健问,掏出烟盒递给他一支。
江伟杰接过烟,就着吴惠健递的火点上。
深吸了一口。烟草辛辣的味道冲进肺里。
让他稍微镇定了一些。他看着街上来往的车流。
尾灯连成一条红色的光河。
“随便。”他说,吐出一口烟雾。
两人沿着人行道往前走,影子被夕阳拉得很长。
路过一家潮汕汤粉店时,吴惠健说:“就这儿吧。”
店里人不多,他们找了张靠墙的桌子坐下。
点了两份猪杂汤粉。等待的时候,吴惠健刷着手机。
江伟杰看着窗外。霞光正在褪去,天空的颜色一层层变深。
从橘红到绛紫,再到墨蓝。街灯一盏盏亮起来。
汤粉端上来了,热气腾腾,白色蒸汽模糊了视线。
吴惠健掰开一次性筷子,搅动着碗里的粉条。
江伟杰也拿起筷子。夹起一筷子粉,又放下。
蒸汽扑在脸上,湿湿热热的。
“怎么了?”吴惠健抬头看他,“魂不守舍的。”
江伟杰沉默了几秒。店里的灯光是暖黄色的。
照在油腻的桌面上。隔壁桌的客人喝汤声响很大。
他压低声音,身体微微前倾。
“有件事。”他说,“今天在公司发现的。”
吴惠健停下动作,看着他。
江伟杰用筷子在桌面上,蘸着一点洒出来的汤水。
写了一个数字:0.006。
然后,他简单把下午发现的事情,用最平直的语气叙述了一遍。
没有加任何修饰,没有渲染心跳加速的感觉。
只陈述事实:特定渠道,特定时间,多出千分之六。
测试环境流程可通。
吴惠健听着,脸上的表情从疑惑到惊讶。
再到一种凝固的专注。他嘴里的粉条忘了嚼。
等江伟杰说完,他盯着桌面上快要干涸的“0.006”。
看了很久。
店里的嘈杂声,碗筷碰撞声,电视里的本地新闻声。
似乎都被一层无形的膜隔开了。
“你确定?”吴惠健的声音也压得很低,带着一丝紧绷。
“单据我核对过。比例是固定的。”江伟杰说,“测试环境能走通提现流程。但真环境……还没试过。”
吴惠健端起桌上的茶杯,喝了一口。他的手很稳。
但放下杯子时,杯底和桌面接触,发出轻微的“咔”声。
“千分之六。”他重复了一遍这个数字,像是在咀嚼味道。
然后抬起眼,看着江伟杰。两人的目光在暖黄灯光下相遇。
都看到了对方眼底那簇被强行压住、却依旧窜动的火苗。
“明天,”吴惠健说,声音更低,几乎像耳语,“仔细看看。看看是不是真的。”
江伟杰点了点头。他没再说话,拿起筷子。
开始吃那碗已经有些凉了的汤粉。
粉条滑进胃里,没什么味道。
窗外的天完全黑透了。城市的灯光璀璨如星河。
车流依旧,人声依旧。但这寻常的夜晚。
仿佛有什么东西,在看不见的地方,悄然裂开了一道缝隙。
一道极其细微,却可能透进光的缝隙。

