AI

一次登录故障,让我真切感受到:AI 是一把双刃剑

作者头像 刘宇帅
1 0

前段时间,一位白帽子在对我们的系统做渗透测试时,不小心把单点登录系统里所有业务系统的注册数据全部删除了,导致我们所有业务系统都登录不了了。

开始是我自己排查的,我发现线上有一个 JS 加载报错了,以为是 JS 报错导致后续逻辑没有执行(因为后端服务没有任何报错)。我看这个 JS 是引用的三方 CDN 的资源,而且是一个统计类的 JS,所以就直接把它删了。

结果还是不行。

最后,还是借助 AI 解决的。在让 AI 分析问题的时候,它通过我们的日志服务发现当天早上有一个异常的请求,这个请求会删除线上系统的注册数据。

然后,AI 根据代码逻辑又给我生成了一个修复数据的 SQL,执行完,果然就恢复了。

现在我们在用 AI 快速完成需求、修复 bug,别人也可以用 AI 更快地发现系统的漏洞。这次遇到的是白帽子,如果换成不怀好意的人,后果可能就严重得多了。

之前看到美国因为安全问题,限制部分新模型开放的消息时,我还觉得是不是有点太敏感了。经历这段时间白帽子提出来的各种问题,真的有点理解这种担心了。

我们有些问题藏得很深,相关系统在线上跑了将近十年,我们此前一直没有发现。这段时间,白帽子在 AI 的帮助下,把它们一个个都找了出来。

所以,也把最近处理漏洞的一些发现整理出来,跟大家分享一下。

很多线索,就藏在前端 JS 里

这次白帽子发现的问题,最多的线索来自 JS 文件,比较重要的有三类:写死的 token、系统里的接口 URL,以及签名和加密逻辑。

以前这些 JS 经过压缩,有的还做了混淆,人去读、去梳理,比较费时间。现在借助 AI,理解代码、整理调用关系就容易多了。

其中一件事让我挺懵的:白帽子提出来的一些接口,明明是登录后才有权限进入的页面会调用的。他怎么知道这些地址?难道已经攻破我们的登录了?

仔细想了想,才想到这些地址是从前端 JS 里分析出来的。因为我们一些比较老的系统一直也没做过什么优化,所以很多应用的 JS 都打在一起了,页面虽然进不去,相关代码却已经直接下发到浏览器了。

写死在前端的敏感 token 就更直接了,发到浏览器里,就不能再当成秘密。签名和加密逻辑被看到,本身不一定是漏洞,但如果连密钥都放在前端,就很危险了。

另外,针对这样的后台应用的 JS 可以做一个小优化:拆分打包、按需加载,避免一开始就把全部业务代码发出去。但这也只能减少一次性暴露的信息,接口本身仍然要做好权限校验。

开源项目,更容易被顺着源码分析出问题

另一类比较多的问题,来自我们使用的开源项目。如果 AI 通过 JS 文件、接口特征识别出了项目,就可以结合公开源码,更有针对性地查找问题。

开头说的单点登录系统,问题就出在一个开源项目上。当时用的时候,我就感觉这个项目很复杂,用了好几年也没搞懂其中的一些逻辑。各种问题断断续续,一直想换,又考虑到成本一直没动。

结果出问题那天,我让 AI 帮我分析了一下,发现它的漏洞多得简直夸张。所以当天,我就让 AI 协助把整个框架全下掉了。

开源项目当然还可以用,但选型时不能只看功能能不能跑,后续的维护和安全更新也得跟上。

最让我有点难受的,是 PHP

这次被发现的不少漏洞,来自 PHP 项目,问题多得真的有点让人发麻。大部分集中在我们使用的一个开源 PHP 框架上,另外一些来自我们以前写的各种花式操作的代码。

PHP 是我的后端启蒙语言。以前大家选择它,很重要的原因就是开源项目多、语法灵活、开发效率高,很多需求拿一个现成项目改一改,就能做出来。

但语法灵活也需要约束,老框架和历史代码的问题更不能一直拖着,这次的经历让我对这些项目的安全性有了担忧。

另外,现在有 AI 帮忙写代码,PHP 容易上手、现成代码多带来的效率优势,正在被 AI 拉平。

所以我现在自己做项目,基本会选 Go:语言比较简单,部署比较省事,资源开销也比较符合我的需要。不过想到自己当初是从 PHP 入门的,还是会有点担心它以后的发展。

修漏洞的时候,AI 有时也会拒绝帮忙

我让 GPT、Claude 分析某个漏洞是否真实存在,有时会收到安全原因的拒绝。即使强调是在修自己的系统,源码也就在这里,还是会被拒绝。

GLM 目前在这方面的限制更宽松一些,所以不少问题最后是借助它来定位和解决的。

有些老系统,先转内网更现实

