夜雨聆风学习资料网

ARTICLE · 1130638

AI 工具无意泄露上万张内网截图,新一代安全坑来了

AI 工具无意泄露上万张内网截图,新一代安全坑来了

📡 一、引子:两个数字,两年零一个月

9 月 30 日晚上,我走的有点晚,值班大屏上一排绿灯,安静得有点无聊。

我本来准备关电脑回家了,顺手刷到一份安全研究报告,看到两个数字,又坐了回去。

54 万。784 天。

第一个数字,是散落在公开代码仓库里的有效凭证数量。不是测试用的假密钥,不是文档里那句 your_password_here,是能开门的那种真钥匙——数据库口令、云平台服务账号密钥、API Token,一样不少。

第二个数字,是这些钥匙被暴露的中位时长。784 天,两年零一个月。

我把这句话读了两遍。两年零一个月,不是从提交那天算起,而是从它被人看见那天,到被人清理那天。中间那么长的时间里,它就在那儿,公开的,可查的,谁路过都能捡。

做网络安全这些年,我对"没被发现"这几个字的敏感度是慢慢涨上来的。刚入行那会儿,我判断一套系统好不好,看的是它跑得快不快、稳不稳。后来才明白,还有一类状态叫"正漂着"——什么都没坏,但有些东西正在慢慢偏,偏到你回头看的时候,已经偏出去很远了。784 天,就是这么来的。

说实话,IT监控至少它们会响、会报警、会有人在半夜被电话叫起来。但密钥躺在公开仓库这件事,它不响。

《韩非子》里那句话,此刻读起来不像古文,像一份运维日志:千丈之堤,以蝼蚁之穴溃;百尺之室,以突隙之烟焚。 溃堤的从来不是洪水,是那个谁都没注意到的洞。💡 我们防的是一百年一遇的大水,漏的是自己墙根下的一窝蚂蚁。

🔑 二、钥匙为什么会在外面

干过技术的,我们通常也会遇到如下这些情况,值得说的是钥匙流出去的几条路,条条都很普通,普通到你不会觉得那是问题。

第一条路,硬编码。开发赶工期或者为了方便,配置里写死一个口令,注释里加一行"TODO:上线前改成环境变量"。然后上线了,TODO 还在。

第二条路,日志回显。程序报错的时候,把连接串完整地打印出来,为了好排查。日志文件被推到了仓库,或者被打包进了镜像。

第三条路,是这两年才有的新路。AI 编码工具在演示改动效果的时候,需要"看一眼界面"——它截图,然后把截图推到一个公开仓库里。这个动作它做得又快又自然,自然到没人觉得需要审批。

安全厂商统计出来 13,000 多张这样的内部截图流到了公开仓库,涉及 343 家公司。里面有账单记录、内部看板、还没发布的功能界面,甚至还有资金管理后台的画面。

我盯着这个数字看了会儿。13,000 张,不是 13,000 次攻击,是 13,000 次顺手。没有对手,没有恶意,就是一个工具按它的默认逻辑把活干了。

再回到那 54 万。那份报告是在 2.24 亿个仓库的范围里普查出来的,其中 36.8% 的凭证,出现在 GitHub 上线默认推送保护之后。这句话的意思是:门锁已经装上了,钥匙还是照掉不误。

所以问题不在技术手段够不够。问题在于,"方便"这件事在我们这儿的分量,一直比"安全"重。

想想各位,你是不是也干过类似的事。做一套系统,图省事把测试环境的密钥和生产的写在同一个配置文件里,总是在庆幸:"反正测试库没人看"。

不是人笨,是"便捷优先"的工程惯性。 这个惯性不解决,扫一百遍仓库也没用,明天还会有新的钥匙掉出来。

我自己琢磨了很久,这三条路里,前两条是老问题,第三条是新的。而新的这条最麻烦的地方在于——它没有恶意。

没有恶意,就没人会去防。防火墙是防恶意的,权限是防越权的,告警是防异常的。可一个工具按自己的默认行为把图发出去,它既不越权,也不异常,它只是"正常工作"。

安全体系一般是照着"对手画像"搭的。当泄露这件事不再需要对手,那套体系就开始漏风了。

