第7章 数学的焰火——“可延迟到账”漏洞
缅北X园区的D栋原来是间废弃中学,黑板裂着缝,粉笔字还留着“距离高考还有36天”。此刻却成了“话术培训室”。
李朝阳被编在“狗推三组”,花名“白猪”。凌晨1:30,别的“猪仔”都去冲业绩了,他被单独留下“补课”——昨天他连续三次把“客户”聊到报警,业绩垫底。
“虎爷说了,再给你最后一次机会。”主管阿威用甩棍敲着讲台,“今晚背不完30页剧本,水牢自己游回去。”
灯管滋啦滋啦闪,李朝阳盯着黑板,脑子里却全是数字:
——今天23个“客户”,累计转账187万元,平均8.13万/人;
——系统要求30分钟内“分账”到18个三级卡;
——可实际到账时间平均47分钟,最快21分钟,最慢93分钟;
——为什么?
他天生对数字过敏。小时候家里开小卖部,他拿算盘当积木,把进货价倒背如流。送外卖那几年,他把整座城市的红绿灯周期背下来,写成27×27的矩阵,只为推算“最优送餐路径”。
现在,这套大脑自动把诈骗园区的“跑分”流程当成一道“动态规划题”。
今晚的“客户”是个上海阿姨,被骗48万。李朝阳故意把卡号写成“6228482112345678999”,最后三位999是假位,银行会强制退回。
他挨了20鞭,但成功把48万“冻”在通道里。
回到宿舍,肋骨疼得睡不着,他拿指甲在墙上刻时间轴:
T0:客户手机银行发出转账指令
T1:转出行走大小额系统或超级网银
T2:接收行验证卡号、户名、开户行
T3:返回“成功/失败”报文
T4:园区后台刷新“到账状态”
问题出在T2→T3:如果接收行发现“户名与卡号不符”,会挂起报文,最长可挂24小时。
但园区系统却提前把“成功”回执弹给“客户”,催促继续加码。
——这是“时间差”。
——时间差=窗口期。
——窗口期=生机。
老K,因赌球欠800万被卖进来。李朝阳在操场放风时,用馒头渣摆出“Fibonacci”数列,成功吸引了这位理工男。
“你想逃?”老K推了推碎了半边的眼镜。
“我想救人,也想自救。”李朝阳在地上画了一条时间轴,“如果我们能把‘失败’回执延迟30分钟,就能让受害人多30分钟醒悟,也给自己30分钟‘假业绩’,少挨打。”
老K愣了3秒,突然把馒头全塞进嘴里:“兄弟,你缺的是数据,我缺的是自由。干!”
园区“技术部”设在行政楼3层,门口24小时有枪兵。老K因为会写代码,被调去帮忙维护“跑分后台”,每周三可以进机房。
周三凌晨2点,李朝阳故意在厕所点燃一卷卫生纸,触发烟感。守卫跑向厕所,老K趁机把32G的U盘插进服务器,dump了最近7天的“订单+银行回执”日志。
日志文件4.3G,加密压缩。老K把文件切成1024片,伪装成“美女头像”jpg,通过内网QQ发给自己小号。
第二天放风,他把U盘吞进肚子,再拉出来,交给李朝阳。
——这是他们的“数据隧道”。
拿到日志后,李朝阳用3个晚上,把4.3G文本全读进大脑。
他在墙上画了一张“heat-map”:
横轴——时间(0-24h)
纵轴——银行名称(工行、农行、招行…)
颜色——到账延迟(绿≤30min,黄30-60min,红>60min)
规律浮现:
1.工行、建行23:00-02:00黄色最浅,延迟最低;
2.邮储、农商15:00-17:00红色最深,延迟最高;
3.招行、平安12:00-13:00出现“绿色尖峰”,但12:30突然全部变红。
李朝阳把招行12:30的312条日志单独拎出来,发现:
——所有“失败”回执都在12:30:45这一秒集中返回;
——而“成功”回执却提前45秒,在12:29:60批量出现。
“12:29:60?时间戳怎么会有60秒?”老K瞪大眼。
“说明系统造假,服务器把时间写死了。”李朝阳用指甲划出一条竖线,“如果我们能让‘失败’也卡在12:29:60这一帧,就能制造‘假成功’,把真失败隐藏30分钟。”
园区后台用MySQL,时间字段datetime默认精确到秒。老K找到一段Java代码:
```java
SimpleDateFormatdf=newSimpleDateFormat(yyyy-MM-ddHH:mm:ss
Stringts=at(newDate);
```
——服务器时间来自本地NTP,NTP可以伪造。
但园区网管把外网NTP全封了,只剩10.0.0.1这台“主时钟”。
老K提出:用区块链区块时间做“第三方时钟”。
——BTC平均10分钟一个块,时间戳不可回滚;
——他们把区块的hash前8位转成十进制,除以60,取余数,得到“偏移量”;
——再用偏移量去“回拨”服务器本地时间,最多回拨59秒。
只要让“失败”回执落在“回拨区间”,就能把时间写成12:29:60,而真实世界已经过去30分钟。
——他们给这个漏洞起名:Delay-59。
4月7日,周六,园区“月度冲刺”。虎爷放话:单日流水破5000万,全员加鸡腿;破不了,随机抽10个人“沉塘”。
李朝阳主动请缨:“给我50个客户,我冲500万。”
阿威狐疑,但还是分了50条“鱼”给他。
中午12:25,李朝阳把50张“接收卡”全部设为招行二类电子卡(单日限额1万),再把户名故意写成“朝日先”。
12:29:15,他在后台脚本里触发Delay-59,服务器时间被回拨42秒。
12:29:60,系统批量生成“成功”回执,实际银行正在排队验证。
客户看到“到账成功”,被引导继续加码。
——30分钟里,50人又追加了318万。
13:00,银行批量返回“户名不符”,资金原路退回。
但园区账面已经计入818万,李朝阳“业绩”第一。
虎爷大喜,亲自给他发“金牌狗推”勋章。
——Delay-59首战成功。
漏洞用多了,必然暴露。
4月15日,技术部发现“招行电子卡”异常退款率62%,而工行只有3%。网管在日志里看到大量12:29:60这种“幽灵时间”,立刻上报。
虎爷下令:彻查。
老K被反铐在机房,笔记本电脑砸得稀烂。
李朝阳被吊在操场,胸口烙铁印“狗”。
但两人早就做了“B计划”:
——把Delay-59拆成7个碎片,分别藏在7台不同服务器的cron脚本里;
——触发条件改为“收到指定短信验证码”,验证码就是外卖暗号“多加香菜”。
只要他们不主动触发,谁也找不到漏洞入口。
老K在挨打时,悄悄把区块链区块hash写进自己手臂:
0000000000000000000c9d7e4f3c4c4f3d8f2a5b6c1d8e0f7a8b9c0d1e2f3a4
——这串字符就是Delay-59的“钥匙”。
李朝阳用这串钥匙,把求救信息拆成32段,每段64字节,分别塞进32张“客户回执”的备注栏。
——银行备注栏最长140字符,支持Unicode;
——他们用Base64编码,把“园区坐标+被困人数+内部照片”切成碎片;
——再利用Delay-59,让32条回执在同一“伪造时间”生成,形成完整证据链。
4月20日12:30,32条“失败”回执一起发出,飞向32个不同的收款人——其实是32个国内志愿者。
——这就是第34章“把求救短视频发到TikTok”的技术原型。
事后复盘,李朝阳在墙上写下最后一行公式:
Δt=(T_fake–T_real)≤30min
当Δt被无限放大,黑暗就能多暴露30分钟;
当Δt被压缩到0,阳光就照进来。
他把公式命名为“朝阳恒等式”。
老K在遗言里说:“别把我们当数据,但请用数据救我们。”
李朝阳用指甲把这句话刻在肋骨上,像刻下一道数学定理。
——从此,他再也不怕做数学题,因为每一道公式,都可能是一条命。
灯泡滋啦一声又灭了,走廊传来发电机闷雷般的咳嗽。李朝阳被反铐在暖气片上,嘴里塞着抹布,血顺下巴滴在《诈骗话术30天速成》的封皮,红得刚好盖住标题里的“速”字。
阿威用甩棍敲他额头:“说,谁帮你改的服务器时间?”
李朝阳咧嘴笑,露出缺了半颗的门牙——那是昨晚他亲手磕的,为把一枚32G的TF卡藏进牙床。卡里是Delay-59的全部日志,也是32条“碎片求救”的母本。
“没人帮,我数学好。”他含混答。
阿威一棍砸在他左肩,正是上周枪伤的位置,血纱布瞬间殷透。李朝阳眼前一黑,却借疼痛在脑子里重新跑了一遍公式:
Δt=(T_back-T_now)≤1800s
——再挨30分钟,就能把下一批“失败回执”推迟到1:45,那时国内银行夜班清算切换,招行会二次挂账,资金至少再冻2小时。
2小时,足够林笙把纪录片素材剪成60秒短视频发出去。
他数着秒,把疼痛当节拍器,一秒一秒往下熬。
同一时刻,行政楼3层机房。老K被捆在42U机柜的立柱上,十指反扣,却仍能用脚尖敲击地面。
敲的是莫尔斯码——
-.--.-...-./...../-....-...--.--.-..
(YAVEISDELAYED)
他把Delay-59的“59”敲了59下,停3秒,再敲的区块高度7-3-7-4-9-9。
机房隔音棉很厚,可楼板有一条1cm裂缝,直通楼下女厕。
女厕里,越南籍模特阿阮正假装补妆,耳朵贴地。她本是“狗推七组”的语音诱饵,此刻却成了老K的“人形天线”。
阿阮把莫尔斯转写成0/1,用口红写在卫生巾背面,再卷进一次性手套,塞进内衣。
10分钟后,这副“手套”被丢进垃圾车,垃圾车每晚4点准时去食堂喂猪。
李朝阳的“数学焰火”与老K的“脚底电报”在垃圾车里完成交汇,像两条不对称的函数,终于找到唯一交点。
垃圾车司机是湖南少年阿鬼,19岁,因欠20万网贷被卖进来,白天铲猪粪,晚上运垃圾。
他欠李朝阳一个人情——上周他娘急性阑尾炎,园区“医务室”只给泻药,是李朝阳把仅剩的200元退烧贴塞给他,让他寄回家。
阿鬼捡起手套,用洗洁精洗掉油污,露出卫生巾上的0/1矩阵。
他不懂莫尔斯,但懂“二维码”。
他把0/1转成16×16黑白格,再用旧诺基亚6300拍成96×96bmp,插上数据线,通过早已破解的“缅甸小灵通”彩信网关,发到国内一张159开头的副号。
副号的持有者,是林笙。
凌晨4:29,林笙邮箱收到一封标题为“”的空白邮件,附件只有9KB的bmp。
她放大图片,用Python把0/1重新扫成字符串,得到64位hash:
0000000000000000000c9d7e4f3c4c4f3d8f2a5b6c1d8e0f7a8b9c0d1e2f3a4
——正是老K手臂上那串。
林笙瞬间明白:李朝阳把“求救信号”写进了区块链不可篡改的时间戳,也把“生”与“死”的锚点钉在这个区块。
她双手颤抖,把hash拆成两段,前32位做标题,后32位做正文,点击“发布微博”。
4:30,话题#求救#悄然上线,初始阅读量7。
5:00,阿威打累了,把李朝阳拖回水牢。水牢1.2米深,水面漂着死老鼠和香烟屁股,一脚踩下去,粪臭与血腥味混成胶状,堵在鼻腔里。
李朝阳靠着墙,默默计算:
——国内5点,缅甸3:30;
——招行2小时冻结窗口将在5:30关闭;
——只要5:15前再触发一次Delay-59,就能让32笔“失败”回执集体弹回,银行将强制退款,园区账面会瞬间蒸发818万;
——虎爷一定会暴怒,但也会把技术部所有人叫去查账,楼下守卫减半,是逃生的唯一缝隙。
他用脚趾在水面划了一道横线,像写下极限符号:
lim(Δt→1800)生存率=?
答案,必须自己算出来。
李朝阳闭上眼,把1-1-2-3-5-8的斐波那契数列当秒表,每数一个数字,就在墙上用指甲划一道。
划到89时,外面传来第一声枪响——虎爷发现818万不翼而飞,当场毙了技术主管。
划到144时,铁门被踹开,阿鬼满身是血冲进来:“哥,走!”
阿鬼手里攥着那张20万网贷的借条,已被血浸透,像一张作废的生死状。
李朝阳踉跄爬出水牢,左腿被铁丝划开10cm口子,却感觉不到疼。
他只知道:Δt终于撑满1800秒,公式成立。
——延迟到账,延迟的是死亡;
——提前到账,提前的是生机。
6:00,天边泛起蟹壳青。
国内微博热搜第一条:#求救#阅读1.2亿,讨论36万;
云南普洱边境,武警无人机起飞,航迹像一条长长的切线,直指X园区。
而园区里,李朝阳、老K、阿鬼、阿阮,四个人拖着一条13公里的逃亡路线,像四颗离散的点,正朝着唯一交点狂奔。
他们身后,虎爷的吉普车远光灯亮起,像一道垂直的渐近线,越来越近。
身前,是区块之后的新区块,,即将在6:10被挖出。
——那是区块链的“不可逆时钟”,也是他们的“生死下课铃”。
李朝阳把最后一口血沫吐掉,低声数:
“10、9、8……”
数字像焰火,在脑子里炸开。
——数学从未如此滚烫,也从未如此明亮。