我们这次也没有完全按“提一个、修一个”的方式处理。公司创业初期留下来的一些 PHP 项目,现在还承担着重要的业务功能,要彻底解决其中一些问题,基本就需要整体重构。

但业务还在跑,重构又不是马上能完成的。所以,我们把大部分内部业务系统转到了内网,先收掉不必要的公网入口。这样能缩小暴露范围,不过权限控制和后续修复还是得继续做。

最后说回来,AI 写的代码也一样会有漏洞。代码生成越来越快,如果审核和测试跟不上,有问题的代码也可能更快地进入线上。

所以,内部系统能做网络隔离的,就尽量放在内网。必须放在公网的,从技术方案选型、代码审核,到上线后的安全防护,都得慎之又慎。

最后,祝好。

作者头像

刘宇帅

记录 AI 研发实践、系统架构,以及工作与生活中的思考。


暂无评论~

相关文章

AI Coding 搞了一年,我才认准真正的护城河是知识库

AI Coding 时代最大的护城河,不是模型,不是 Agent,也不是工作流。 而是知识库。 这是我折腾了一整年 AI Coding,到最后才慢慢看明白的事。 可一开始,我和大多数人一样,劲儿全使在另一个地方——工作流。 怎么把写 PRD、出方案、写代码、生成测试串成一条链路,让 AI 一步步往下跑。 工作流跑通了,下一个问题马上冒出来—— AI 跑这些命令的时候,到底读什么? 光给它代码,不够。 于是所有人又一窝蜂去搞知识库。研发在搞,产品在搞,业务也在搞。 可搞着搞着我发现一件事:几乎没人能说清,知识库到底该是什么。 先说说,知识库不该是什么 很多人理解的知识库,是"把代码翻

Loop Engineering:每篇文章都在讲,但没人告诉你怎么搭

最近 Loop Engineering 在持续刷屏。 公众号在刷,各种群里在讨论,我也看了好几篇文章。 每篇都有道理——五个组件、目标定义、古德哈特定律,逻辑很清晰,我都信了。 但看完之后有点空。 我的工作流该怎么 Loop 化?从哪起手?搭出来以后长什么样? 没一篇说清楚。 所以想聊聊我自己的理解,以及我们实际在做的事——我们团队搭了个叫 Talos 的系统,算是目前我见过最接近"生产级 Loop Engineering"的垂类实践。 Loop 其实只有两种形态 在我看来,Loop Engineering 这件事,放长了看只有两个终点。 第一个是通用智能 AI。 它足够强

从个人提速到团队提效:我们这半年的AI Coding工程化实践

去年开始,团队里每个人都用上 AI 写代码了。 按理说,效率该起飞了。 可折腾了大半年,我才慢慢看清:每个人都明显变强了,但团队的合力却没跟着强起来。 会用 AI 的人,效率飞涨。 用得浅的人,被甩在后面。 几十个开发,几十套打法——各自的 prompt 习惯、各自的提示词、各自摸索出的一套方法。 这本来不是坏事。 坏就坏在,大家的产出开始对不上了。 同一个功能,不同人让 AI 写出来的代码,风格能差出十万八千里。 某个同事摸到一个好用的技巧,群里截图一发,热闹两句,然后就沉底了。 下一个新人进来,还是从零开始踩。 文档呢?散在各个服务的 README 里,或者干脆躺在某个人的电脑里。 遇到跨

AI工作流跑不起来,问题可能出在PRD

前面几篇,聊了团队怎么搭 AI 工作流、怎么建知识库。 今天聊聊 AI 在 PRD 编写和质量保障上,我们做了些什么。 其实这块从一开始就在工作流里。只是在开始的MVP版本里,核心全压在开发环节。 等大家真用起来,一个问题立马浮出水面: PRD 质量一般,工作流出来的技术方案,质量自然也上不去。 道理特别朴素:垃圾进,垃圾出。 源头的 PRD 含糊,后面 AI 再能干,也只是替你把这份含糊"发扬光大"。 所以我决定还是要治理一下这个源头。 第一步:先给 PRD 做个体检 我做的第一件事,是一个 PRD 质量检测 skill。 注意,它不碰业务逻辑,只做"规范层&q

AI Coding 跑顺了,真正的难关才开始

最近这几天,我又开始焦虑了。 原因是,我突然意识到一件事。 已经有一阵子,没人反馈 Zeus 的问题了。 Zeus 是我们团队做的一套 AI Coding 工具体系。 说白了,就是想让 AI 把"写代码"这件事,从头到尾接过去。 用了两个多月,大家从一开始的别扭、吐槽、不信任,慢慢变成了—— 用得挺顺。 顺到,没人抱怨了。 按理说,这是天大的好事。 可那一刻,我心里咯噔一下。 因为"没人提问题",有两种可能:一种是真的没问题了,另一种是,大家已经看不见问题了。 我估计,是后者。 浮在水面上的,是看得见的成绩 这半年,团队是真的变样了。 Zeus、Zeus