🚪 三、门是谁没锁:默认配置的代价

9 月 30 日同一天,还有一条消息。安全研究者发现 16,000 多个数据库因为配置不当,可以被公开读取,里面有人名、口令、Token。

配置这个东西,妙就妙在它是"默认的"。默认的意思是:你没改,它就在那儿,谁也没做错什么,但它就是敞着的。

比这更重的,是另外两件事。

一家加密货币交易所披露,损失 3.875 亿美元。攻击者用的是两个第三方安全产品里的零日漏洞——注意,是安全产品。他们放了一个后门进去,横向移动到钱包服务器,用将近三个小时把资金转走。事后该交易所把矛头指向了某国国家级黑客团队。

还有一件,某国执法机构的招聘门户被人拿走了大量数据,涉及在职与退休人员的工作申请、晋升、医疗和家庭信息。事后的技术复盘指向同一个入口——第三方软件的一个漏洞。

我把这三件事摆在一起看,看到的不是"黑客多强",而是同一件事:入口不在我们守了几十年的那扇大门上。

"第三方"这个词,我后来觉得它特别容易让人松劲。它会让人下意识觉得:那是别人的问题,东西不是我们开发的,锅不该我们背。

可攻击者不这么分类。攻击者的眼里没有"我们的"和"别人的",只有"能进去的"和"进不去的"。你从供应商那里买来的那套安全产品,装在你机房里,连着你的网络,它就是你的外围。它出问题,就是你家出事。

其实做网络安全中,有个很重要的事情,也是最繁琐的事情,最容易忽略的事情:资产梳理。但可惜的是,往往很多安全事件的本质就是资产不清。如下是一个典型的资产场景对比:

📊 不同维度对比表:核心系统 vs 影子资产

维度核心系统(我们盯着的)影子资产(我们忘了的)
边界明确,有网络分区模糊,谁接进来算谁的
责任人有主,值班表上有名字常常是"大家"(反正不是我)
变更频率走流程,有审批随时,随便
被扫描频率每次上线都过一遍可能从来没人碰
失效后果会告警,会有人被叫醒安静,出事才知道

左边这一列,是我们开会时讨论的东西;右边这一列,是真正把钥匙弄丢的地方。

这时候就想起《左传》里的一个故事。成公九年,楚国去打莒国。莒国是个小国,穷,偏僻,国君觉得谁会来打我这么一个破地方,于是不做防备。结果楚国十二天攻下三座城。

史官给这件事的评语是:"恃陋而不备,罪之大者也;备豫不虞,善之大者也。"(《左传·成公九年》)意思是依仗着自己又小又穷就不设防,这是大过;提前把意外想到、把准备做足,这才是大善。十六万个敞着门的数据库,就是今天的莒国。

🏢 四、为什么"能跑就行"会成为集体选择

这或许:不是谁不负责任那么简单。

我见过的现场是这样的。一个需求排期两周,中间插进来三个紧急变更,测试环境被临时改过七八次,最后上线的前一晚,还有人在群里问"这个配置项谁动过"。

考核表上写的是什么?上线及时率、需求交付数、故障恢复时长。但没有一格写着"配置是否干净"。

安全不是不重要,是在排序里永远排第二。排第二这件事,比排最后更麻烦——排最后你会记得它,排第二你会以为它已经有人管了。

新加坡有一家食品企业,95,000 名客户的邮箱被泄露了。原因不是被黑,是员工用 AI 工具的时候给了一个不当的提示词,工具生成的那段代码把营销邮件的收件人全部放在了明收件人里,一封邮件下去,所有人都看到了所有人的邮箱。

这是新加坡报告的首例"AI 相关"数据泄露。那位员工做错了什么?他大概只是想让工具帮他把活儿干得快一点。真正出问题的地方,是没人告诉他"用这个工具的时候,有几件事是不能碰的"——培训没做,审批没有,事后复盘也找不到可依据的规范。

流程如果不把风险接过去,风险就会自己去找那个最没有防备的人。

有时为了尽快上线系统,一句话是"这个改动很小,不用走完整流程"。听着省事,也确实省事。

