屏幕上的日志条目一行行展开,记录着那个深夜发生的每一个细节。路容的目光锁定在“modify_file”操作后的几行——那里显示了文件大小、校验和的变化,以及一个短暂开启又关闭的临时脚本进程。她的手指在键盘上敲击,打开一个新的编程界面。夜色已深,窗外的城市灯火渐稀,只有她的房间还亮着灯。她需要写一个程序,模拟出那种特定的修改模式,让证据无可辩驳。时间在代码的字符间流逝,她的眼睛因专注而微微发亮,嘴角第一次扬起了一丝冰冷的弧度。
---
**凌晨一点十七分**
路容的出租屋里,只有笔记本电脑的风扇声和键盘敲击声。
她盯着“文件操作详情”日志里的那几行记录:
```
22:49:11,ip:10.10.10.12,用户:admin_wang,操作:modify_file,对象:/data/blueplan/cleaned/blueplan_data_1103_final.csv
-文件大小变化:从1,247,583字节变为1,247,612字节(+29字节)
-md5校验和变化:从8f3c7a2e1b9d5f4a6c0e8b7d2a1c3f5e变为4a6c0e8b7d2a1c3f5e8f3c7a2e1b9d5f4
-检测到临时脚本进程:/tmp/check_integrity_script.sh(pid:28473)运行时长:2.1秒
-脚本内容摘要:包含“sed-i's/,\“\\d{4}-\\d{2}-\\d{2}\“/,\“2023-11-03\“/g'”等正则替换操作
```
路容的手指在触摸板上滑动,将这几行日志截图保存。她的呼吸很轻,房间里能听到远处街道上偶尔驶过的夜班公交车引擎声。窗外的路灯透过没拉严实的窗帘缝隙,在地板上投下一道细长的光带。空气里有灰尘和旧书的气味,还有她刚才泡的速溶咖啡已经凉透的酸涩味道。
“完整性校验操作?”她低声自语,声音在寂静的房间里显得格外清晰。
王总监在会议上说,她只是“例行检查数据完整性”。但日志显示,那个临时脚本里包含的是正则替换命令——这根本不是校验,这是修改。
路容打开文本编辑器,开始编写代码。
她的手指在键盘上飞舞,敲击声密集而有节奏。屏幕上,python代码一行行出现。她先定义了一个函数,模拟那个正则替换操作:将所有格式为“yyyy-mm-dd”的日期字段,统一替换成“2023-11-03”。然后她写另一个函数,计算替换前后文件的md5校验和。
“但这样还不够。”她喃喃道。
王总监展示的“污染样本”里,不仅仅是日期被修改了。路容调出会议时拍下的那张污染数据截图——那是她偷偷用手机拍的,虽然模糊,但关键字段还能辨认。
截图显示,在“用户行为序列”字段里,原本应该是“login→browse→add_to_cart→checkout”这样的标准序列,变成了“login→browse→add_to_cart→checkout→login→browse”。重复了。
在“交易金额”字段,原本的数值被乘以了一个随机系数,范围在0.95到1.05之间。
在“地理位置”字段,部分坐标的小数点后位数被截断。
这不是简单的数据污染。这是精心设计的、模拟自然数据损坏模式的修改。目的是让污染看起来像是清洗过程中的技术错误,而不是人为破坏。
路容闭上眼睛,手指按在太阳穴上。
她能想象出那个场景:上周五晚上十点四十九分,王总监坐在自己的办公室里,电脑屏幕亮着。她打开终端,登录管理员账户,解锁路容已经清洗完成并锁定的文件。然后她运行一个脚本——那个/tmp/check_integrity_script.sh——脚本按照预设的规则,对文件进行“污染”。完成后,她重新锁定文件,退出登录。
然后,她删除了操作日志中关于这个脚本运行的具体内容记录,只留下“modify_file”这个笼统的操作条目。在提供给路容的剪辑版日志里,她甚至把这个条目也删掉了。
“但你没删干净。”路容睁开眼睛,目光重新聚焦在屏幕上。
备份系统里的完整日志,还保留着脚本进程的pid、运行时长,甚至脚本内容摘要。虽然看不到完整脚本代码,但这些摘要已经足够。
路容开始编写第二个模拟程序。
这一次,她不仅要模拟日期替换,还要模拟用户行为序列的重复、交易金额的随机扰动、地理坐标的截断。她根据污染样本中观察到的模式,推断出可能的算法:
-用户行为序列重复:每隔100行数据,随机选择一行,将其行为序列复制并追加到末尾。
-交易金额扰动:对每个金额乘以(0.95+random()*0.1),保留两位小数。
-地理坐标截断:将经纬度坐标的小数部分截断到三位。
她写得很专注,时间在代码的字符间流逝。窗外的天空从深黑渐渐转为墨蓝,远处传来第一班地铁驶过轨道的声音,沉闷而有节奏。房间里越来越冷,她起身披了件外套,手指因为长时间敲击键盘而有些僵硬。
**凌晨三点四十二分**
模拟程序写完了。
路容从自己的备份里调出上周五清洗完成的数据文件——这是她习惯性保留的本地副本。她用自己编写的模拟程序对这个干净文件进行处理。
运行。
进度条在屏幕上缓慢移动。她的心跳有点快,喉咙发干。她拿起桌上那杯凉透的咖啡,喝了一口,苦涩的味道在舌尖蔓延。
程序运行完毕。
她打开处理后的文件,随机抽取几行数据,与王总监展示的污染样本进行对比。
第一行:日期字段,从“2023-10-28”变成了“2023-11-03”。匹配。
第二行:用户行为序列,从“login→browse→purchase”变成了“login→browse→purchase→login→browse”。匹配。
第三行:交易金额,从“149.99”变成了“142.49”(149.99*0.95)。匹配。
第四行:地理坐标,从“116.407526,39.904030”变成了“116.407,39.904”。匹配。
路容靠在椅背上,长长地吐出一口气。
白色的水汽在冰冷的空气里凝结成雾。她的手指在颤抖,但这次不是因为恐惧或应激障碍,而是因为兴奋。一种冰冷的、锋利的兴奋。
她找到了。完美的证据链。
**凌晨四点十五分**
路容开始整理报告。
她打开一个新的文档,标题是“关于blueplan_data_1103_final.csv文件数据异常的技术分析报告”。她没有署名,没有日期,文档里只有事实。
第一页:问题描述。简述文件在清洗完成后出现数据污染的情况。
第二页:现有证据。附上王总监提供的剪辑版操作日志截图,用红框标出缺失的时间段。
第三页:完整日志发现。附上从备份系统获取的完整日志截图,重点标出:
-时间:22:47-22:50
-ip地址:10.10.10.12(王总监办公室)
-用户:admin_wang(王总监管理员账户)
-操作序列:login→unlock_file→modify_file→lock_file→logout
-检测到的临时脚本:/tmp/check_integrity_script.sh