这个案例在程序员圈子里面引起了相当多的讨论。主角是一家知名互联网公司的首席技术官,技术背景非常强,早年也是从一线开发一路做上来的。这位CTO有一个所有程序员都有的习惯,就是写代码和提交代码的时候不太注意元数据的清理。他在GitHub上托管了好几个开源项目和个人的技术演示项目,都是公开仓库。这些仓库的提交历史里面包含了他每一次git commit的详细信息,包括提交人姓名、提交邮箱、提交时间。但还有一个经常被忽略的元数据被一并提交上去了,那就是提交者本机系统的时区设置信息和一些测试代码中嵌入的坐标数据。在这位CTO的某个个人项目中,有一段给他自己做测试用的地理位置模拟代码,里面直接写了一个包含经纬度坐标的测试用例,坐标来源是他为了测试功能随手写上去的家庭住址附近的经纬度。这个坐标被写死在了测试用例的代码里,然后他提交到公开的GitHub仓库了。提交之后他自己也没有再回头去看过那个文件,因为那只是个测试文件不参与核心功能。很多程序员都有类似的习惯,写测试代码的时候随手填一个真实的地址进去测试功能,提交的时候忘了检查或者觉得无所谓就推上去了。有人发现了这个坐标。一个专门做开源情报的爱好者,他有一项业余爱好就是从公开的代码仓库里挖掘各种附带的数据信息。他扫描到了这位CTO的公开仓库,把所有提交历史扒下来做了一个分析。在其中一个老版本的文件里看到了那段包含经纬度坐标的测试代码。他把坐标提取出来输入Google地图一看,正好落在一座一线城市的高档住宅小区里面,精确到具体的楼栋区域。再把这个小区的定位跟公开的房产交易信息做一个交叉验证,就能锁定到非常具体的居住范围。这个坐标数据被这位爱好者发布到了一些技术论坛上公开讨论,迅速在圈子里传播开来。虽然没有人去恶意利用这个信息去做违法的事,但这种开源信息一旦在网上公开,结果就不可控了。任何有心人拿到这个坐标信息,都能在地图上找到CTO家庭住址的精准位置。
这条链路的每一个环节都值得我们好好复盘。第一个环节是敏感数据被写入了代码。这位CTO在开发一个跟地图相关的个人项目时,写了一段测试代码来验证坐标参数对功能的影响。他随手把自家附近的经纬度坐标作为测试值写在了测试用例里面。经纬度坐标不是加密的也不是打码的,就是明文的两位数加小数点后五位那样的格式,直接硬编码在测试代码中。写完以后他没有做二次审查就直接git add和git commit了,然后push到了GitHub的公开仓库。第二个环节是数据被发布到公开平台。Git仓库的提交历史是不可逆地记录了一切操作痕迹,包括每一次提交的时间、提交的内容变更、提交者信息。就算后来发现这个文件有问题想要删除或者修改,光在最新的分支里删掉是不够的,Git的历史里面还完整保留着所有旧版本的文件内容。除非你花大力气做git历史重写和强制推送来清理历史记录,但很多人在提交后发现数据泄露的时候根本不记得去清理历史记录。第三个环节是数据被自动化扫描发现了。这位开源情报爱好者使用了一套自己写的自动化仓库扫描工具,定期对目标人物可能拥有的GitHub仓库做全量克隆,然后对所有文件包括所有历史版本中的所有提交做全文本检索,查找是否包含符合经纬度坐标格式的字符串模式。通过这个方式他在CTO仓库的旧版本文件中匹配到了这组坐标。他没有破坏任何系统也没有入侵任何服务器,所有操作都是基于公开可访问的数据做的。第四个环节是数据被扩散到更广泛的受众。这位爱好者把收集到的信息发到了技术社区的讨论帖里,虽然是当作一个技术趣闻来分享的,但坐标信息在帖子里是明明白白公开的。帖子的传播量超出了他的预期,被多次转载和引用。等到CTO本人知道这个消息的时候,他的家庭住址的经纬度坐标已经在一个相当广泛的网络圈子里传开了。
这件事给所有从事软件开发和互联网行业的技术人员提了一个非常具体的操作层面的警示。Git提交历史中的数据清理问题是一个长期被忽视的安全死角。程序员在日常编码中很容易把一些敏感数据以明文形式写入代码,比如测试用的IP地址、数据库连接字符串、API密钥、加密证书、还有像案例中出现的坐标数据。这些东西一旦被提交到公开仓库,想彻底清除就非常困难了,因为Git会把每一次提交的完整快照永久保存在历史记录中。两个层面的建议。第一个层面是针对个人开发者的。在将代码提交到公开仓库之前,建议对所有的代码变更做一次敏感信息检查,特别是测试文件、配置文件、示例代码。使用git diff或者相关的代码审查工具,逐行过一遍即将提交的内容,确认没有包含任何个人或者企业的敏感数据。如果已经不小心提交了敏感数据到公开仓库,要立即采取补救措施。简单的做法是在新版本中删除敏感信息然后重新提交,但这还不够,因为历史版本中还保留着。需要做git历史重写配合强制推送到远程仓库,把所有历史版本中包含敏感内容的提交都清除掉。第二个层面是针对企业的。企业IT部门的代码管理策略应该包含强制性的敏感信息扫描步骤。在代码进入CI流水线之前自动运行敏感信息检测工具,扫描是否有常见的敏感数据模式被包含在提交代码中。同时要教育开发团队养成提交前自查的好习惯,特别是涉及个人位置、身份信息、企业内网地址、生产环境凭证这些数据,绝对不要以测试数据的名义写入代码。程序员一个不经意的git commit,可能就把自己家的门牌号永久记录在了互联网的代码海洋中,而你现在可能还毫不知情。