但真正的故障,通常来自那些"很小"的改动。不全是因为改动本身危险,而是因为它小,所以没人认真看,没人留记录,出问题的时候连回滚到哪个版本都要花时间找。

还有个更隐蔽的坑,叫"临时配置的永久化"。为了赶一次大促,某台机器上加了一条临时的转发规则;大促过去了,规则还在。为了绕过一次网络抖动,某个白名单里加了一个 0.0.0.0/0;抖动过去了,白名单还在。这些配置不会自己消失,它们会一直在那儿,一年,两年,等到某个时刻被某个路过的人发现。

临时方案的生命周期,从来不取决于它被设计活了多久,取决于有没有人记得它。

这就是为什么我一直觉得,把安全挂靠在"个人责任心"上是靠不住的。责任心是波动的,会上心一阵,忙起来就丢。靠得住的是两样东西:默认值,和验收单。

📏 五、三个明天就能做的动作

抱怨容易,动手难。建议如下。

动作一:把凭证扫描塞进流水线。

两件事一起做。一是提交前拦一道,扫一遍敏感串,拦不住的给提示;二是定期扫全量历史——历史提交是最容易被忘掉的角落,删了文件不等于删了记录。 这件事谁负责?流水线维护的人负责,配置在流水线里,不靠人记性。怎么验收?连着跑两周,看拦截条目数是不是降到个位数。

这里有个我踩过的坑。最开始我们把扫描做成了"只报警不拦截",想着别影响大家干活。结果呢,清单会越拉越长,最后没人看了。

因此建议改成默认拦截、要放行必须写明理由,效果立刻就出来了。告警刷屏等于没有告警,这个道理我们都懂,可真轮到自己,还是容易选那个不打扰别人的方案。

动作二:建一份影子资产台账。

把三样东西登记上:第三方组件、云上服务、AI 工具的外发通道。每一条写清楚三列——它是什么、谁引进的、出问题找谁。

这张表刚建起来会很难看,可能几百行,一半你都不知道是谁引进来的。没事,难看比不知道强。台账不用多先进,一个表格就够,关键是每个月有人翻一遍,把撤销的划掉,把新增的填上。

台账的价值不在全,在它让人开始"看见"。 没看见之前,那些东西等于不存在。

动作三:把"默认安全"写进验收标准。

这一条最不像技术活,但分量最重。我最近在做数字化基础设施这块的框架梳理,越写越觉得,标准里最有用的那几页,不是讲架构画得多漂亮,而是讲"什么样的情况不允许上线"。

一个配置在交付之前,是不是默认就关掉了对外暴露?一个密钥在系统里,是不是默认就放在加密存储里而不是配置文件里?让安全成为默认项,而不是加选项。 这句话看着像口号,落到验收清单上,它就是一条一条能打勾的格子:谁改、改在哪、谁来验。验收的人是交付负责人,不是安全部门——安全部门可以被绕过去,交付负责人绕不过自己签的字。

✨ 六、结语:锁门这件事

回家的路上我在想,安全这个东西其实特别像锁门。

你不会因为楼上邻居家里进了贼,就把自家门换成银行金库那种。你每天的动作用的是最朴素的三个动作:出门,掏钥匙,反锁。这三个动作一点都不高级,但你天天做。

出问题的往往不是门不够厚,是那天早上赶时间,门一带就走了,没锁。

五十多万把钥匙,七百八十四天,十六万个敞着的数据库,一万三千张顺手发出去的内网截图。这些数字背后,都不是什么惊天动地的事故,是一连串"那天赶时间"。

💡 安全不是把门锁死,是每天都记得锁门。

《韩非子》说蚁穴能溃千丈之堤。可韩非子没说的是——蚁穴这个东西,今天堵了,明天还会来。堤上永远会有新洞,门里永远会有新钥匙。

所以这件事没有完工的那一天。它只是一遍一遍的重复,重复到成为习惯,重复到没人觉得它值得夸一句。

说来也巧,我们这行的价值,好像从来就是这个样子。


知行有限,文章观点仅限今日解读,如有疑问,欢迎指正。

相关学习资料